今天給大家推薦一款基於 Python 的網頁自動化工具:DrissionPage。這款工具既能控制瀏覽器,也能收發數據包,甚至能把兩者合而為一,簡單來說:集合了 WEB 瀏覽器自動化的便利性和 requests 的高效率優點。
對網頁實現自動化,通常會有兩類形式:
直接向伺服器發送請求數據包,獲取需要的數據,模擬數據流向操作。
控制瀏覽器跟網頁進行交互,模擬用戶界面操作。
前者輕量級,速度快,例如 requests 庫。但 requests 面對需要登錄的網站時,往往還要應付驗證碼、JS 混淆、簽名參數等反爬手段,門檻較高。若數據是由 JS 計算生成的,還須重現計算過程,開發效率不高。
而後者直接使用瀏覽器,模擬用戶行為,如 Selenium 庫,可以很大程度上繞過這些坑,但瀏覽器運行效率不高。
因此,DrissionPag 設計初衷,是將它們合而為一,能夠在不同需要時切換相應模式,並提供一種人性化的使用方法,提高開發和運行效率。
特點:
無 webdriver 特徵
無需為不同版本的瀏覽器下載不同的驅動
運行速度更快
可以跨 iframe 查找元素,無需切入切出
把 iframe 看作普通元素,獲取後可直接在其中查找元素,邏輯更清晰
可以同時操作瀏覽器中的多個標籤頁,即使標籤頁為非激活狀態,無需切換
可以直接讀取瀏覽器緩存來保存圖片,無需用 GUI 點擊另存
可以對整個網頁截圖,包括視口外的部分(90 以上版本瀏覽器支持)
可處理非 open 狀態的 shadow-root
項目地址:
https://gitee.com/g1879/DrissionPage
使用 pip 安裝 DrissionPage:
pip install DrissionPage -i https://pypi.tuna.tsinghua.edu.cn/simple
應用實例:采集貓眼電影 TOP100 榜
這個示例演示用瀏覽器采集數據。
目標網址:https://www.maoyan.com/board/4
示例代碼
以下代碼可直接運行。
需要注意的是,這裡用到記錄器對象,詳見 DataRecorder
from DrissionPage import ChromiumPage
from DataRecorder import Recorder
# 創建頁面對象
page = ChromiumPage()
# 創建記錄器對象
recorder = Recorder('data.csv')
# 訪問網頁
page.get('https://www.maoyan.com/board/4')
while True:
# 遍歷頁面上所有 dd 元素
for mov in page.eles('t:dd'):
# 獲取需要的信息
num = mov('t:i').text
score = mov('.score').text
title = mov('@data-act=boarditem-click').attr('title')
star = mov('.star').text
time = mov('.releasetime').text
# 寫入到記錄器
recorder.add_data((num, title, star, time, score))
# 獲取下一頁按鈕,有就點擊
btn = page('下一页', timeout=2)
if btn:
btn.click()
page.wait.load_start()
# 沒有則退出程序
else:
break
recorder.record()
現在說一下這個好用的庫,DataRecorder
https://gitee.com/huiwei13/data-recorder
雖然小眾,但是好用
可以緩存數據到一定數量再一次寫入,減少文件讀寫次數,降低開銷。
支持多線程同時寫入數據。
寫入時如文件打開,會自動等待文件關閉再寫入,避免數據丟失。
對斷點續爬提供良好支持。
可方便地批量轉移數據。
可根據字典數據自動創建表頭。
自動創建文件和路徑,減少代碼量。
記錄器 Recorder
Recorder 的功能簡單直觀高效實用,只做一個動作,就是不斷接收數據,按順序往文件裡添加。可以接收單行數據,或二維數據一次寫入多行。
它支持 csv、xlsx、json、txt 四種格式文件。
from DataRecorder import Recorder
data = ((1, 2, 3, 4),
(5, 6, 7, 8))
r = Recorder('data.csv')
r.add_data(data) # 一次記錄多行數據
r.add_data('abc') # 記錄單行數據
表格填充器 Filler
Filler 用於對表格文件填寫數據,可以指定填其坐標。它的使用非常靈活,可以指定坐標為左上角,填入一片二維數據。還封裝了記錄數據處理進度的功能(比如斷點續爬)。除此以外,它還能給單元格設置鏈接。
它只支持 csv 和 xlsx 格式文件。
from DataRecorder import Filler
f = Filler('results.csv')
f.add_data((1, 2, 3, 4), 'a2') # 從A2單元格開始,寫入一行數據
f.add_data(((1, 2), (3, 4)), 'd4') # 以D4單元格為左上角,寫入一片二維數據