こんにちは!
私は自分のブログでこのような記事を書きました。
リンク先ではコードについての解説より、どのように動くのかをメインに解説していたので、本記事ではソースコードの解説を詳細にしようと思います!
ソースコード
ソースコードは以下の通りです。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
#Chromeオプション
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--no-sandbox')
options.add_argument('--lang=ja')
options.add_argument('--user-data-dir=' + 'ユーザーデータのディレクトリ')
# Chromeドライバーの起動
driver = webdriver.Chrome(r'driver/chromedriver.exe', chrome_options=options)
# くじ一覧にアクセスする
driver.get("https://rakucoin.appspot.com/rakuten/kuji/")
urls = driver.find_elements_by_xpath ("//table/tbody/tr/td/a")
url_txts = [urls[i].get_attribute("href") for i in range(len(urls)-2)]
for i in range(len(url_txts)):
driver.get(url_txts[i])
#もしまだくじを引いてなかったら
print("Accessing " + url_txts[i])
if(len(driver.find_elements_by_id("entry"))>0):
print("success")
time.sleep(2)
start_button = driver.find_element_by_id("entry")
start_button.click()
time.sleep(20)
else:
print("faiiled")
time.sleep(2)
continue
driver.close()
driver.quit()
exit()
Seleniumの準備については詳しいページが多々あるので、そちらに譲ります。
では順に解説をしていきます。
Chromeドライバのオプションについて
#Chromeオプション
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--no-sandbox')
options.add_argument('--lang=ja')
options.add_argument('--user-data-dir=' + 'ユーザーデータのディレクトリ')
# Chromeドライバーの起動
driver = webdriver.Chrome(r'driver/chromedriver.exe', chrome_options=options)
実践/現場のPythonスクレイピング
こちらの記事などに解説されていますが、一応どのような環境においても動くためのオプションです。
くじ一覧にアクセスする
# くじ一覧にアクセスする
driver.get("https://rakucoin.appspot.com/rakuten/kuji/")
urls = driver.find_elements_by_xpath ("//table/tbody/tr/td/a")
url_txts = [urls[i].get_attribute("href") for i in range(len(urls)-2)]
こちらのリンクでは、その時に開催されているくじをまとめてくださっています。
そちらを利用してurl_txtsにリンクを格納します。
くじを引いていく
for i in range(len(url_txts)):
driver.get(url_txts[i])
#もしまだくじを引いてなかったら
print("Accessing " + url_txts[i])
if(len(driver.find_elements_by_id("entry"))>0):
print("success")
time.sleep(2)
start_button = driver.find_element_by_id("entry")
start_button.click()
time.sleep(20)
else:
print("faiiled")
time.sleep(2)
continue
driver.close()
driver.quit()
exit()
url_txtsに格納したリンクに一つずつ大人しくアクセスしていきます。
Seleniumの動作の高速さゆえ、処理が間に合わないところもあるので、所々time.sleepを入れ込んでいます。
時々何らかの原因で、くじページにアクセスできなかったり、既に引いてしまったくじページにアクセスしてしまったりするので、その際は"failled"と表示することにします。
一通り処理が終わったら、SeleniumとPythonの動作を終了します。
まとめ
このようにそれほど長くないコードでくじの自動化ができました。
本当はheadlessにしてHeroku上で自動実行したいのですが、ユーザーディレクトリを上手く読み込んでくれないようで困っています。
一々楽天アカウントにログインするのも不審ですしね…