banner
andrewji8

Being towards death

Heed not to the tree-rustling and leaf-lashing rain, Why not stroll along, whistle and sing under its rein. Lighter and better suited than horses are straw sandals and a bamboo staff, Who's afraid? A palm-leaf plaited cape provides enough to misty weather in life sustain. A thorny spring breeze sobers up the spirit, I feel a slight chill, The setting sun over the mountain offers greetings still. Looking back over the bleak passage survived, The return in time Shall not be affected by windswept rain or shine.
telegram
twitter
github

如何利用 DrissionPage 進行高效的網頁數據抓取?

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 都值得一試,能讓我們更輕鬆地完成各種網頁自動化任務。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。