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

selenium的新一代替代品---DrissionPage

今天給大家推薦一款基於 Python 的網頁自動化工具:DrissionPage。這款工具既能控制瀏覽器,也能收發數據包,甚至能把兩者合而為一,簡單來說:集合了 WEB 瀏覽器自動化的便利性和 requests 的高效率優點。

對網頁實現自動化,通常會有兩類形式:

直接向伺服器發送請求數據包,獲取需要的數據,模擬數據流向操作。

控制瀏覽器跟網頁進行交互,模擬使用者界面操作。

前者輕量級,速度快,例如 requests 庫。但 requests 面對需要登錄的網站時,往往還要應付驗證碼、JS 混淆、簽名參數等反爬手段,門檻較高。若數據是由 JS 計算生成的,還須重現計算過程,開發效率不高。

而後者直接使用瀏覽器,模擬使用者行為,如 Selenium 庫,可以很大程度上繞過這些坑,但瀏覽器運行效率不高。

因此,DrissionPag 設計初衷,是將它們合而為一,能夠在不同需求時切換相應模式,並提供一種人性化的使用方法,提高開發和運行效率。

image

特點:

無 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單元格為左上角,寫入一片二維數據
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。