セレンとパイソンによるウェブ掻き取り入門


Webスクレーピング高速、手頃な価格と信頼性の高い方法を使用するときに必要なデータを取得します.さらに良いことに、データは通常最新です.現在、ウェブサイトをこすっているとき、あなたはその使用方針に違反しているかもしれなくて、それから追い出されることができるかもしれません.掻き取りはほとんど合法的ですが、データを使用する方法によってはいくつかの例外があるかもしれません.だからあなたが開始する前にあなたの研究を行うことを確認します.しかしながら、単純な個人的なまたはオープンソースプロジェクトのために、あなたはOKでなければなりません.
データを削る方法はたくさんありますが、一番好きな方はSelenium . これは主に、それが基本的に行うブラウザの自動化としてテストするために使用されます.簡単な言語では、それはあなたのために物事を行うロボットブラウザを作成します:それはHTMLデータを取得することができます、スクロール、ボタンをクリックするなど、偉大な利点は、我々は具体的に整理することができますし、適切に格納するHTMLデータをどのように伝えることができることです.
セレンは多くのプログラミング言語と互換性がありますが、このチュートリアルはPythonに焦点を当てます.チェックthis link セレン( Pythonで)ドキュメントを読むには

ファーストステップ


セレンをダウンロードするには、このコマンドをコマンド行で使用します.pip install seleniumJupyterノートブックで作業している場合は、コマンドラインの代わりにそれを行うことができます.ちょっと最初に感嘆符を加えてください!pip install seleniumその後、必要なモジュールをインポートする必要があります.from selenium.webdriver import Chrome, Firefox他のブラウザもサポートされていますが、これら2つは最もよく使われます.
簡単に2つのコマンドが必要です.browser = Firefox()(or browser = Chrome() 好みに応じて
これにより、すべての有用なメソッドや属性にアクセスできるFirefox Webdriverのインスタンスが作成されます.変数に代入したbrowser しかし、あなた自身の名前を選択する自由です.Firefoxブラウザの新しい空白ウィンドウが自動的に開きます.
次に、scrapeしたいURLを取得します.browser.get('https://en.wikipedia.org/wiki/Main_Page')The get() メソッドは、ブラウザでURLを開き、完全に読み込まれるまで待機します.
今、あなたはこのURLから望むすべてのHTML情報を得ることができます.

要素の配置


セレンを持つ元素を見つける方法は様々である.どれが最も良いかは、あなたがこすっているページのHTML構造に依存します.それはあなたが望む要素にアクセスする最も効率的な方法は何かを把握するのは難しいことができます.それで、あなたの時間をとって、慎重にHTMLを調べてください.
選択した検索パラメータを使用して単一の要素にアクセスできます(検索パラメータに対応する最初の要素を取得します)、または検索パラメータに一致するすべての要素を指定できます.単一のメソッドを取得するには、次のメソッドを使用します.find_element_by_id() find_element_by_name() find_element_by_xpath() find_element_by_link_text() find_element_by_partial_link_text() find_element_by_tag_name() find_element_by_class_name() find_element_by_css_selector()複数の要素を置換するにはelement with elements 上記のメソッドで.このメソッドで見つけられたWebDriverオブジェクトの一覧を取得します.

ウィキペディア


それで、それがすでに言及されたWikipediaページでどのように働くかについて見ましょうhttps://en.wikipedia.org/wiki/Main_Page
既に作成済みですbrowser WebDriverのインスタンスを含む変数で、メインのWikipediaページをロードします.
このページがすべてのリンクに翻訳され、すべてのリンクを保存することができる言語のリストにアクセスしたいとしましょう.

いくつかの検査の後、我々はすべての要素が類似した構造を持っているのを見ることができます<li> クラスの要素'interlanguage-link' 含む<a> URLとテキストを指定します.
<li class="interlanguage-link interwiki-bg">

   <a href="https://bg.wikipedia.org/wiki/" title="Bulgarian"
   lang="bg" hreflang="bg" class="interlanguage-link-target">

       Български

   </a>

</li>
ではまず最初にアクセスしましょう<li> 要素.クラス名を使用して分離できます:languages = browser.find_elements_by_class_name('interlanguage-link') languages WebDriverオブジェクトのリストです.最初の要素を印刷するなら、print(languages[0])次のように表示されます.<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="73e70f48-851a-764d-8533-66f738d2bcf6", element="2a579b98-1a03-b04f-afe3-5d3da8aa9ec1")>それで、実際に何が内部にあるかを見るために、リストから各要素にアクセスするためにforループを書く必要があります<a> 子要素と取得<a> 'sテキストと'href' 属性.
テキストを得るにはtext 属性.得る'href' 用途get_attribute('attribute_name') メソッド.コードは次のようになります.
language_names = [language.find_element_by_css_selector('a').text 
                 for language in languages]

links = [language.find_element_by_css_selector('a').get_attribute('href') 
        for language in languages]
印刷できますlanguage_names and links それが働くのを見るために.

スクロール


場合によっては、ページ全体が開始から読み込まれません.この場合、ブラウザをスクロールして、残りのページからHTMLを取得できます.それは非常に簡単ですexecute_script() JavaScriptコードをパラメータとして取得するメソッド
scroll_down = "window.scrollTo(0, document.body.scrollHeight);"
browser.execute_script(scroll_down)
scrollTo(x-coord, y-coord) 指定した座標にスクロールするJavaScriptメソッドです.我々の場合はdocument.body.scrollHeight この場合、要素の高さを返すbody ).
あなたが推測したかもしれないように、ブラウザはすべての種類のスクリプトを実行することができますexecute_script() メソッド.ですから、JavaScriptの経験があれば、実験する余地がたくさんあります.

クリック


クリックすると、要素を選択し、適用するように簡単ですclick() メソッド.場合によっては、あなたが行く必要があるURLを知っている場合は、ブラウザのロードをURLでページを読み込むことができます.再び、より効率的なものを見てください.
例を挙げるclick() 左のメニューから「内容」リンクをクリックしましょう.

このリンクのHTMLは次のとおりです.
<li id="n-contents">
   <a href="/wiki/Portal:Contents" title="Guides to browsing Wikipedia">

        Contents

   </a>
</li>
私たちは<li> 一意のIDを持つ要素'n-contents' 最初にアクセスして<a> チャイルド
content_element = browser.find_element_by_id('n-contents') \
                         .find_element_by_css_selector('a')

content_element.click()
ブラウザが「内容」ページを読み込みました.

画像ダウンロード


今、我々はページから画像をダウンロードすることを決定する場合.このために我々は使用されますurllib 図書館とUUIDジェネレータ我々は、最初にCSSセレクターですべてのイメージを見つけます'img' , その後、アクセス'src' そして、それぞれのイメージのためにユニークなIDを作成するurlretrieve('url', 'folder/name.jpg') メソッド.このメソッドは2つのパラメータを取ります:イメージのURLと我々が我々がダウンロードするフォルダ(それが適用されるならば)と一緒にそれを与えたい名前.
from urllib.request import urlretrieve
from uuid import uuid4

# get the main page again
browser.get('https://en.wikipedia.org/wiki/Main_Page')

# locate image elements
images = browser.find_elements_by_css_selector('img')

# access src attribute of the images
src_list = [img.get_attribute('src') for img in images]


for src in src_list:
    # create a unique name for each image by using UUID generator
    uuid = uuid4()

    # retrieve umages using the URLs
    urlretrieve(src, f"wiki_images/{uuid}.jpg")

アクション間の待ち時間の追加


最後に、ブラウザでの動作の待ち時間をいくつか紹介する必要があります.たとえば、多くのページを次々に読み込みます.これはtime モジュールです.
我々の3つのURLをロードしましょうlinks を使用して、各ページを読み込む前にtime.sleep() メソッド.
import time

urls = links[0:3]

for url in urls:
    browser.get(url)
    # stop for 3 seconds before going for the next page
    time.sleep(3)

ウェブドライバを閉じる


そして最後に我々はロボットブラウザのウィンドウを閉じることができますbrowser.close()忘れないでbrowser のインスタンスを含む変数ですFirefox() メソッド(チュートリアルを参照).

githubのコード


この記事のコードはGithubで入手できます.
https://github.com/AnnaLara/scraping_with_selenium_basics