動的なWebクロールデータ
AJAXとは何か:
AJAX(Asynchronouse JavascriptとXML)非同期JavaScriptとXML。バックグラウンドでサーバーと交換少量のデータを行うことにより、Ajaxの非同期ページの更新を行うことができます。これは、ページの特定の部分のために、ページ全体をリロードせずに更新される、ということを意味します。従来のWebページ(アヤックスを使用していない)あなたがコンテンツを更新する必要がある場合は、Webページ全体をリロードする必要があります。用いたデータ伝送の面で伝統的な形式で、そのためXML
の構文を。したがって名前はAJAX
、実際には、基本的にインタラクティブなデータを使用していますJSON
。AJAXで、ブラウザにデータをレンダリングし、でもJSで、ロードされたデータを使用して右键->查看网页源代码
、まだアヤックスでロードされたデータを見ることができない、あなただけのロードこのURLのhtmlコードを使用して見ることができます。
Ajaxのデータを取得します:
- 直接分析インターフェースAJAX呼び出し。そして、コード要求このインタフェース。
- データを得るために、セレン+ chromedriverシミュレートブラウザの動作を使用してください。
道 | 利点 | 短所 |
---|---|---|
分析インターフェイス | あなたはデータを直接要求することができます。あなたは、いくつかの解析を行う必要はありません。以下のコード、高性能。 | 分析インターフェイスは、特にJSのインターフェイスによって混乱の一部は、特定のjsのスキルを持って、より複雑です。爬虫類を見つけるのは簡単。 |
セレン | ブラウザの動作の直接シミュレーション。ブラウザは、セレンを使用するように要求することができますも要求することができます。爬虫類、より安定しました。 | 符号量。低パフォーマンス。 |
セレン+ chromedriver動的データを取得します。
Selenium
ロボットの同等。いくつかは、自動的なクリックなどのブラウザ上で動作する、のいくつかを扱うブラウザで人間の行動をシミュレートするデータを記入し、その上のクッキーを削除することができます。chromedriver
ドライバーはChrome
、ブラウザ用のドライバ、彼はブラウザを使用して駆動することができます。もちろん、別のブラウザごとに異なるドライバがあります。以下は、異なるブラウザとそれに対応するドライバを示しています。
- クローム:https://sites.google.com/a/chromium.org/chromedriver/downloads
- Firefoxの:https://github.com/mozilla/geckodriver/releases
- エッジ:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- サファリ:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
セレンのインストールとchromedriver:
- インストール
Selenium
:Selenium
そこ言語の多くのバージョンは、あるので、上のJava、ルビー、Pythonとしています。我々はそれのPythonのバージョンをダウンロードしました。pip install selenium
- インストール
chromedriver
:ダウンロードしたら、それを必要としない純粋な英語のディレクトリのパーミッションを置きます。
はじめに:
今、簡単な例を用いて条件の下でBaiduのホーム・ページを取得するSelenium
とchromedriver
どのようにクイックスタート:
セレンインポートwebdriverをする #chromedriverの絶対パス driver_pathのR&LT = ' D:\ ProgramApp \ chromedriver \ chromedriver.exe ' #は、ドライバを初期化し、指定されたパスchromedriver ドライバ= webdriver.Chrome(executable_path = driver_path) #は、ウェブページ要求 driver.getを(" https://www.baidu.com/ " ) #のpage_sourceのことでGETページのソースコード を印刷(driver.page_source)
セレン共通の操作:
より多くのチュートリアルを参照してください:http://selenium-python.readthedocs.io/installation.html#introduction
閉じます:
driver.close()
:現在のページを閉じます。driver.quit()
:全体のブラウザを終了します。
位置決め要素:
find_element_by_id
:要素を見つけるために、IDをよります。それはと同等です。submitTag = driver.find_element_by_id(' SU ' ) submitTag1 = driver.find_element(By.ID、' SU ')
find_element_by_class_name
:クラス名に基づいて要素を検索します。それはと同等です。submitTag = driver.find_element_by_class_name(' SU ' ) submitTag1 = driver.find_element(By.CLASS_NAME、' SU ')
find_element_by_name
:name属性の値に応じて要素を検索します。それはと同等です。submitTag = driver.find_element_by_name(' Eメール' ) submitTag1 = driver.find_element(By.NAME、' 電子メール')
find_element_by_tag_name
:要素を見つけるために、ラベル名によります。それはと同等です。submitTag = driver.find_element_by_tag_name(' DIV ' ) submitTag1 = driver.find_element(By.TAG_NAME、' DIV ')
find_element_by_xpath
:XPathをベース構文要素を取得します。それはと同等です。submitTag = driver.find_element_by_xpath(' // DIV ' ) submitTag1 = driver.find_element(By.XPATH、' // DIV ')
-
find_element_by_css_selector
:選択した要素のCSSセレクタ。それはと同等です。submitTag = driver.find_element_by_css_selector(' // DIV ' ) submitTag1 = driver.find_element(By.CSS_SELECTOR、' // DIV ')
注意すべきで、
find_element
最初の要素が条件を満たして取得することです。find_elements
これは、すべての要素が条件を満たしてもらうことです。
オペレーションフォーム要素:
-
操作入力部:二段階。ステップ1:要素を検索します。ステップ2:使用
send_keys(value)
で満たされたデータを。次のようにサンプル・コードは次のとおりです。inputTag = driver.find_element_by_id(' KW ' ) inputTag.send_keys(' パイソン')
使用
clear
方法は、入力ボックスの内容を消去することができます。次のようにサンプル・コードは次のとおりです。inputTag.clear()
-
操作チェックボックス:選択のために
checkbox
ページ内のラベルにマウスをクリックします。選択したいので、checkbox
タブを、その後、最初のラベルを選択し、[実行click
イベントを。次のようにサンプル・コードは次のとおりです。rememberTag = driver.find_element_by_name(" リメンバー・ミー" ) rememberTag.click()
-
選択選択:要素を直接クリックすることはできませんを選択します。選択した要素をクリックする必要があるため。特別オファーのこの時間セレンは、クラスラベルを選択します
selenium.webdriver.support.ui.Select
。このクラスに渡されたパラメータとして取得した要素は、オブジェクトを作成します。あなたはこのオブジェクトを使用することができますので、選択します。次のようにサンプル・コードは次のとおりです。selenium.webdriver.support.ui インポート選択 #ラベルを選択し、選択したオブジェクトを作成し使用 SelectTag =選択(driver.find_element_by_name(「jumpMenu 」)) #インデックスに従って選択 selectTag.select_by_index(1 ) #値に応じて選択 selectTag.select_by_value (" http://www.95yueba.com " ) #視覚的なテキストに基づいて選択 selectTag.select_by_visible_text(" 95は、クライアントを表示" ) #は、すべてのオプションのチェックを外す (selectTag.deselect_all)
-
操作ボタン:アクションボタンは、多くの方法があります。このようなクリック、右クリック、ダブルクリックなど。ここでは最も一般的に使用を指示します。クリックです。直接呼び出し
click
、その上に機能。次のようにサンプル・コードは次のとおりです。inputTag = driver.find_element_by_id(' SU ' ) inputTag.click()
行動チェーン:
時には、ページ上の操作は手順の多くを持っているかもしれないので、この時間は、あなたは、マウスの行動鎖クラスを使用することができますActionChains
完了します。例えば、今あなたが要素をクリックしてイベントを実行するためにマウスを移動します。そして、次のサンプルコード:
inputTag = driver.find_element_by_id(' KW ' ) submitTag = driver.find_element_by_id(' SU ' ) アクション = ActionChains(ドライバ) actions.move_to_element(inputTag) actions.send_keys_to_element(inputTag、' パイソン' ) actions.move_to_element(submitTag) アクション。クリック(submitTag) actions.perform()
複数のマウス関連の操作があります。
- click_and_hold(要素):上のクリックが、マウスを解放しません。
- context_click(要素):右クリックします。
- DOUBLE_CLICK(要素):ダブルクリックします。:詳細はを参照してくださいhttp://selenium-python.readthedocs.io/api.html
操作クッキー:
- すべてを取得します
cookie
:以下のためのクッキーでdriver.get_cookies(): プリント(クッキー)
- キークッキーのよる取得価額:
値= driver.get_cookie(キー)
- クッキーのすべてを削除します。
driver.delete_all_cookies()
- 削除
cookie
:driver.delete_cookie(キー)
ページ待ち:
Ajax技術を使用して今より多くのウェブページ、要素は完全にアウトロードされたときにプログラムが判断することはできませんように。あなたが待って、実際のページが長すぎるDOM要素に結果が出ていないが、あなたのコードは、直接このWebElementを使用している場合、例外がnullpointerがスローされます。この問題を解決するために。セレン待つので、2つの方法を提供します:1は、暗黙的に待つことです明示的な1が待っています。
-
暗黙の待ち時間:呼び出します
driver.implicitly_wait
。あなたは要素が使用不能に取得する前に、それは最初の10秒の時間を待つことになります。次のようにサンプル・コードは次のとおりです。ドライバ= webdriver.Chrome(executable_path = driver_path) driver.implicitly_wait( 10 ) #请求网页 driver.get(" https://www.douban.com/ ")
-
表示待ち:待っているが、表示要素のみを特定の条件が満たされ得た後、操作を実行することを示しています。この時間以上は、それが例外をスローした場合とき、あなたはまた、最大待機時間を指定することができます。これは、待ち時間が使用する必要がありますを示し
selenium.webdriver.support.excepted_conditions
、条件付き期待をしてselenium.webdriver.support.ui.WebDriverWait
完全一致します。次のようにサンプル・コードは次のとおりです。セレン輸入webdriverを から selenium.webdriver.common.byの輸入によって から selenium.webdriver.support.uiの輸入WebDriverWait から selenium.webdriver.supportの輸入expected_conditions ECのよう ドライバ = webdriver.Firefox() driver.get(" のhttp:// somedomain / url_that_delays_loading " ) してみてください: 要素(ドライバ、10 = WebDriverWait (.until) EC.presence_of_element_located((By.ID、" myDynamicElement " )) ) 最後に: driver.quit()
-
いくつかの他の条件を待ち:
- presence_of_element_located:要素がアップロードされています。
- presence_of_all_emement_located:すべての要素の条件を満たすようにウェブページがアップロードされます。
-
element_to_be_cliable:クリックすることができます要素。
:その他の条件はを参照してくださいhttp://selenium-python.readthedocs.io/waits.html
ページを切り替えます。
時々窓、多くのサブタブページがあります。この時間は間違いなく切り替えるために必要とされます。selenium
これはと呼ばれる機能を提供switch_to_window
由来することができる特定のページに切り替えるには、スイッチdriver.window_handles
の位置を確認します。次のようにサンプル・コードは次のとおりです。
#は新しいページを開き self.driver.execute_script(" window.open( ' " + URL + " ')" ) #のこの新しいページへのスイッチ self.driver.switch_to_window(self.driver.window_handlesを[1])
プロキシIPを設定します。
時々 、頻繁にいくつかのページをクロールします。Serverは、爬虫類のあなたのIPアドレスを封止した後にあることがわかります。この時点で、私たちは、プロキシIPアドレスを変更することができます。プロキシIPアドレスを変更、異なるブラウザは異なる実装を持っています。ここにChrome
説明する例としてブラウザ:
セレンインポートwebdriverを オプション =用)(webdriver.ChromeOptions options.add_argument(" --proxyサーバ= HTTP://110.73.2.248:8123 " ) driver_path = R " D:\ ProgramApp \ chromedriver \ chromedriver.exe " ドライバ = webdriver.Chrome(executable_path = driver_path、chrome_options = オプション) driver.get(' http://httpbin.org/ip ')
WebElement
要素:
from selenium.webdriver.remote.webelement import WebElement
各クラスは、クラスがあなたの要素から抜け出すです。
いくつかの共通の属性があります。
- GET_ATTRIBUTE:このタグの属性の値。
- screentshot:現在のページのスクリーンショットを取得します。このメソッドは、唯一にすることができ
driver
上で使用します。driver
オブジェクトクラスはから継承されますWebElement
。
関連するソースコードを読んでください。