gspreadを利用してスクレイピングした内容をスプレッドシートに自動入力

# スクレイピング内容をスプレッドシートに自動で入力する
クラウドソーシングに絶えず投稿されている業務内容に、「指定のWEBサイトの情報を取得し表計算ソフトにデータを入力する」というものがあります。今回行う流れは、このような形になります。
```mermaid
graph TD;
    WebサイトにRequestを利用してアクセス-->bs4を利用してHTML,CSSをパース;
    bs4を利用してHTML,CSSをパース-->パースしたデータをリスト化;
    パースしたデータをリスト化-->リスト化したデータをスプレッドシートにgspreadを利用して自動入力;
```
## 用意するもの
まだインストールしていない方は __pipなどを利用して__ すべてインストールしてください。
```:ターミナル
$ pip install requests
$ pip install beautifulsoup4
$ pip install google
$ pip install gspread
$ pip install oauth2client

```

<dl>
  <dt>・Python3</dt>
  <dd>すべてのプログラムで動作します。</dd>
  <dt>・Requests</dt>
  <dd>pythonでWebサイトにアクセスするために利用するライブラリです。</dd>
  <dt>・Beautiful Soup 4 (bs4)</dt>
  <dd>WebサイトのHTMLをパースし、要素を取得するライブラリです。</dd>
  <dt>・gspread</dt>
  <dd>pythonからスプレッドシートにアクセスするためのモジュールです。</dd>
  <dt>・oauth2client</dt>
  <dd>スプレッドシートにアクセスする際の認証モジュールです。</dd>
</dl>

## １.実際にスクレイピングをする
今回は業務でありそうな内容を考えてみました。
__「alibabaで検索して出た商品の商品情報を取得し、スプレッドシートにデータ入力」__
という感じで行きたいと思います。
少なからずプログラミングができなければいけないので、できない人は[paizaラーニング](URL "https://paiza.jp/works/courses")の動画を見まくってください。
_____
### URLを解析
まずは、Alibabaの検索結果のリンクを解析します。
Alibabaの検索バーに「アイス」と入力し、検索します。

すると、リンクは以下のようになります。
https://japanese.alibaba.com/trade/search?IndexArea=product_en&CatId=&fsb=y&viewtype=&tab=all&SearchScene=&SearchText=%E3%82%A2%E3%82%A4%E3%82%B9
どうやら、 __searchText=__ 以下が検索したワードになっているようです。
詳しくは長くなるのでここでは省略しますが、一般的には日本語をHTML内に表記する際には「URLエンコーディング、デコーディング」が利用されています。今回はWeb上のツールでデコードしてみましょう。
>http://webadmin.jp/toolurlencode/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500912/884a185c-36b2-0686-670d-b470c0069ca7.png)



__UTF-8__ 規格でデコードされていることがわかりました。
では実際に、作業フォルダを作り、pythonファイルに「指定したワードで検索した結果のURL」を生成するプログラムを記述していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500912/5aaff180-7e65-d970-f5c4-244b08c98f92.png)

```python:main.py
from urllib.parse import quote

# URLエンコードするワード
keyword = "アイス"

# URLエンコード
encoded_keyword = quote(keyword, encoding='utf-8')

# URL生成
url = "https://japanese.alibaba.com/trade/search?tab=all&searchText=" + encoded_keyword

```
___________
### HTMLを取得しパース
では、検索したいワードからアクセス先のページのURLを生成することができたので、次は実際にアクセス先のHTMLを取得します。
今回は、RequestsとBeautiful Soupを利用します。

```python:main.py
import requests
from bs4 import BeautifulSoup

# URLにアクセスしてHTMLを取得
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
```
____
### 要素から取得したい情報を取得
Webページを開き、F12キーから開発者ツールを開き商品名が隠れているタグを探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500912/d1572591-90ac-4e4d-8dac-09b4db164a77.png)


商品名が、__h2__ タグに含まれていることがわかりました。
この要領で、商品名と値段を取得し並べて出力されるコードを記述します。
```python:main.py
for product in soup.find_all("div", class_="list-no-v2-main"):
  title_element = product.find("h2")
  title = title_element["title"]
  price = product.find("span", class_="elements-offer-price-normal__price").text
  print("商品名: "+title)
  print("値段: "+price)
```
実行結果が以下のようになっていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500912/ea7a7e0d-f31b-a6aa-352f-c16d08c88708.png)

## ２.スプレッドシートに入力
欲しい情報を取得することに成功したので、それをスプレッドシートに自動入力する作業に入ります。
gspreadのセットアップ方法については、以下の記事を御覧ください。
https://qiita.com/akabei/items/0eac37cb852ad476c6b9
### セットアップするコード
```python:main.py
import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']

credentials = ServiceAccountCredentials.from_json_keyfile_name('<JSONファイル名>.json', scope)
gc = gspread.authorize(credentials)
wks = gc.open('gspreadサンプル').sheet1

```
### リストを作成し、内容をスプレッドシートに自動入力
```python:main.py
sheet_name = 'alibaba'
worksheet_name = 'test' 
sheet = gc.open(sheet_name).worksheet(worksheet_name)

for product in soup.find_all("div", class_="list-no-v2-main"):
  title_element = product.find("h2")
  title = title_element["title"]
  price = product.find("span", class_="elements-offer-price-normal__price").text
  print("商品名: "+title)
  print("値段: "+price)



  header = ["title", "price"]
  data_list = [header]
  data_list.append([title,price])
  values = [title,price]
  sheet.append_row(values)
```
>タイトルと価格を取得した後、それぞれを表示します。その後、Googleスプレッドシートにデータを追加するための行を作成します。最初に、ヘッダー（列の名前）を追加します。それから、タイトルと価格を含むリストを作成し、データリストに追加します。

実行して、スプレッドシートに自動入力されたら成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500912/6ff2f2cf-5a49-b647-50d7-2ed999690688.png)