rubyでクローラーを作っていたのですが、クローラーで取ってきたデータを解析するのであればpythonの方が便利じゃね?っていう助言を頂いたので、pythonを使ってみました。
今回やったのは、seleniumからGoogle Choromeを呼び出して自動ログインし、スクレイピングする作業。
忘れないうちにアウトプットして、知識を定着させたい。
作るもの
cookpadに自動ログインし、カレーを検索して、タイトル一覧を取得してくる。
休日カレーを作っていたので、なんとなくこんな題材にしました。
環境設定
seleniumのインストールをして下さい。
pip install selenium
seleniumから呼び出すweb driverのインストール
brew tap homebrew/cask
brew install chromedriver
brew tap homebrew/cask
でhomebrewを更新しておくの重要です!
https://qiita.com/w5966qzh/items/4c1164bd7c611820c187
実際に書いていく
1. moduleのimport
まずは、スクレイピングに必要なmoduleをimportします。
from selenium import webdriver # installしたseleniumからwebdriverを呼び出せるようにする
from selenium.webdriver.common.keys import Keys # webdriverからスクレイピングで使用するキーを使えるようにする。
import time # 今回は、プログラムをsleepするために使用
2. webdriver設定と最初にアクセスする画面
今回は、Google Chromeで自動操作を行うので、webdriverという変数にwebdriver.Chrome()
を入れます。
また、webdriver.Chrome()
から.get("ここにURLを入れる")
を呼び出す事でChoromeからURLにアクセス出来ます。
今回は、cookpadのログイン画面を指定しています。
webdriver = webdriver.Chrome()
webdriver.get("https://cookpad.com/identity/session/new?navigator_name=cookpad&navigator_parameters%5Burl%5D=%2F")
3. 入力欄に自動入力しよう
ログイン画面から、ユーザー名とパスワードを入力しなければなりません。
どうやって入力欄を認識させるかというとfind_element_by_xpath()
を使用し、引数に入力欄のxpathを渡してあげます。
xpathの調べ方、コピー方法は、メールアドレス欄にカーソルを置き、右クリックの検証で該当のソースを表示させます。該当のソースにカーソルを置き、Copy Xpathでコピー出来ます。
それでは、find_element_by_xpath()
で入力箇所のxpathを指定して、send_keys
で実際に入力したい文字列を入力します。
webdriver.find_element_by_xpath("//*[@id='login_form']/div/form/div[1]/div[1]/input").send_keys("入力したいメールアドレス")
webdriver.find_element_by_xpath("//*[@id='login_form']/div/form/div[1]/div[2]/input").send_keys("入力したいパスワード")
入力出来たら「ログインする」ボタンを押してあげたいので、ボタンをfind_element_by_css_selector
で指定してあげます。
タグ.class名の形式で引数にcss情報を渡すと指定出来ます。今回も検証を使ってソースコードの上にカーソルを載せると自動で、input.bottun.keys
がポップアップで出てきます。
もちろんソースコードを読んで、タグ.class名を読み取っても良いです。
では、find_element_by_css_selector
でどのボタンかを指定する事が出来たらclick()
でクリックします。
webdriver.find_element_by_css_selector("input.button.large").click()
ここで、ログイン処理に1、2秒かかるので、このコードの下にプログラムの実行を3秒休ませる処理を入れます。休ませる処理を入れないと連続でプログラムが画面入力しようとするので、ログイン処理中に入力され空振りします。
time.sleep(3)
topページに移動したら、また検証を使用して、検索画面にカレーを渡してクリックします。
webdriver.find_element_by_css_selector("input.search-field.global_search_keyword").send_keys("カレー")
webdriver.find_element_by_css_selector("input.button.min.global_search_submit_btn").click()
4.タイトルを表示しよう
表示されたページの1ページ目を対象とするので、range(1)にし、そのページのa.recipe-title
を取得して表示します。
for i in range(1):
titles = webdriver.find_elements_by_css_selector("a.recipe-title")
for title in titles:
print(title.text)
おまけ slackに通知しよう
salackwebをimportします。
import slackweb
slackweb.Slackでwebhookを設定し、slack.notifyで、titleを通知します。
slack = slackweb.Slack(url="webhook入力")
slack.notify(text="%s"%title.text)