見出し画像

pythonとseleniumでAmazonのランキングをツイートするBotを作成してみた!のコード

前回作成したAmazonランキング取得のデータをツイートするBotを作成してみました。

コードですが動画で話している通り通常で使うところを少し変更してる部分があります。

img_pathとかshort_urlとかです。
Short_URLに関してはツイートする直前で処理するようにこちらのプログラムは変更しています。

今回の動画は7/5/21:00に公開予定です

https://youtu.be/7J50HRTVUR0

前回の動画


前回のコード

一応今回のコードに前回のコードも含まれています。

では、今回のコードです。

import schedule
import time
import random
import tweepy
from selenium import webdriver
import urllib
import requests
from time import sleep

#自分のキーやトークンを入れる。
api_key = ''
api_secret = ''
access_token = ''
access_token_secret = ''

 #自分のアソシエイトIDを入れる my_id = "associate_id"

# Process href
def process_href(myid,href):
   head = "https://www.amazon.co.jp/"
   dp_str = "dp/"
   asin_base = href.split(dp_str)
   asin = asin_base[-1][:10]
   url = f"{head}{dp_str}{asin}?tag={myid}"
   return url

def get_shortenURL(longUrl):
   sleep(1)
   url = 'https://api-ssl.bitly.com/v3/shorten'
   access_token = '65f6566c476a014242847833dcfe291490f9b47e'
   query = {
           'access_token': access_token,
           'longurl':longUrl
           }
   r = requests.get(url,params=query).json()['data']['url']
   return r

# 1時間ごとに実行したいため関数化する。
def get_rank():
   ranking_list = []
   # start Selenium
   driver = webdriver.Chrome('chromedriver')

   category_base = "https://www.amazon.co.jp/gp/bestsellers/"
   category_toy = "toys"
   category_toy_url = f"{category_base}{category_toy}/"
   print(category_toy_url)
   driver.get(category_toy_url)
   # for
   base_ele = driver.find_elements_by_css_selector('.a-section.a-spacing-none.aok-relative')
   for base in base_ele:
       ranking_item = {}
       rank_ele = base.find_element_by_css_selector('span')
       rank=rank_ele.text

       base_2 = base.find_element_by_css_selector('.aok-inline-block.zg-item')

       a_ele = base_2.find_element_by_css_selector('a')
       href = a_ele.get_attribute('href')
       comp_url = process_href(my_id,href)
       # あとでやった方が効率がよさそう(ツイートするときとかに)
       #short_url = get_shortenURL(comp_url)
       short_url = comp_url

       title_ele = a_ele.find_element_by_css_selector('.p13n-sc-truncated')
       title = title_ele.text

       evaluation_ele = base_2.find_element_by_css_selector('div > a')
       evaluation = evaluation_ele.get_attribute('title')
       try:
           price_ele = base_2.find_element_by_css_selector('.a-row')
           price = price_ele.text
       except:
           price_ele = base_2.find_element_by_css_selector('.a-link-normal.a-text-normal')
           price = price_ele.text

       img_ele = base_2.find_element_by_css_selector('img')
       img_url = img_ele.get_attribute('src')
       # パスを追加してそこに保存するようにする。名前はまだ、(日付カテゴリランク)とかがよさそう
       img_path = img_url
       # save picture
       #urllib.request.urlretrieve(img_url, 'img_path')

       ranking_item.update(img_path=img_path, rank=rank, title=title, short_url=short_url, evaluation=evaluation, price=price)
       #print(ranking_item)
       ranking_list.append(ranking_item)
   print('データ抽出完了')
   return ranking_list

def tweet():
   ranking_list = get_rank()
   tweet_content = ranking_list[random.randint(0, 49)]
   rank = tweet_content["rank"]
   title = tweet_content["title"]
   short_url = get_shortenURL(tweet_content["short_url"])
   evaluation = tweet_content["evaluation"]
   price = tweet_content["price"]
   img_path = tweet_content["img_path"]
   
   tweet = f"{rank}\n{title}\n\n{evaluation}\n{price}\n{short_url}"
   print(tweet)

   auth = tweepy.OAuthHandler(api_key, api_secret)
   auth.set_access_token(access_token, access_token_secret)
   api = tweepy.API(auth)
   api.update_with_media(status=tweet, filename=img_path)
   print('ツイート完了')
   

schedule.every(1).hours.do(tweet)

while True:
   schedule.run_pending()
   time.sleep(1)   


いただいたサポートは全額勉強のために使わせていただきます。 という綺麗事もありなんですけど、ただただモチベーションの維持に使わせていただこうかなと考えています。 という遊び心も置いといて、有難いことに記事を買っていただけているのでサポートしたいという気持ちだけでも有難いです。