57
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

pythonで自動入力、スクレイピングをしてみる

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でコピー出来ます。

スクリーンショット 2019-04-16 6.55.16.png

それでは、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名を読み取っても良いです。

スクリーンショット 2019-04-16 7.02.57.png

では、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)

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
57
Help us understand the problem. What are the problem?