SeleniumでWebスクレイピング(3) データの取得とCSV出力

SeleniumでWebスクレイピング(3) データの取得とCSV出力


今度は、画面に表示されているデータをSeleniumで取得し、CSVに吐き出していきます。



値の抽出(1要素)

id指定

  1. 前ページの手順同様に、id要素を調べて要素を取得します

    elem = browser.find_element_by_id('name')
    
  2. 取得した要素からテキストを抽出

    elem.text
    

    Jupyter上でShift+Enterを押して実行し、下記のように値が取得できているか確認してください。

    '抽出した値'
    


class指定

elem = browser.find_element_by_class_name('name')

最初にヒットしたclassの要素が抽出できます


tag指定

elem = browser.find_element_by_tag_name('h2')

最初にヒットしたHTMLタグの要素が抽出できます


他にもいくつか取得方法があるので、調べてみてください。


値の抽出(複数要素)

要素が1つであれば上記の方法でよいですが、複数個ありすべてを取り出したい場合は、以下のようにelements系のメソッドを使用することで、配列で取得できます。

elems = browser.find_elements_by_tag_name('th')

#最初の要素を表示
print(elems[0].text)

#すべて表示
for elem in elems:
    print(elem.text)


CSVで出力

table要素で書かれたデータを取得し、CSVに書き出してみます。


Pandasのインストール

pip install pandas


データの取得

最初に、Pandasをimportします

import pandas as pd

まずはth,td要素を取り出して、keys、valuesという変数に値を入れておきます。

elems = browser.find_elements_by_tag_name('th')
keys = []
for elem in elems:
    keys.append(elem.text)

elems = browser.find_elements_by_tag_name('td')
values = []
for elem in elems:
    values.append(elem.text)

Pandasを使ってデータフレームを作り、その中に値を入れます。

df = pd.DataFrame()
df['keys'] = keys
df['vales'] =values

jupyterで以下を実行すると、表形式で値が表示されます

df


CSV書き出し

以下で書き出せます。

df.to_csv('output.csv')

最初の連番が不要であれば、以下のようにindexlにFalseを指定します。

df.to_csv('output.csv', index=False)


文字列の扱い

抽出した値は文字列のため、あとはPythonの文字列の扱いと同じです。

いくつか役立ちそうなものをピックアップしてまとめます。


type(elem.text)
str


整形

%xxでフォーマット記載し、後ろの%以降に変数を列挙

first_name = 'Taro'
family_name = 'Yamada'
print('My name is %s.' % first_name)
print('My name is %s %s.' % (family_name, first_name))
My name is Taro.
My name is Yamada Taro.


置換(replace)

s = 'abcdef'
ss = s.replace('c', 'g')
print(ss)
abgdef


n文字目の抽出

s = 'abcdef'
print(s[2])
c


n文字目からm文字抽出

s = 'abcdef'
print(s[2:4])
cd


両端の空白削除

s = '  abcdef  '
print('<' + s.strip() + '>')
<abcdef>


他にもいろいろあるので、例えば下記を参考にしてください。

https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887


ここまでのコード

from selenium import webdriver
import pandas as pd

#ブラウザを開く
browser = webdriver.Chrome()
browser.get('https://url/to/login/page')

#データの取得
elems = browser.find_elements_by_tag_name('th')
keys = []
for elem in elems:
    keys.append(elem.text)
elems = browser.find_elements_by_tag_name('td')
values = []
for elem in elems:
    values.append(elem.text)

#データフレームに保存
df = pd.DataFrame()
df['keys'] = keys
df['vales'] =values

#CSV書き出し
df.to_csv('output.csv', index=False)