PythonのSeleniumを使って、軽くスクレイピングをしました。
ちょっとしたサンプル的として、まとめてみました!
軽いものなら、「今回のこと+Pythonの知識」でカバーできるんじゃないでしょうか。
- 今回試したこと
- SeleniumでSeleniumでChromeを立ち上げる
- ブログトップにアクセス
- h1タグを取得
- 取得したh1タグを解析
- 取得したh1タグの文字列とURLを取得→一覧化
- 要素はWebElement型で取得される
- テキストと要素の取得
今回試したこと
このようなことを行っています。
- SeleniumでChromeを立ち上げる
- このブログのトップにアクセス
- h1タグを取得
- 取得したh1タグの文字列とURLを取得→一覧化
SeleniumでSeleniumでChromeを立ち上げる
まずはSeleniumでChromeを立ち上げます。
このように記述することで、テスト用のChromeが立ち上がります。
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--disable-gpu') options.add_argument('--window-size=1024,768') driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=options)
Chrome()の引数「executable_path」は、「chromedriver.exe」のパスを指定します。
chromedriver.exeはこちらからダウンロードできます。
「executable_path="展開先のパス"」としてあげればOKです!
ちなみにぼくのように、chromedriver.exeをPathの通ったフォルダに置いておけば、サンプルと同じ記述で実行することもできます。
OptionsとGUI非表示
「options.add_argument()」でオプションを設定して、Chromeを起動します。
コマンドラインオプションを付与していくイメージですね。
ちなみに
options.add_argument('--headless')
を付与することで、GUI画面が表示されずに処理することができます。
バックグラウンドで、ガーッ!と処理させたい場合は、コレを付けて試してみましょう。
ブログトップにアクセス
これで対象のURLへ遷移することができます。
url = 'https://www.lisz-works.com/'
driver.get(url)
処理→別の画面/ページ→処理→別の……
のように次々にページ遷移して処理する場合でも、遷移するタイミングで「get(URL)」していきます。
h1タグを取得
このブログのトップにアクセスして、「h1タグ=タイトル」を取得してみます。
elms = driver.find_elements_by_css_selector("h1")
これによって、HTMLソースで言う所の、
<h1 class="entry-title"> <a class="entry-title-link" href=" https://www.lisz-works.com/entry/python-convert-json-dict">タイトル</a> </h1>
の箇所が、ヒットした分だけ取得できます。
「find_elements_by_css_selector()」は、引数にCSS文字列を渡してあげることで、ヒットした要素を取得できます。
複数要素ある場合は、ヒットした個数分取得されます。
CSSを指定して取得ができるので
- 「"h1"」
- 「".target_class"」
- 「".class_a > .class_b」
のようにCSSセレクタを使うことで、多様な取得が行えます。
めっちゃ便利!
取得したh1タグを解析
「h1」を取得しましたが、ブログトップには複数個「h1」がいます。
なので戻り値を入れたelmsには、配列で複数個のh1タグが入ります。
e = elms[0] a = e.find_elements_by_css_selector("a") a[0].get_attribute("href") #→'https://www.lisz-works.com/' a[0].text #→'lisz-works'
仮に要素が1つでも、「配列型」としてセットされます。
なので要素が1つのときでも、「elms[0]」のように配列0番目へアクセスします。
取得したh1タグの文字列とURLを取得→一覧化
それでは取得したh1タグを処理していきましょう!
このようにすることで、一覧化することができます。
for elm in elms: e = elm.find_elements_by_css_selector("a")[0] print("[" + e.text + "](" + e.get_attribute("href") + ")")
このforを行うことで、このように出力されます。
一覧化ついでにMarkdownのリンクにしてあります!
[lisz-works](https://www.lisz-works.com/) [Python3 辞書型⇔文字列(JSON)の相互変換]( https://www.lisz-works.com/entry/python-convert-json-dict) [コンソールにカラーテーマを!WSLも見やすくなる!](https://www.lisz-works.com/entry/ms-color-tool) [はてな独自ドメインをhttps化とエラー除去](https://www.lisz-works.com/entry/hateblo-https) [Google Home Mini入手!3つの◎と1つの×]( https://www.lisz-works.com/entry/get-google-home-mini) [ウィダーのバー ヘルシーチキンを食べたよ!]( https://www.lisz-works.com/entry/weidar-proteinbar-healthychicken) [Google Apps Scriptのプロパティで安全に値を使う!ユーザープロパティとスクリプトプロパティ]( https://www.lisz-works.com/entry/gas-property) [Anaconda入れ直し→pipエラーする→対処を試した]( https://www.lisz-works.com/entry/pip-err-msgpack-not-installed) [論文は読む順番を変えろ!落合陽一氏から学ぶ論文の吸収方法](https://www.lisz-works.com/entry/lean-scholar ) [Analytics→Slack通知!GoogleAppsScriptでGAを確認しよう!]( https://www.lisz-works.com/entry/gas-ga2slack)
要素はWebElement型で取得される
一覧化するロジックで、forの中で
e = elm.find_elements_by_css_selector("a")[0]
としています。
find_elements_by_css_selector()で取得した要素は、WebElement型になっています。
なので序盤に行った
driver.find_elements_by_css_selector()
と同じようにいじることができます*1。
なのでイメージ的には、
- 「driver.find_elements_by_css_selector()」でSeleniumの要素を取得
- さらに「find_elements_by_css_selector()」でSeleniumの要素やテキストなどを取得
みたいな感じで進めていきます。
テキストと要素の取得
一覧化するロジックで、forの中で
e = elm.find_elements_by_css_selector("a")[0]
としています。
これはh1タグの中にある、aタグを取得しています。
<h1 class="entry-title"> ↓これ <a class="entry-title-link" href=" https://www.lisz-works.com/entry/python-convert-json-dict">タイトル</a> </h1>
テキストの取得
テキストは
e.text
と記述することで取得できます。
サンプルのHTMLでいうところの、aタグに挟まれた「タイトル」の部分が取得できます!
要素の取得
要素は
e.get_attribute("href")
と記述することで取得できます。
「get_attribute()」は、引数で渡した要素名を取得することができます。
なので今回は、サンプルのHTMLでいうところの、href要素
「https://www.lisz-works.com/entry/python-convert-json-dict」
の部分が取得できます!
これはタグ内に含まれている要素なら取得できるので、例えば
e.get_attribute("class")
のようにして、クラスを取得することもできます。
*1:厳密には違うのかもしれませんが、find_elements_by_css_selector()などを扱うという意味では同様