今日は、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次元データを書き込む