下記手順でスクレイピングしようとしてますが、herokuからのアクセスのみ、うまくアクセスできません。ローカルでは、アクセスできます。
実行したコードは下記になります。
python
1# -*- coding: utf-8 -*- 2from selenium.webdriver.common.alert import Alert 3from selenium import webdriver 4import os 5import time 6import logging 7wtime = 15 8ztime = 2 9def reserving_tm(start_day,driver): 10 open('tm.log', "w+").close 11 logging.basicConfig(filename='tm.log', level=logging.DEBUG) 12 for i in range(2): 13 try: 14 options = webdriver.ChromeOptions() 15 if(os.path.isfile("E:\scprogram\chromedriver.exe")):#ローカル用 16 #options.add_argument('--headless') 17 #options.add_argument('--disable-gpu') 18 chromedriver_path = "E:\scprogram\chromedriver.exe" 19 driver = webdriver.Chrome(chromedriver_path, options=options) 20 else: #heroku用 21 options.binary_location = '/app/.apt/usr/bin/google-chrome' 22 options.add_argument('--headless') 23 options.add_argument('--disable-gpu') 24 driver = webdriver.Chrome(options=options) 25 driver.get("https://resv.city.meguro.tokyo.jp/Web/Home/WgR_ModeSelect") 26 time.sleep(ztime) 27 s = driver.page_source.replace(" ","").replace("\n","").replace("\t","") 28 print(s[0:300]) 29 print(driver.current_url) # URLを確認する 30 break 31 except: 32 print("NG") 33 log_print() 34 driver.close()# ブラウザを閉じる 35 driver.quit() # chromedriver.exeを閉じる 36 raise 37 log_print() 38 driver.close()# ブラウザを閉じる 39 driver.quit() # chromedriver.exeを閉じる 40 return [] 41def log_print(): 42 tmp = open('tm.log', "r").read() 43 print(tmp) 44 open('tm.log', "r").close 45def popup_click(driver,sss): 46 while True: 47 try: 48 Alert(driver).accept() #ポップアップが出てきた時にクリックする。 49 if(sss != ""): 50 print("P1",sss) 51 except: 52 if(sss != ""): 53 print("P2",sss) 54 break 55if __name__ == "__main__": 56 print(reserving_tm("","")) 57
とすると問題なくスクレイピングできる時(ローカル環境)は、下記のようなログが出てきます
OK
1#print(s[0:300])の結果###### 2<!DOCTYPEhtml><!--[ifIE8]><htmlclass="lt-ie9ie8"lang="ja"><![endif]--><!--[ifIE9]><htmlclass="lt-ie10ie9"lang="ja"><![endif]--><!--[if(gteIE10)|!(IE)]><!--><htmlxmlns="http://www.w3.org/1999/xhtml"lang="ja"><!--<![endif]--><head><metacharset="utf-8"/><title>目黒区施設予約システム</title><metahttp-equiv="Pragma 3#print(driver.current_url)の結果###### 4https://resv.city.meguro.tokyo.jp/Web/Home/WgR_ModeSelect 5#print(tmp)の結果(長いので後半は省略)###### 6DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:50445/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}} 7DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:50445 8DEBUG:urllib3.connectionpool:http://127.0.0.1:50445 "POST /session HTTP/1.1" 200 825 9DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 10DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:50445/session/8aa11c1ed44e39e9cc373653ca868a0c/url {"url": "https://resv.city.meguro.tokyo.jp/Web/Home/WgR_ModeSelect", "sessionId": "8aa11c1ed44e39e9cc373653ca868a0c"} 11DEBUG:urllib3.connectionpool:http://127.0.0.1:50445 "POST /session/8aa11c1ed44e39e9cc373653ca868a0c/url HTTP/1.1" 200 72 12DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 13DEBUG:selenium.webdriver.remote.remote_connection:GET http://127.0.0.1:50445/session/8aa11c1ed44e39e9cc373653ca868a0c/source {"sessionId": "8aa11c1ed44e39e9cc373653ca868a0c"}
NGな時は下記のようになり、「print(tmp)」の結果に大きな差異がありました。
sessionIdが空になっています。
NG
1#print(s[0:300])の結果###### 2<html><head><script>start("/");</script><script>addRow("app","app",1,4096,"4.0kB",1590819313,"5/30/20,6:15:13AM");</script><script>addRow("bin","bin",1,4096,"4.0kB",1590657682,"5/28/20,9:21:22AM");</script><script>addRow("dev","dev",1,380,"380B",1590818537,"5/30/20,6:02:17AM");</script><script>addRo 3#print(driver.current_url)の結果###### 4file:/// 5#print(tmp)の結果(長いので後半は省略)###### 6DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51328/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "binary": "/app/.apt/usr/bin/google-chrome", "args": ["--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "--headless", "--disable-gpu"]}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "binary": "/app/.apt/usr/bin/google-chrome", "args": ["--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "--headless", "--disable-gpu"]}}} 7DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:51328 8DEBUG:urllib3.connectionpool:http://127.0.0.1:51328 "POST /session HTTP/1.1" 200 679 9DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 10DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51328/session/df06546271cc0a1c21f285cbf4de46c4/url {"url": "https://resv.city.meguro.tokyo.jp/Web/Home/WgR_ModeSelect"} 11DEBUG:urllib3.connectionpool:http://127.0.0.1:51328 "POST /session/df06546271cc0a1c21f285cbf4de46c4/url HTTP/1.1" 200 14 12DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 13DEBUG:selenium.webdriver.remote.remote_connection:GET http://127.0.0.1:51328/session/df06546271cc0a1c21f285cbf4de46c4/source {}
webサーバー側が発行するsessionIdが取得できていないため、通信中のユーザーを識別できずにwebサイトが取得できていないようです。何か良い方法を知っていましたら教えていただけると助かります。ちなみに上記には記載してませんが、user_agentを変えてもアクセスできず、headlessモードを使わない状態でも無理でした。