セレンとパイソンによるウェブ掻き取り入門
7771 ワード
Webスクレーピング高速、手頃な価格と信頼性の高い方法を使用するときに必要なデータを取得します.さらに良いことに、データは通常最新です.現在、ウェブサイトをこすっているとき、あなたはその使用方針に違反しているかもしれなくて、それから追い出されることができるかもしれません.掻き取りはほとんど合法的ですが、データを使用する方法によってはいくつかの例外があるかもしれません.だからあなたが開始する前にあなたの研究を行うことを確認します.しかしながら、単純な個人的なまたはオープンソースプロジェクトのために、あなたはOKでなければなりません.
データを削る方法はたくさんありますが、一番好きな方はSelenium . これは主に、それが基本的に行うブラウザの自動化としてテストするために使用されます.簡単な言語では、それはあなたのために物事を行うロボットブラウザを作成します:それはHTMLデータを取得することができます、スクロール、ボタンをクリックするなど、偉大な利点は、我々は具体的に整理することができますし、適切に格納するHTMLデータをどのように伝えることができることです.
セレンは多くのプログラミング言語と互換性がありますが、このチュートリアルはPythonに焦点を当てます.チェックthis link セレン( Pythonで)ドキュメントを読むには
セレンをダウンロードするには、このコマンドをコマンド行で使用します.
簡単に2つのコマンドが必要です.
これにより、すべての有用なメソッドや属性にアクセスできるFirefox Webdriverのインスタンスが作成されます.変数に代入した
次に、scrapeしたいURLを取得します.
今、あなたはこのURLから望むすべてのHTML情報を得ることができます.
セレンを持つ元素を見つける方法は様々である.どれが最も良いかは、あなたがこすっているページのHTML構造に依存します.それはあなたが望む要素にアクセスする最も効率的な方法は何かを把握するのは難しいことができます.それで、あなたの時間をとって、慎重にHTMLを調べてください.
選択した検索パラメータを使用して単一の要素にアクセスできます(検索パラメータに対応する最初の要素を取得します)、または検索パラメータに一致するすべての要素を指定できます.単一のメソッドを取得するには、次のメソッドを使用します.
それで、それがすでに言及されたWikipediaページでどのように働くかについて見ましょうhttps://en.wikipedia.org/wiki/Main_Page
既に作成済みです
このページがすべてのリンクに翻訳され、すべてのリンクを保存することができる言語のリストにアクセスしたいとしましょう.
いくつかの検査の後、我々はすべての要素が類似した構造を持っているのを見ることができます
テキストを得るには
場合によっては、ページ全体が開始から読み込まれません.この場合、ブラウザをスクロールして、残りのページからHTMLを取得できます.それは非常に簡単です
あなたが推測したかもしれないように、ブラウザはすべての種類のスクリプトを実行することができます
クリックすると、要素を選択し、適用するように簡単です
例を挙げる
このリンクのHTMLは次のとおりです.
今、我々はページから画像をダウンロードすることを決定する場合.このために我々は使用されます
最後に、ブラウザでの動作の待ち時間をいくつか紹介する必要があります.たとえば、多くのページを次々に読み込みます.これは
我々の3つのURLをロードしましょう
そして最後に我々はロボットブラウザのウィンドウを閉じることができます
この記事のコードはGithubで入手できます.
https://github.com/AnnaLara/scraping_with_selenium_basics
データを削る方法はたくさんありますが、一番好きな方はSelenium . これは主に、それが基本的に行うブラウザの自動化としてテストするために使用されます.簡単な言語では、それはあなたのために物事を行うロボットブラウザを作成します:それはHTMLデータを取得することができます、スクロール、ボタンをクリックするなど、偉大な利点は、我々は具体的に整理することができますし、適切に格納するHTMLデータをどのように伝えることができることです.
セレンは多くのプログラミング言語と互換性がありますが、このチュートリアルはPythonに焦点を当てます.チェックthis link セレン( Pythonで)ドキュメントを読むには
ファーストステップ
セレンをダウンロードするには、このコマンドをコマンド行で使用します.
pip install selenium
Jupyterノートブックで作業している場合は、コマンドラインの代わりにそれを行うことができます.ちょっと最初に感嘆符を加えてください!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
Reference
この問題について(セレンとパイソンによるウェブ掻き取り入門), 我々は、より多くの情報をここで見つけました https://dev.to/annalara/introduction-to-web-scraping-with-selenium-and-python-4p7bテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol