推薦一款小眾且好用的 Python 爬蟲庫
??本文轉(zhuǎn)載自公眾號【AirPython】,詳情可以點擊上方卡片,關(guān)注該公眾號,獲取更多好文推薦。

1. 前言
今天給大家推薦一款小眾輕量級的爬蟲庫:MechanicalSoup
MechanicalSoup,也是一款爬蟲神器!它使用純 Python 開發(fā),底層基于 Beautiful Soup 和 Requests,實現(xiàn)網(wǎng)頁自動化及數(shù)據(jù)爬取
項目地址:
https://github.com/MechanicalSoup/MechanicalSoup
2. 安裝及常見用法
首先安裝依賴庫
# 安裝依賴庫
pip3 install MechanicalSoup
常見操作如下:
2-1 實例化瀏覽器對象
使用 mechanicalsoup 內(nèi)置的 StatefulBrowser() 方法可以實例化一個瀏覽器對象
import mechanicalsoup
# 實例化瀏覽器對象
browser = mechanicalsoup.StatefulBrowser(user_agent='MechanicalSoup')
PS:實例化的同時,參數(shù)可以執(zhí)行 User Agent 及數(shù)據(jù)解析器,默認(rèn)解析器為 lxml
2-2 打開網(wǎng)站及返回值
使用瀏覽器實例對象的 open(url) 即可以打開一個網(wǎng)頁,返回值類型為:requests.models.Response
# 打開一個網(wǎng)站
result = browser.open("http://httpbin.org/")
print(result)
# 返回值類型:requests.models.Response
print(type(result))
通過返回值可以發(fā)現(xiàn),使用瀏覽器對象打開網(wǎng)站相當(dāng)于使用 requests 庫對網(wǎng)站進(jìn)行了一次請求
2-3 網(wǎng)頁元素及當(dāng)前 URL
使用瀏覽器對象的「url」屬性可以獲取當(dāng)前頁面的 URL 地址;瀏覽器的「 page 」屬性用于獲取頁面的所有網(wǎng)頁元素內(nèi)容
由于 MechanicalSoup 底層基于 BS4,因此 BS4 的語法都適用于 MechanicalSoup
# 當(dāng)前網(wǎng)頁URL地址
url = browser.url
print(url)
# 查看網(wǎng)頁的內(nèi)容
page_content = browser.page
print(page_content)
2-4 表單操作
瀏覽器對象內(nèi)置的 select_form(selector) 方法用于獲取當(dāng)前頁面的 Form 表單元素
如果當(dāng)前網(wǎng)頁只有一個 Form 表單,則參數(shù)可以省略
# 獲取當(dāng)前網(wǎng)頁中某個表單元素
# 利用action來過濾
browser.select_form('form[action="/post"]')
# 如果網(wǎng)頁只有一個Form表單,參數(shù)可以省略
browser.select_form()
form.print_summary() 用于將表單內(nèi)全部元素打印出來
form = browser.select_form()
# 打印當(dāng)前選定表單內(nèi)部全部元素
form.print_summary()
至于表單內(nèi)的 input 普通輸入框、單選框 radio、復(fù)選框 checkbox
# 1、普通輸入框
# 通過input的name屬性直接設(shè)置值,模擬輸入
browser["norm_input"] = "普通輸入框的值"
# 2、單元框radio
# 通過name屬性值,選擇某一個value值
# <input name="size" type="radio" value="small"/>
# <input name="size" type="radio" value="medium"/>
# <input name="size" type="radio" value="large"/>
browser["size"] = "medium"
# 3、復(fù)選框checkbox
# 通過name屬性值,選擇某幾個值
# <input name="topping" type="checkbox" value="bacon"/>
# <input name="topping" type="checkbox" value="cheese"/>
# <input name="topping" type="checkbox" value="onion"/>
# <input name="topping" type="checkbox" value="mushroom"/>
browser["topping"] = ("bacon", "cheese")
瀏覽器對象的 submit_selected(btnName) 方法用于提交表單
需要注意的是,提交表單后的返回值類型為:requests.models.Response
# 提交表單(模擬單擊“提交”按鈕)
response = browser.submit_selected()
print("結(jié)果為:",response.text)
# 結(jié)果類型:requests.models.Response
print(type(response))
2-5 調(diào)試?yán)?/span>
瀏覽器對象 browser 提供了一個方法:launch_browser()
用于啟動一個真實的 Web 瀏覽器,可視化展示當(dāng)前網(wǎng)頁的狀態(tài),在自動化操作過程中非常直觀有用
PS:它不會真實打開網(wǎng)頁,而是創(chuàng)建一個包含頁面內(nèi)容的臨時頁面,并將瀏覽器指向這個文件
更多功能可以參考:
https://mechanicalsoup.readthedocs.io/en/stable/tutorial.html
3. 實戰(zhàn)一下
我們以「 微信文章搜索,爬取文章標(biāo)題及鏈接地址 」為例
3-1 打開目標(biāo)網(wǎng)站,并指定隨機(jī) UA
由于很多網(wǎng)站對 User Agent 做了反爬,因此這里隨機(jī)生成了一個 UA,并設(shè)置進(jìn)去
PS:從 MechanicalSoup 源碼會發(fā)現(xiàn),UA 相當(dāng)于設(shè)置到 Requests 的請求頭中
import mechanicalsoup
from faker import Factory
home_url = 'https://weixin.sogou.com/'
# 實例化一個瀏覽器對象
# user_agent:指定UA
f = Factory.create()
ua = f.user_agent()
browser = mechanicalsoup.StatefulBrowser(user_agent=ua)
# 打開目標(biāo)網(wǎng)站
result = browser.open(home_url)3-2 表單提交,搜索一次

使用瀏覽器對象獲取網(wǎng)頁中的表單元素,然后給表單中的 input 輸入框設(shè)置值,最后模擬表單提交
# 獲取表單元素
browser.select_form()
# 打印表單內(nèi)所有元素信息
# browser.form.print_summary()
# 根據(jù)name屬性,填充內(nèi)容
browser["query"] = "Python"
# 提交
response = browser.submit_selected()3-3 數(shù)據(jù)爬取
數(shù)據(jù)爬取的部分很簡單,語法與 BS4 類似,這里就不展示說明了
search_results = browser.get_current_page().select('.news-list li .txt-box')
print('搜索結(jié)果為:', len(search_results))
# 網(wǎng)頁數(shù)據(jù)爬取
for result in search_results:
# a標(biāo)簽
element_a = result.select('a')[0]
# 獲取href值
# 注意:這里的地址經(jīng)過調(diào)轉(zhuǎn)才是真實的文章地址
href = "https://mp.weixin.qq.com" + element_a.attrs['href']
text = element_a.text
print("標(biāo)題:", text)
print("地址:", href)
# 關(guān)閉瀏覽器對象
browser.close()
3-4 反反爬
MechanicalSoup 除了設(shè)置 UA,還可以通過瀏覽器對象的「 session.proxies 」設(shè)置代理 IP
# 代理ip
proxies = {
'https': 'https_ip',
'http': 'http_ip'
}
# 設(shè)置代理ip
browser.session.proxies = proxies4. 最后
文中結(jié)合微信文章搜索實例,使用 MechanicalSoup 完成了一次自動化及爬蟲操作
相比 Selenium,最大的區(qū)別是 Selenium 可以和 JS 進(jìn)行交互;而 MechanicalSoup 不行
但是對于一些簡單的自動化場景,MechanicalSoup 是一種簡單、輕量級的解決方案
· 推薦閱讀 ·
