Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
49
Help us understand the problem. What is going on with this article?
@fujigaki

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

More than 1 year has passed since last update.

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)
49
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
fujigaki
業務系社内SEからWEB系に転職しました。 知識を定着させるためにアウトプットしようと思い、Qiitaにまとめています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
49
Help us understand the problem. What is going on with this article?