勉強会にて、分析用のデータセットを集めるために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などの環境変数を設定する方法
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ページに対して色々な操作及びデータの取得が可能です。他にも色々できるのでリファレンスを見てこれから勉強していきます。