こんにちは、adachitです。
先日、PythonライブラリのSelenium
でスクレイピングを行ったので、そちらについてご紹介していこうと思います。
今回はChrome
とSelenium
を使ってスクレイピングを行います。
環境
OS : macOS Big Sur (バージョン11.4)
メモリ : 16 GB
Python : 3.8.5 (Anaconda)
Chrome : 95.0.4638.54
必要なツール
- selenium (Pythonライブラリ)
- Chrome
- chromedriver
インストール
今回は、Anacondaで環境を構築しました。
ローカルに環境を構築しておいても良いのですが、Chromeとchromedriverのバージョンが一致していないとSeleniumの実行ができなくなるため、手軽にchromedriverのバージョン変更が可能なAnacondaを選択しました。
$ conda create --name scraping python=3.8 $ conda activate scraping
1. Seleniumのインストール
今回は、Anacondaなのでconda install
でseleniumをインストールします。
$ conda install -c conda-forge selenium
2. Chromeのインストール
もし、Chromeをインストールをしていない方は下記リンクよりChromeをインストールしてください。
Google Chrome
3. chromedriverのインストール
chromedriverをインストールする前に、Chromeのバージョンを確認します。
バージョンは、メニューバーの「Chrome」→「Google Chromeについて」から確認することができます。
現在、私が使用しているChromeはバージョン95.0.4638.54でした。
conda search
でchromedriverを検索し、バージョンの最初の数字(95)が一致しているリポジトリを探します。
$ conda search -c conda-forge python-chromedriver-binary ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ python-chromedriver-binary 93.0.4577.15.0 py38h50d1736_0 conda-forge python-chromedriver-binary 93.0.4577.15.0 py39h6e9494a_0 conda-forge python-chromedriver-binary 95.0.4638.10.0 py36h79c6626_0 conda-forge python-chromedriver-binary 95.0.4638.10.0 py37h5186d4c_0 conda-forge python-chromedriver-binary 95.0.4638.10.0 py37hf985489_0 conda-forge python-chromedriver-binary 95.0.4638.10.0 py38h50d1736_0 conda-forge python-chromedriver-binary 95.0.4638.10.0 py39h6e9494a_0 conda-forge python-chromedriver-binary 95.0.4638.17.0 py36h79c6626_0 conda-forge python-chromedriver-binary 95.0.4638.17.0 py37h5186d4c_0 conda-forge python-chromedriver-binary 95.0.4638.17.0 py37hf985489_0 conda-forge python-chromedriver-binary 95.0.4638.17.0 py38h50d1736_0 conda-forge python-chromedriver-binary 95.0.4638.17.0 py39h6e9494a_0 conda-forge
この中から、バージョンの数字が「95」で始まるものを選択しインストールします。
$ conda install -c conda-forge python-chromedriver-binary=95.0.4638.17.0
以上で、Seleniumを使う準備は完了です。
スクレイピングの実行
Seleniumを使って、弊社アメリエフHPの「ニュース」からニュースのタイトルを取得したいと思います。
Seleniumにおける要素の取得メソッドは、find_element_by_XXX
という形になっており、idやクラス名を指定して要素を取得することができます。
- 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」に複数形の「s」を付けると該当する要素をすべて取得することができます。
今回は、xpathを使います。xpathは、HTMLにおける階層構造を表現しています。
Chromeで要素のxpathを確認したい場合、以下のような手順で確認します。
- 取得したい要素を右クリック
- 「検証」を選択
- 右側に出てくるHTMLから取得した要素を探し、右クリックから「Copy」→「Copy full xpath」を選択
取得したxpathをペーストすると、
/html/body/div[1]/div[4]/div/div/ul/li[1]/a
のようになっています。
このxpathをfind_elements_by_xpath
の引数に用います。
しかし、このxpathは1つ目のニュースの「微生物・感染症研究向け解析システム開発サービスの提供開始
」へしかアクセスできず、すべてのニュースを取得できません。なので、xpathのli[1]
の[1]
を削除して使用します。こうすることで、同じ階層に位置するすべてのニュースを取得することができます。
それでは、実際にスクリプトを作成して結果を確認してみます。
ファイル名:scraping.py
#! /usr/bin/python -u # -*- coding: utf-8 -*- from selenium import webdriver # webdriverのインスタンス化 # executable_pathにはchromedriverへのpathを記入 driver = webdriver.Chrome(executable_path="/Users/adachit/anaconda3/envs/selenium/lib/python3.8/site-packages/chromedriver_binary/chromedriver") # アメリエフのHPへアクセス driver.get("https://amelieff.jp/") # xpathで要素を取得 elements = driver.find_elements_by_xpath("/html/body/div[1]/div[4]/div/div/ul/li/a") # 取得した要素を一つずつ表示 for element in elements: print(element.text)
上記のスクリプトを実行します。
$ python scraping.py 微生物・感染症研究向け解析システム開発サービスの提供開始 基礎研究からビジネスまで「データ解析×システム開発の複合的課題」を解決 【厚生労働省委託事業】臨床におけるがんのゲノム解析研修会特設サイトを公開しました 【九州プロサーチ・アメリエフ・PHCホールディングス合同】メタボロミクスによる薬剤応答メカニズムの解明と新たな展開 統合解析のデータ解析コンサルティングを開始しました CUT&RUN-seqの受託解析サービスを開始しました
表示されているニュースをすべて取得することができました!
まとめ
今回は、Seleniumでスクレイピングする方法についてご紹介しました。
Seleniumでは今回紹介したような単純なことだけでなく、Webブラウザを操作し複雑な処理を実行することができます。
Seleniumを使うことで情報収集や業務効率化に役立つと思いますので、是非使ってみてください。