lisz-works

技術と興味の集合体

python×seleniumでリンク一覧を作る

【スポンサーリンク】

Pythonロゴ

PythonのSeleniumを使って、軽くスクレイピングをしました。

ちょっとしたサンプル的として、まとめてみました!

軽いものなら、「今回のこと+Pythonの知識」でカバーできるんじゃないでしょうか。

今回試したこと

このようなことを行っています。

  1. SeleniumでChromeを立ち上げる
  2. このブログのトップにアクセス
  3. h1タグを取得
  4. 取得した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はこちらからダウンロードできます。

chromedriver.chromium.org

「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()などを扱うという意味では同様