DrissionPage の紹介#
https://github.com/g1879/DrissionPage
DrissionPage は Python で書かれたウェブ自動化ツールで、Selenium と Requests の機能を巧妙に統合し、統一されたシンプルな操作インターフェースを提供します。開発者はブラウザモード(Selenium のように)と無ブラウザモード(Requests のように)を自由に切り替えることができます。この機能を使えば、JavaScript によってレンダリングされる動的ウェブコンテンツの処理や、シンプルな静的ページデータの取得も簡単に行えます。
主なページオブジェクト#
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 は試す価値があり、さまざまなウェブ自動化タスクをより簡単に完了できるようにします。