3.7.python_web模凷的簡單應用實例

環境: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
...

 自動打開了搜索結果中的鏈接, 成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值