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

rubyでクローラーを作っていたのですが、クローラーで取ってきたデータを解析するのであればpythonの方が便利じゃね？っていう助言を頂いたので、pythonを使ってみました。

今回やったのは、seleniumからGoogle Choromeを呼び出して自動ログインし、スクレイピングする作業。
忘れないうちにアウトプットして、知識を定着させたい。

## 作るもの

cookpadに自動ログインし、カレーを検索して、タイトル一覧を取得してくる。
休日カレーを作っていたので、なんとなくこんな題材にしました。

## 環境設定
seleniumのインストールをして下さい。

```py
pip install selenium
```
seleniumから呼び出すweb driverのインストール

```py
brew tap homebrew/cask
brew install chromedriver
```

```brew tap homebrew/cask```でhomebrewを更新しておくの重要です！
https://qiita.com/w5966qzh/items/4c1164bd7c611820c187

## 実際に書いていく

### 1. moduleのimport

まずは、スクレイピングに必要なmoduleをimportします。

```python
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のログイン画面を指定しています。

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

<img width="934" alt="スクリーンショット 2019-04-16 6.55.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343136/c702a15e-08f3-64e4-5f3e-66c05555ab3d.png">

それでは、```find_element_by_xpath()```で入力箇所のxpathを指定して、```send_keys```で実際に入力したい文字列を入力します。

```py
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名を読み取っても良いです。

<img width="901" alt="スクリーンショット 2019-04-16 7.02.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343136/1fb3f38d-8c61-5daa-04ce-f01f681c4883.png">

では、```find_element_by_css_selector```でどのボタンかを指定する事が出来たら```click()```でクリックします。

```py
webdriver.find_element_by_css_selector("input.button.large").click()
```

ここで、ログイン処理に1、2秒かかるので、このコードの下にプログラムの実行を3秒休ませる処理を入れます。休ませる処理を入れないと連続でプログラムが画面入力しようとするので、ログイン処理中に入力され空振りします。

```py
time.sleep(3)
```
topページに移動したら、また検証を使用して、検索画面にカレーを渡してクリックします。

```py

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.タイトルを表示しよう

表示されたページの１ページ目を対象とするので、range(1)にし、そのページの```a.recipe-title```を取得して表示します。

``` py
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します。

```py
import slackweb
```

slackweb.Slackでwebhookを設定し、slack.notifyで、titleを通知します。

```py
slack = slackweb.Slack(url="webhook入力")
slack.notify(text="%s"%title.text)
```