静的Webページの場合、リクエストなどのライブラリを使用してWebページのソースコードを簡単に取得し、必要な情報を抽出できます。しかし、動的なWebページの場合、状況ははるかに複雑です。そのようなページのソースコードには、多くの場合1つのフレームしかなく、そのコンテンツはJavaScriptによってレンダリングされます。現時点では、セレンを使用してブラウザを直接駆動してクロールすることができます。
Seleniumは、ブラウザーを駆動して一連の操作を実行し、現在表示されているWebページのソースコードを取得できる自動テストツールです。これは、動的ページのクロールに非常に効果的です。セレンの簡単な使い方について話しましょう。
1.インストール
1.セレン
直接インストールするには、pipを使用することをお勧めします。
pip install selenium
2. ChromeDriver
Seleniumは、ブラウザードライバーで使用する必要がある自動テストツールです。Chromeを例にとると、最初に対応するバージョンのブラウザードライバーをダウンロードする必要があります。バージョンの比較は、chromedriverとchromeのバージョンマッピングテーブルで確認できます。また、ブラウザのバージョンに応じて、Chromeバージョン70以降をChromeDriverMirrorに直接ダウンロードできます。
ダウンロードが完了したら、実行可能ファイルを環境変数に構成する必要があります。Windowsシステムでは、chromedriver.exeファイルをpython環境のscriptsディレクトリに直接ドラッグするか、システムへのパスを構成できます。環境変数。Linuxシステムでは、chromedriver.exeファイルをpython環境のscriptsディレクトリにドラッグできます。実行ファイルは環境変数ディレクトリに移動されます。sudo mv chromedriver /usr/bin
構成後、chromedriver
次の出力の場合、コマンドラインが直接入力され、環境構成が成功します。
2、使用
1.ブラウザオブジェクトを宣言します
from selenium import webdriver
chrome = webdriver.Chrome()
このような初期化の後、ブラウザの操作に使用すると、ブラウザのインターフェイスは閉じるまでポップアップします。明らかに、インターフェイスをポップアップせずにバックグラウンドでサイレントに動作させたいので、chromeのインターフェイスレスモード(旧バージョン)も設定する必要があります。サポートされていない可能性があります):
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome = webdriver.Chrome(chrome_options=chrome_options)
2.ページにアクセスします
ページにアクセスするには、get関数を使用してURLを渡します。
chrome.get('https://www.baidu.com')
print(chrome.page_source) # 输出当前页面源码
3.ノードを見つける
getメソッドでページを開いた後、page_sourceメソッドを使用してソースコードを取得し、BeautifulSoupなどのライブラリを使用して解析できます。ただし、seleniumはノードを操作するための一連のメソッドを提供しているため、追加のメソッドを使用する必要はありません。ライブラリの解析。この方法で
、idやclassなどの共通の属性を持つノードを取得できますfind_element_by_id
。単一のノードを取得する方法は次のとおりです。
find_element_by_tag_name()
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
さらに、ノードを見つけるための一般的な方法があり、find_element(属性名, 值)
カスタム属性を持つノードを柔軟に見つけることができます。上記のメソッドは、単一のノードを取得するメソッドです。複数の修飾ノードページがある場合は、最初の結果のみを返すことができます。すべての修飾ノードを検索する場合は、要素にアプローチするだけで済みます。変更された要素は、次のようになります。ノードのリスト。
4.ノード情報を取得します
ノードを見つけたら、このget_attribute('属性名')
メソッドを使用してその属性情報を取得し、.txtメソッドを使用してノードのコンテンツを取得できます。
node = chrome.find_element_by_id('kw')
print(node.get_attribute('class'))
print(node.text)
5.ノードの相互作用
Seleniumは、入力ボックスへの入力など、ノードの一連の操作方法を提供します。
input = chrome.find_element_by_id('kw')
input.send_keys('python') # 填入内容
input.clear() # 清空输入
input.send_keys('zzu')
指定されたボタンをクリックします。
button = chrome.find_element_by_id('su')
button.click()
6.待機の遅延
ページを開くときは、ネットワークの問題や動的な情報を大量に読み込む必要があるため、すぐに操作するとエラーが発生する可能性がありますので、ページを開いてからしばらく待ってから先に進んでください。 。待つ最も簡単な方法は、タイムライブラリを使用することです。
import time
time.sleep(3)
明らかに、この方法は非常に柔軟性がなく、ほとんどのページをすばやくロードできるため、このような固定の遅延は多くの時間を浪費します。より良い方法は、WebDriverWaitクラスを使用し、ブラウザーオブジェクトと最大待機時間を使用して初期化し、untilメソッドを呼び出して、待機条件を渡すことです。最大待機時間が満たされると、待機はすぐに終了します。それ以外の場合は、例外がスローされます。:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 5秒内id为content_left的节点出现则结束等待,否则抛出异常
WebDriverWait(chrome, 5).until(EC.presence_of_element_located(('id', 'content_left')))
7.JavaScriptコードを実行します
Seleniumは、JavaScriptコードを直接実行するメソッドexcute_scriptを提供します。Seleniumによって提供されないアクションは、進行状況バーをプルダウンしてより多くのコンテンツをロードするなど、JavaScriptコードを実行することで実装できます。
# 下拉进度条到最底部
chrome.execute_script('window.scrollTo(0, document.body.scrollHeight)')
chrome.execute_script('alert("to bottom")')