今日は、Python ベースのウェブオートメーションツールである DrissionPage を皆さんにおすすめします。このツールはブラウザの制御だけでなく、データパケットの送受信も可能であり、両者を組み合わせることもできます。要するに、ウェブブラウザの自動化の利便性と requests の高効率を組み合わせたものです。
ウェブの自動化には通常、2 つの形式があります。
-
サーバーにリクエストデータパケットを直接送信し、必要なデータを取得し、データフローの操作を模倣します。
-
ブラウザを制御してウェブページと対話し、ユーザーインターフェースの操作を模倣します。
前者は軽量で高速であり、例えば requests ライブラリがあります。しかし、requests はログインが必要なウェブサイトに対しては、しばしばキャプチャ、JS の混乱、署名パラメータなどのスクレイピング対策に対処する必要があり、ハードルが高いです。また、データが JS によって生成される場合、計算プロセスを再現する必要もあり、開発効率が低下します。
一方、後者はブラウザを直接使用し、ユーザーの操作を模倣するため、Selenium ライブラリなどを使用すると、これらの問題をかなり回避することができますが、ブラウザの実行効率は高くありません。
そのため、DrissionPage はこれらを組み合わせ、必要に応じて適切なモードに切り替えることができるように設計されており、使いやすい方法を提供し、開発および実行効率を向上させることを目指しています。
特徴:
- webdriver の特徴なし
- 異なるバージョンのブラウザ用に異なるドライバをダウンロードする必要なし
- より高速な実行速度
- iframe 内の要素を横断的に検索でき、切り替える必要がない
- iframe を通常の要素として扱い、取得した後に直接要素を検索できるため、論理がより明確になります
- 非アクティブな状態のタブを含む複数のタブを同時に操作できる
- ブラウザのキャッシュから直接画像を読み取ることができ、GUI を介さずに保存する必要がありません
- ページ全体のスクリーンショットを撮影できます(バージョン 90 以上のブラウザでサポート)
- 非 open 状態の shadow-root を処理できます
プロジェクトのアドレス:
https://gitee.com/g1879/DrissionPage
DrissionPage の pip を使用したインストール方法:
pip install DrissionPage -i https://pypi.tuna.tsinghua.edu.cn/simple
アプリケーションの例:猫眼映画の TOP100 ランキングを収集する
この例では、ブラウザを使用してデータを収集します。
ターゲット URL: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 は、シンプルで直感的で効率的な機能を持っており、1 つのアクションのみを行います。つまり、データを連続して受け取り、順番にファイルに追加します。単一行のデータまたは 2 次元データを一度に複数行書き込むことができます。
csv、xlsx、json、txt の 4 つの形式のファイルをサポートしています。
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 は、表形式のファイルにデータを書き込むために使用されます。座標を指定することができます。非常に柔軟に使用でき、左上隅の座標を指定して 2 次元データを埋め込むことができます。また、データの処理の進捗状況を記録する機能(例:断点継続スクレイピング)も提供しています。さらに、セルにリンクを設定することもできます。
csv および xlsx 形式のファイルのみをサポートしています。
from DataRecorder import Filler
f = Filler('results.csv')
f.add_data((1, 2, 3, 4), 'a2') # A2セルから始まり、1行のデータを書き込む
f.add_data(((1, 2), (3, 4)), 'd4') # D4セルを左上隅として、2次元データを書き込む