アメリエフの技術ブログ

Amelieff Staff Blog

Seleniumでスクレイピング

f:id:adachit:20211029175340p:plain

こんにちは、adachitです。
先日、PythonライブラリのSeleniumでスクレイピングを行ったので、そちらについてご紹介していこうと思います。
今回はChromeSeleniumを使ってスクレイピングを行います。

環境

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の「ニュース」からニュースのタイトルを取得したいと思います。
f:id:adachit:20211029173434p:plain 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を確認したい場合、以下のような手順で確認します。

  1. 取得したい要素を右クリック
  2. 「検証」を選択 f:id:adachit:20211029173552p:plain
  3. 右側に出てくるHTMLから取得した要素を探し、右クリックから「Copy」→「Copy full xpath」を選択 f:id:adachit:20211029173700p:plain

取得した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を使うことで情報収集や業務効率化に役立つと思いますので、是非使ってみてください。