SeleniumでWebスクレイピング(3) データの取得とCSV出力
SeleniumでWebスクレイピング(3) データの取得とCSV出力
今度は、画面に表示されているデータをSeleniumで取得し、CSVに吐き出していきます。
値の抽出(1要素)
id指定
前ページの手順同様に、id要素を調べて要素を取得します
elem = browser.find_element_by_id('name')
取得した要素からテキストを抽出
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)