pythonを使用して｢トクバイ｣からチラシを毎日取得してDropboxにアップロードする(編集中)

# この記事を読むべき人
* 食品メーカー勤務
* セールス（営業部）
* 小売や卸と商談の機会がある
* 自社製品のチラシ掲載などの販促実施を、小売店にお願いしている

# この記事が目指すこと
* 自分が担当している小売店のチラシを、チラシサイト「トクバイ」から取得する
* 取得したチラシをDropboxにアップロードする
* これらの動作を「heroku」を使って自動化する

**この記事は以上の内容ですが、以下のように商談にいかすことができます。**
* Dropboxから過去のチラシ見て、いつどのように掲載されていたかを確認する
* 自社製品をチラシに掲載したことで売上にどのような影響があったかを商談で説明する


# 動作環境
#### Pythonのバージョン
```
>python --version
Python 3.10.10
```
Pythonを実行できる環境であることが前提なので、導入等は各自で行ってください。
#### moduleのバージョン（一部省略）
```
> pip list
Package            Version
------------------ ---------
beautifulsoup4     4.11.2
dropbox            11.36.0
requests           2.28.2
```

# コード
```main.py
import os
import dropbox
import re
from bs4 import BeautifulSoup
import requests

#header付きでbeautifulsoupを何度も使用するため関数を作成
def bs(url):
    headers = {"User-Agent":"Mozilla/5.0"}#headerを指定しないと403 forbiddenが返ってくるので、header付きでスクレイピング
    res = requests.get(url=url,headers=headers)
    soup = BeautifulSoup(res.content, "html.parser")
    return soup

#1.チラシがあるか確認→無ければ終了
def findleaf(url):
    atags = bs(url).find_all("a",target="_blank")# atagを検索
    hreftag = [atag for atag in atags if "leaflets" in atag.get("href")]# リスト内包表記で、atagsのうち、hrefがある物をリスト化
    full_leaf_url = "https://tokubai.co.jp" + hreftag[0].get("href")# チラシページのリンクを生成 ※hrefにリンクの後半が書かれている
    return full_leaf_url

#2.チラシがある場合、チラシをダウンロード
def getleaf(sn,leafpageurl):
    leaf_list=[]#チラシ名とチラシの画像URLを格納するリスト
    soup = bs(leafpageurl) # HTMLをインスタンス化
    ### HTMLからスクレイピング ********************************************
    containers = soup.find_all("div",class_="container",)# bottom_navigationから、全てのcontainerを取得
    for i,container in enumerate(containers):
        ### containerの内、other_leaflet_linkが存在するcontainerのみ取得：
        other_leaflet_link = container.find("a",class_="other_leaflet_link")
        if other_leaflet_link is not None:
            href = other_leaflet_link.get("href")# hrefタグ（＝URLの後半）を取得
            url = "https://tokubai.co.jp" + href# URLを結合し、[チラシを選択した状態のURL]を取得
            soup = bs(url)# チラシのページをインスタンス化
            leaflet = soup.find("img",class_="leaflet")# [チラシを選択した状態のURL]にアクセスして、imgタグ(=フルURLがある)を取得
            imgLink = leaflet.get("src")# imgタグ内のsrcからフルURLを取得
            img = other_leaflet_link.find("img")# imgタグ（alt=チラシの期間,class,src）を取得
            alt = img.get("alt")# imgタグから、altタグ（=チラシの期間）を取得
            try:# container_titleタグ(=チラシ名)がある場合に取得
                container_title = other_leaflet_link.find("div",class_="container_title").text()
                container_title = str(container_title)
            except:
                container_title = ""
            ### 末尾に、imgLinkの末尾番号=iを追加
            i = re.findall(r"\d+$",imgLink)[0] #findallはlistで返すので注意
            leafName = f"【{sn}】{alt} {container_title}[{i}]"
            leaf_list.append([leafName,imgLink])
            print(f"【{sn}】[{leafName}] was downloaded successfully.")
    return leaf_list

def extension_check_from_url(imgLink):
    if "jpg" or "jpeg" in imgLink:
        extension = ".jpg"
    elif "png" in imgLink:
        extension = ".png"
    elif "pdf" in imgLink:
        extension = ".pdf"
    else:
        extension = "jpg"
    return extension

def dbx(client,leafname,leafurl):
    extension = extension_check_from_url(leafurl)
    leafpath = "/shared_chirashi/" + leafname + extension
    client.files_save_url(leafpath, leafurl)
    print(f"[UPLOAD]{leafname}")

def getjpg(client, storename:str, url:str):
    leafpageurl = findleaf(url)
    leaf_list = getleaf(storename,leafpageurl)
    # dropboxアップロード
    for leaf in leaf_list:
        leafname = leaf[0]
        leafurl = leaf[1]
        dbx(client,leafname,leafurl)
    return leaf_list

def job():
    #Dropboxの認証(herokuの環境変数に指定してください)
    APP_KEY = os.environ["APP_KEY"]
    APP_SECRET = os.environ["APP_SECRET"]
    REFRESH_TOKEN = os.environ["REFRESH_TOKEN"]

    # 手入力する際はこっち↓
    # APP_KEY = ""
    # APP_SECRET = ""
    # REFRESH_TOKEN=""

    # refresh token からaccess tokenを生成
    client = dropbox.Dropbox(app_key=APP_KEY, app_secret=APP_SECRET,oauth2_refresh_token=REFRESH_TOKEN)
    client.refresh_access_token()
    # access tokenを使用して認証
    client = dropbox.Dropbox(app_key=APP_KEY, app_secret=APP_SECRET,oauth2_access_token=client._oauth2_access_token)

    store_list=\
    [["*店舗名1*", "https://tokubai.co.jp/*****"],
    ["*店舗名2*", "https://tokubai.co.jp/*****"],
    ["*店舗名3*", "https://tokubai.co.jp/*****"]]

    for store in store_list:
        storename = store[0]
        url = store[1]
        getjpg(client = client,storename = storename, url = url)

if __name__ == "__main__":
    job()

```
# 実装方法
後日追記予定