環境:python 3.10.3_amd64 + Win10
0.不同模凷的簡介
0.1.webbrowser
這个模凷最常用的是它的open()函數, 作用是啓用默認瀏覽器打開參數指定的網頁鏈接, 成功打開後返回True, 否則返回False:
>>> webbrowser.open('https://baidu.com/')
True
0.2.requests
requests模凷是常用的第三方庫, 可使用pip安裝.
requests.get()函數, 作用是請求參數指定的頁面, 並返回一个Response對象:
>>> res = requests.get('http://www.python.org/')
>>> type(res)
<class 'requests.models.Response'>
Response對象的status_code屬性表示請求狀態, 200表示成功請求, 與http協議的狀態代碼一致, 也可與requests模凷預設的成功狀態碼codes.ok對比:
>>> res.status_code == 200
True
>>> res.status_code == requests.codes.ok
True
resquest庫有現成的異常處理函數, 可直接調用, 在請求失敗時拋出異常終止程序:
res.raise_for_status()
當然, 如果你覺得請求失敗不影响後續代碼的執行, 可以將其包裹在try/except語句中, 避免程序崩潰, 如下:
...
try:
res.raise_for_status()
except Exception as err:
print(f'請求失敗:{err}')
...
Response對象的text屬性即請求成功的頁面的html文本, 一个大型字符串對象, 可以用len()函數顯示其字符數, 或者調用beautifulsoup庫的解析函數進行解析:
>>> print(res.text[:100])
'<!doctype html>\n<!--[if lt IE 7]> ... lass="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> ...'
>>> len(res.text)
50850
Response對象的iter_content()方法作用是按參數指定的大小將對象切凷, 可在下載時, 結合for循環使用, 以避免程序佔用過大的內存, 如保存python官網首頁的操作, 注意, 待寫入的文件需以二進制格式寫模式打開, 'wb', 避免下載的文件出現亂碼等格式問題:
...
>>> File_store = open("python_org.txt", "wb")
>>> for chunk in res.iter_content(20000):
File_store.write(chunk)
20000
20000
10850
0.3.beautifulsoup4
1.命令行喚起瀏覽器搜索
1.0.準備:
已安裝第三方庫beautifulsoup4和requests, 搜索引擎選擇的是bing, 不用百度的原因是百度搜索結果的首頁廣告太多, bing要少得多, 瀏覽器是系統默認的火狐.
1.1.查看bing的url語法:
隨便輸入个詞兒, 比如"將軍去庫存"測試一下bing的語法, 在瀏覽器的網址欄, 如下圖:
對比百度的是wd=[關鍵詞].
可以發現bing的關鍵詞跟在 q= 後面, 除去search?和q=, 其它的都是冗餘信息, 所以預設URL爲:
https://cn.bing.com/search?q=
1.2. 分析html頁面:
調用火狐的開發者工具, 按<F12>鍵開啓, 再按一下關閉 , 如下圖:
點一下紅圈中的箭頭, 在網頁移動鼠標到鏈接(左側)上, 對應的html文檔(右側)標籤會高亮顯示, 記住標籤名, 比如這裡, 兩个標籤的url是一致的, 都可以訪問到新鏈接, 我這裡用的是<a class=...標籤:
<a class='sh_favicon' ... href='http://....'
<h2>
<a ... href='http://.....'>...</a>
</h2>
1.3.解析出鏈接並打開:
使用bs4庫的Beau...()函數, 第一个參數是Response對象的文本, 第二个參數是解析器, html.parser是python自帶的標準庫解析器.
soup = bs4.BeautifulSoup(res.text, features="html.parser") # 創建soup對象
調用soup對象的select()方法, 返回所有符合 屬性class爲'sh_favicon'的<a>標籤對象(Tag)的列表.
使用for循環, 調用Tag對象的get()方法, 參數爲'href', 返回url字符串;最後調用標準庫webbrowser的open()函數, 在系統默認瀏覽器中打開鏈接.
不知道是我的網絡還是bing/火狐的問題, 在requests請求狀態是ok的情況下, 卻檢索不到結果, 所以設置了一个if語句檢查結果數量.
1.4.完整代碼如下:
# 在命令行輸入關鍵詞, 自動打開瀏覽器查詢, 並打開搜索结果的首页所有链接
# 搜索引擎是bing
import sys
import webbrowser # 這兩个是標準庫
import bs4
import requests # 這倆需用pip安裝後使用
url_bing_search = "https://cn.bing.com/search?q="
# 很奇怪bing搜索有概率無結果, 但請求狀態是ok的, 所以設立死循環
while True:
if len(sys.argv) > 1:
# 拼接命令行參數成url, 調用_req_.get(url)請求搜索頁
res = requests.get(url_bing_search + "+".join(sys.argv[1:]))
res.raise_for_status() # 檢查請求狀態
print(">>>>搜索中>>>>")
# 獲取搜索結果中的鏈接
soup = bs4.BeautifulSoup(res.text, features="html.parser") # 創建soup對象
# 查看網頁html格式找到新鏈接的匹配模式
ele_links = soup.select("a[class='sh_favicon']")
# 檢查搜索結果的數量
if len(ele_links):
print(f">>>>查詢到{len(ele_links)}个結果, 依次打開!>>>>")
break # 查詢到結果, 跳出死循環
else:
print("----網絡不穩定, 重新搜索中----")
else:
sys.exit("----搜索內容不能爲空!!!----")
for link in ele_links:
print(f'>>>>已打開網頁: {link.get("href")}')
webbrowser.open(link.get("href"))
打開終端測試一下, 缺少參數時提示:
C:\Users\GT\Desktop\bin>py bing_search.py
----搜索內容不能爲空!!!----
C:\Users\GT\Desktop\bin>py bing_search.py 猫屎咖啡
>>>>搜索中>>>>
----網絡不穩定, 重新搜索中----
>>>>搜索中>>>>
----網絡不穩定, 重新搜索中----
>>>>搜索中>>>>
>>>>查詢到10个結果, 依次打開!>>>>
>>>>已打開網頁: https://baike.baidu.com/item/麝香猫咖啡/2754383
>>>>已打開網頁: https://www.coffee.cn/article/35
>>>>已打開網頁: https://www.coffee.cn/topic/8
>>>>已打開網頁: https://new.qq.com/omn/20210912/20210912A0B38C00.html
...
自動打開了搜索結果中的鏈接, 成功!