この記事を読むべき人
- 食品メーカー勤務
- セールス(営業部)
- 小売や卸と商談の機会がある
- 自社製品のチラシ掲載などの販促実施を、小売店にお願いしている
この記事が目指すこと
- 自分が担当している小売店のチラシを、チラシサイト「トクバイ」から取得する
- 取得したチラシを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()
実装方法
後日追記予定