酒とITと私

PythonのSeleniumでスクレイピングしてCSV出力

勉強会にて、分析用のデータセットを集めるためにPythonのSeleniumでスクレイピングしてCSV出力するコードを書いたのでメモ。

Firefoxでやってるけど、特に意味はない。コーディング段階はJupyterでやったけど、途中までのコーディングをもとに次のコード試行錯誤できておススメ。

スポンサーリンク

geckodriverのインストール

なにはともあれば、geckodriverが必要です。月光ドライバーカッコいい。まあ、Firefoxを動かしてくれるやつです。まずは、こちらからgeckodriverをダウンロードします。2017/12/17時点での最新はv0.19.1でした。使う時点で最新のものを使ってください。

ダウンロードしたら解凍してください。あとで、PATHを通す(PCに対してgeckodriverの在りかを教えてあげる)ので分かりやすい所の方がいいです。

解凍したらPATHを通すわけですが、windows,Macそれぞれ下記を参照ください。笑

Windows:Windows10でTempやPathなどの環境変数を設定する方法

Mac:Macの環境変数の書き方を整理してみた

webページ取得

まずはwebページを取得します。取得したwebページに対して色々操作していく形になります。

# selenium読み込み
from selenium import webdriver
# csv操作オブジェクト読み込み
import csv

# Firefox用のドライバーを取得
driver = webdriver.Firefox()
#webページ取得
driver.get("http://www.baseball-lab.jp/player/search")

seleniumが入っていない場合は、

pip install selenium

してインストールしてください。

CSVへの出力

取ってきたデータをCSVに出力します。以下は、とりあえずCSVの1行目(ヘッダー)を出力したコードです。

# csvのヘッダー作成
# ファイルオープン
f = open('output.csv', 'w')
writer = csv.writer(f, lineterminator='\n')

# データをリストに保持
csvlist = []
csvlist.append("name")
# 付けたいヘッダーの数だけappendする

# 出力
writer.writerow(csvlist)

# ファイルクローズ
f.close()

中身のにデータを入れていくときも、基本的にリスト(name = [])にデータをappendしていって、そのリストを、writer.writerow(name)で中に書き込むだけです。f.close()は書き込みが全部終わったあとにやります。

クリック

seleniumのよい所は動的なページでも操作できるところです。今回は検索ボタンをクリックして出てきた結果を取得することが必要だったので、ボタンをクリックしました。

driver.find_element_by_css_selector("cssのセレクター").click()

cssのセレクターについては、このへんを見てください。要は、HTMLの要素を、特定のルールに従って抽出するための記法です。ちなみに、↑の書き方はFirefoxのパターンです。Chromeだとまた違うかも。

あと、操作したい要素がどのcss使っているかを知りたいときは、web画面上で知りたい要素にカーソルを当てて、右クリックして、「検証」みたいなやつを押すと見れます。

データの抽出

取り出したいデータが見えるページまでいけば、あとはデータを抽出するだけです。

# #hit_number の数字を取る
# valueにデータが入っておらず、タグに囲まれているだけのパターン
hit_number = driver.find_element_by_css_selector("#hit_number").text

# valueにデータが入っている場合
data_object = driver.find_element_by_css_selector("#someselecter")
data = data_object.get_attribute("value")

なんか適当にごそごそやったら取れます。

ドライバーをcloseする

使ったら直す。開けたら閉める。基本ですね。

driver.close()

こんな感じで任意のwebページに対して色々な操作及びデータの取得が可能です。他にも色々できるのでリファレンスを見てこれから勉強していきます。