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 を皆さんにおすすめします。このツールは、ブラウザの制御だけでなく、データパケットの送受信も行え、さらに両者を組み合わせることもできます。要するに、ウェブブラウザの自動化の利便性と requests の効率の利点を組み合わせたものです。

ウェブページの自動化には、通常 2 つの形式があります。

  1. サーバーに直接リクエストデータパケットを送信し、必要なデータを取得し、データフローの操作を模倣します。

  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次元データを書き込む
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。