[ 1つの記事でPythonクローラー(1)を理解する-基本原則の概要](https://blog.csdn.net/qq_35866846/article/details/107800878)[1つの記事でPythonクローラー(2)を理解する-4つの一般的な基礎クローラーメソッドの紹介](https://blog.csdn.net/qq_35866846/article/details/107801812)
セレンクローラーがビジュアルクローラーと呼ばれる理由
主に上記のWebページ解析のクロール方法と比較して
セレンクローラーは主に人のクリック操作をシミュレートします
セレンがブラウザを駆動して操作するプロセスを観察できます
これは、他の誰かがあなたのコンピューターを操作するのを手伝ってくれるのを見るのと似ています。
もちろん、セレンにはインターフェースモードもありません
セレンの基本的な紹介:
Seleniumは、完全なWebアプリケーションテストシステムです。
テスト記録(selenium IDE)、書き込みおよび実行(Selenium Remote Control)が含まれています
テストを伴う並列処理(Seleniumグリッド)。
Selenium CoreはJsUnitに基づいており、
完全にJavaScriptで記述されているため、JavaScriptをサポートするすべてのブラウザーで使用できます。
Seleniumは、実際のブラウザー、自動テストツールをシミュレートでき、複数のブラウザーをサポートします。
クローラーは主にJavaScriptレンダリングの問題を解決するために使用されます。
pythonでクローラーを作成するとき、私は主にSeleniumのWebdriverを使用します。
# セレンライブラリをインストールする
pip install selenium
# 対応するブラウザドライバをインストールします
# 最初に次の方法でSeleniumを見ることができます.Webdriverはどのブラウザをサポートしていますか
from selenium import webdriver
print(help(webdriver))
該当するブラウザ:
PACKAGE CONTENTS
android(package)blackberry(package)chrome(package)common(package)edge(package)firefox(package)ie(package)opera(package)phantomjs(package)remote(package)safari(package)support(package)webkitgtk(package)
# ここで、より重要なPhantomJSについて説明します,
# PhantomJSは、WebKitに基づくサーバー側のJavaScriptAPIです。,
# ブラウザをサポートせずにWebをサポートします。
# 高速で、Dom処理、CSSセレクター、JSONなどのさまざまなWeb標準をネイティブにサポートします。
# PhantomJSは、ページの自動化、ネットワークモニタリング、Webページのスクリーンショット、およびインターフェイスレステストに使用できます。
[ Google Chromeドライバーのダウンロードアドレス](http://npm.taobao.org/mirrors/chromedriver/)
対応するバージョン番号に注意して、Chromeアドレスバーにchrome:// version /と入力して、Chromeバージョンを表示します
anacondaを使用してダウンロードし、anaconda3 \ Scriptsフォルダーにドロップします。
pycharm、VScodeなどの他のアイデアであるが、anacondaの統合されたpythonがロードされている場合でも、これを行うことができます。
簡単なテスト
from selenium import webdriver
# # ブラウザオブジェクトを宣言します
browser1 = webdriver.Chrome()
browser2 = webdriver.Firefox()
# # ページにアクセス
browser1.get("http://www.baidu.com")print(browser1.page_source)
# 現在のウィンドウを閉じる
browser1.close()
ページを操作するには、最初にページ要素を選択します。
8つの一般的な要素の配置方法は次のとおりです
1つの要素を見つける | 複数の要素を配置する | 配置方法の説明 |
---|---|---|
find_element_by_id | find_elements_by_id | 要素IDで検索 |
find_element_by_name | find_elements_by_name | 要素名で検索 |
find_element_by_xpath | find_elements_by_xpath | xpathパスで検索 |
find_element_by_link_text | find_elements_by_link_text | 完全なハイパーリンクテキストで検索 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 部分的なハイパーリンクテキストを検索する |
find_element_by_tag_name | find_elements_by_tag_name | タグ名で検索 |
find_element_by_class_name | find_elements_by_class_name | クラス名で検索 |
find_element_by_css_selector | find_elements_by_css_selector | cssセレクターで検索 |
より詳細な位置決め方法については、以下を参照してください。["史上最も完全な!セレニウム要素を見つける30の方法》](https://blog.csdn.net/qq_32897143/article/details/80383502)
# ユーザー名を見つけて、ユーザー名を入力します
user = drive.find_element_by_name("LoginForm[username]")
user.send_keys(username)
# パスワードを見つけて入力します
pwd=drive.find_element_by_id("LoginForm_password")
pwd.send_keys(password)
# ログインボタンをクリックしてログインします
drive.find_element_by_class_name("login_btn").click()
簡単に言えば、ハンドルはブラウザの上の各ウィンドウバーの一意の識別子です
# 現在のウィンドウのすべてのハンドルを取得します
handles = drive.window_handles
# ハンドルから2番目のタブに切り替えます
drive.switch_to.window(handles[2])"""操作が完了しました"""
# 現在のウィンドウを閉じる
driver.close()
# ハンドルから最初のタブに切り替えます
drive.switch_to.window(handles[0])
time.sleep(random.uniform(2,3))
# URLの読み込み
drive.get(url)
# 現在のページのURLを取得してアサートします
currentPageUrl = driver.current_url
drive.get("http://www.baidu.com")
cookie ={'name':'foo','value':'bar'}
drive.add_cookie(cookie)
drive.get_cookies()
現在、多くのWebサイトでAjaxテクノロジーが使用されています
ページ要素をいつ完全にロードできるかを判断できません
したがって、Webページ要素の選択はより困難です
このとき、待機(ページが読み込まれるのを待つ)を設定する必要があります
セレニウムには2つの待機方法があります。
1. 明示的な待機
明示的な待機は、条件によってトリガーされる待機です
特定の条件が満たされるまで続行されません
タイムアウトを設定できます。タイムアウト後に要素がロードされない場合、例外がスローされます。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
drive = webdriver.Chrome()
url ='http://www.baidu.com/'
drive.get(url)try:WebDriverWait(self.driver,10).until(EC.presence_of_element_located(By.ID,"LoginForm[username]")) #待っているショー
except:print('%sページが見つかりません要素'% loc)
上記のコードは「http://www.baidu.com/」ページをロードします
そして、IDが「LoginForm [username]」の要素を見つけます
タイムアウト時間を10秒に設定すると、webDriverWaitは要素がデフォルトで500ms以内に存在するかどうかをチェックします
Seleniumは、待機を表示するためのいくつかの組み込みメソッドを提供します。
expected_conditionsクラスにあります。詳細については、以下の表を参照してください。
組み込みメソッド | 機能 |
---|---|
title_is | 現在のページのタイトルが期待されるコンテンツと等しいかどうかを判断します |
title_contains | 現在のページのタイトルに期待される文字列が含まれているかどうかを判断します |
present_of_element_located | 要素がdomツリーに追加されたかどうかを判断しても、その要素が表示されている必要があるという意味ではありません |
present_of_all_element_located | 少なくとも1つの要素がdomツリーに存在するかどうかを判断します |
可視性_of_element_located | 要素が表示されているかどうかを判断します |
sibility_of | 要素が表示されているかどうかを確認します |
invisibility_of_element_located | 要素がdomツリーに存在しないか、表示されないかを判別します |
text_to_be_present_in_element | 要素内のテキストに期待される文字列が含まれているかどうかを判断します |
text_to_be_present_in_element_value | 要素のvalue属性に期待される文字が含まれているかどうかを判別します |
frame_to_be_available_and_switch_to_it | フレームを切り替えることができるかどうかを判断します。可能な場合はTrueを返し、切り替えます。そうでない場合はFalseを返します |
element_to_be_clickable | 要素が表示され有効になっているかどうかの判断 |
staleness_of | 要素がdomツリーから削除されるのを待ちます |
element_to_be_selected | 要素が選択されているかどうかを判断します。通常、ドロップダウンリストに使用されます |
element_located_to_be_selected | 要素が選択されているかどうかを判断します。通常、ドロップダウンリストに使用されます |
element_selection_state_to_be | 要素の選択された状態が期待を満たしているかどうかを判断します |
element_located_selection_state_to_be | 要素の選択された状態が期待を満たしているかどうかを判断します |
alert_is_present | ページにアラートボックスがあるかどうかを確認します |
2. 暗黙の待機
暗黙的な待機とは、要素を見つけようとするときです。すぐに見つからない場合は、一定の時間待機します。
ソケットタイムアウトと同様に、デフォルト設定は0秒です。これは、最長の待機時間に相当します。
ブラウザインターフェイスの直感的な感覚は次のとおりです。
Webページが読み込まれるまで待って(アドレスバーの場所が×にならない)、実行を続行し、
ページの読み込みが設定された待機時間を超えてから、エラーが報告されます
指示
from selenium import webdriver
drive = webdriver.Chrome()
url ='http://www.baidu.com/'
# 最大待機時間を10秒に設定します
drive.implicitly_wait(10)
drive.get(url)
user = drive.find_element_by_name("LoginForm[username]")
3. スレッドスリープ
time.sleep(time)は、より一般的に使用されるスレッドスリープモードです
リスクを避けるために、私は個人的にランダムな睡眠を好みます
time.sleep(random.uniform(4,5))
# アプリケーション拡張機能を設定する
chrome_options.add_extension(extension_path)
# ダウンロードパスを追加
# download.default_ディレクトリ:ダウンロードパスプロファイルを設定します.default_content_settings.ポップアップ:ポップアップウィンドウを禁止するには0に設定します
prefs ={'profile.default_content_settings.popups':0,'download.default_directory':tmp_path}
chrome_options.add_experimental_option('prefs', prefs)
Recommended Posts