DrissionPage 簡介#
https://github.com/g1879/DrissionPage
DrissionPage 是一個用 Python 寫的網頁自動化工具,它把 Selenium 和 Requests 的功能巧妙地整合在一起,提供了統一又簡單的操作介面。開發者可以在瀏覽器模式(就像用 Selenium 那樣)和無瀏覽器模式(類似用 requests)之間自由切換。有了這個功能,不管是處理需要 JavaScript 渲染的動態網頁內容,還是抓取簡單的靜態頁面數據,DrissionPage 都能輕鬆搞定。
主要頁面對象#
DrissionPage 提供了三種主要的頁面對象,每種對象都有適合自己的使用場景:
-
ChromiumPage:主要用來直接操作瀏覽器,適合那些需要和網頁進行互動的情況,比如點擊按鈕、輸入文本、運行 JavaScript 腳本等。不過它的性能會受到瀏覽器的限制,運行速度可能沒那麼快,占用的內存也可能比較多。
-
WebPage:是個綜合性的頁面對象,它既能控制瀏覽器,又能收發數據包。它有兩種模式:
- d 模式:用來操作瀏覽器,功能很強大,但運行速度慢;
- s 模式:主要處理數據包,速度快,適合數據包比較簡單的情況。
-
SessionPage:是個輕量級的頁面對象,專門用來發送和接收數據包,不需要和網頁進行互動。它處理大規模數據爬取的效率很高,是這方面的理想選擇。
功能特點#
無縫切換模式#
DrissionPage 讓開發者可以在 Selenium 的瀏覽器驅動和 Requests 的會話之間隨意切換。要是需要渲染網頁,就用 Selenium;要是想快速抓取數據,就用 Requests。比如說,碰到一個既有動態內容又有靜態內容的網頁,就可以先用 SessionPage 快速拿到靜態數據,再切換到 ChromiumPage 或者 WebPage 的 d 模式去處理動態內容。
簡化的介面#
DrissionPage 提供了統一的介面,把網頁自動化和數據抓取的流程簡化了。開發者不用再分別去學 Selenium 和 Requests 這兩個庫複雜的 API 了,能節省很多學習和開發的時間。就拿定位網頁元素來說,DrissionPage 提供了和 Selenium 類似的 ele()
和 eles()
方法,支持好幾種選擇器類型(像 CSS 選擇器、XPath),用起來特別方便。
靈活定制#
它支持用戶自己設置請求頭、代理、超時時間這些東西,讓網頁抓取變得更靈活。在抓取數據的時候,有時候會碰到網站的反爬機制,這時候設置一下自定義請求頭和代理,就能順利繞過這些限制。
內置常用功能#
DrissionPage 裡面有很多常用的功能,比如等待元素加載、自動重試等。處理動態網頁的時候,網頁元素加載可能需要點時間,DrissionPage 的等待元素加載功能就能保證在元素加載好之後再進行操作,避免因為元素沒加載完而出錯。
多標籤頁操作#
它可以同時操作瀏覽器裡的多個標籤頁,就算標籤頁不是當前激活的狀態,也不用切換就能操作。在需要同時處理多個網頁的時候,這個功能就特別實用,能大大提高工作效率。
抓包功能升級 - Listen 功能#
在 DrissionPage 4.0 版本裡,抓包功能有了很大的提升,每個頁面對象都內置了監聽器,能力變強了,API 也更合理了。這對開發者調試和採集數據有很大幫助。
示例代碼#
下面這個例子可以直接運行看看效果,它還會記錄時間,能讓你了解 Listen 功能怎麼用:
from DrissionPage import ChromiumPage
from TimePinner import Pinner
from pprint import pprint
page = ChromiumPage()
page.listen.start('api/getkeydata') # 指定要監聽的目標,然後啟動監聽
pinner = Pinner(True, False)
page.get('http://www.hao123.com/') # 打開這個網站
packet = page.listen.wait() # 等著拿到數據包
pprint(packet.response.body) # 把數據包裡的內容打印出來
pinner.pin('用時', True)
運行這段代碼後,會把監聽得到的數據包內容和整個過程花的時間都輸出出來,方便開發者分析性能和調試。
頁面訪問邏輯優化#
在 3.x 版本裡,頁面連接有兩個主要問題:瀏覽器頁面對象 get()
方法的 timeout
參數只對頁面加載階段有用,對連接階段沒用;加載策略 none
模式在實際中沒什麼用。這兩個問題在 4.0 版本都解決了,而且用戶可以自己控制什麼時候終止連接。
使用場景#
網頁自動化測試#
利用 Selenium 的功能,模擬用戶在網頁上的操作,進行自動化測試。可以對網頁的各種功能,像登錄、註冊、提交表單等進行測試,保證網頁穩定可靠。
數據抓取#
用 Requests 來獲取靜態頁面的數據,碰到複雜頁面就切換到瀏覽器模式。這樣能快速高效地抓取各種網站的數據,像新聞、商品信息、社交網絡數據等。
爬蟲開發#
結合它靈活的模式切換和強大的元素定位功能,DrissionPage 很適合開發各種類型的爬蟲。可以根據網站的特點選擇合適的模式,提高爬蟲的效率和穩定性。
使用示例#
操控瀏覽器#
用 ChromiumPage 對象可以輕鬆實現瀏覽器的自動化操作,比如登錄、填寫表單等。
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://gitee.com/login') # 打開登錄頁面
# 找到帳號輸入框
user_login = page.ele('#user_login')
user_login.input('您的帳號') # 輸入帳號
# 找到密碼輸入框
user_password = page.ele('#user_password')
user_password.input('您的密碼') # 輸入密碼
# 找到登錄按鈕並點擊
login_button = page.ele('@value=登 錄')
login_button.click()
爬取數據#
用 SessionPage 對象可以高效地爬取數據,不用和網頁進行複雜的互動。
from DrissionPage import SessionPage
page = SessionPage()
for i in range(1, 4): # 循環訪問三頁
page.get(f'https://gitee.com/explore/all?page={i}') # 打開每一頁
# 找到所有項目鏈接元素
links = page.eles('.title.project-namespace-path')
for link in links: # 遍歷每個鏈接元素
print(link.text, link.link) # 打印鏈接的文本和地址
頁面分析#
用 WebPage 對象可以在瀏覽器模式和數據包模式之間靈活切換,適應不同的分析需求。
from DrissionPage import WebPage
page = WebPage()
page.get('https://gitee.com/explore/all') # 打開頁面
page.change_mode() # 切換模式
# 找到項目列表元素
items = page.ele('.ui.relaxed.divided.items.explore-repo__list').eles('.item')
for item in items: # 遍歷每個項目
print(item('t:h3').text) # 打印項目標題
print(item('.project-desc.mb-1').text) # 打印項目描述
總結#
DrissionPage 是個功能強大、使用方便的 Python 開源包,它為網頁自動化和數據抓取提供了高效又靈活的解決方案。通過整合 Selenium 和 Requests 的功能,提供了無縫切換模式和簡單的介面,讓開發者能更專注於業務邏輯。不管是新手開發者還是有經驗的專業人士,DrissionPage 都值得一試,能讓我們更輕鬆地完成各種網頁自動化任務。