AWS LambdaでSeleniumを使用してAmazonの商品ページから価格を抽出したいのですが、2022-11-17T03:47:55.471Z 88481555-0a9a-4186-8145-39ae34547d86 Task timed out after 60.12 seconds
とタイムアウトの表示が出てしまいます。
ローカルではAmazonの商品ページをスクレイピングできたのですが、なぜかLambda上ではできません。
また同じコードでAmazon以外のサイトはスクレイピングできることを確認しております。
なぜ取得できないか原因がわかる方がおられましたらご教授いただけると幸いです。
python
1import json 2from selenium import webdriver 3from selenium.webdriver.common.keys import Keys 4from selenium.webdriver.common.action_chains import ActionChains 5from selenium.webdriver.support.ui import WebDriverWait 6from selenium.webdriver.support import expected_conditions as EC 7from selenium.webdriver.common.by import By 8from selenium.webdriver.chrome.options import Options 9from datetime import datetime, timedelta 10from selenium.webdriver.chrome import service 11from selenium.webdriver.common.alert import Alert 12import time 13from datetime import datetime, date, timedelta 14import os 15 16# ########################### 17# 要素を取得する(単数) 18# ########################### 19def getElement(xpath, wait_second, retries_count): 20 error = '' 21 for _ in range(retries_count): 22 try: 23 # 失敗しそうな処理 24 selector = xpath 25 element = WebDriverWait(driver, wait_second).until( 26 EC.visibility_of_element_located((By.XPATH, selector)) 27 ) 28 except Exception as e: 29 # エラーメッセージを格納する 30 error = e 31 else: 32 # 失敗しなかった場合は、ループを抜ける 33 break 34 else: 35 exit() # プログラムを強制終了する 36 return element 37 38# ########################### 39# メイン処理 40# ########################### 41def lambda_handler(event, context): 42 43 url = event["url"] # URL例 → https://www.amazon.co.jp/gp/product/B086WYF2LQ 44 45 options = Options() 46 options.add_argument("--headless") 47 options.add_argument('--single-process') 48 options.add_argument('--disable-dev-shm-usage') 49 options.add_argument("--no-sandbox") 50 options.binary_location = '/opt/headless-chromium' 51 driver = webdriver.Chrome(executable_path="/opt/chromedriver", chrome_options=options) 52 53 driver.implicitly_wait(20) 54 55 driver.get(url) 56 title = driver.title 57 58 if title == "ページが見つかりません": 59 print("ページなし") 60 return { 61 'statusCode': 200, 62 'body': json.dumps("ページが見つかりません") 63 } 64 else: 65 print("ページあり") 66 67 price = getElement('//*[@id="corePriceDisplay_desktop_feature_div"]/div[1]/span[1]/span[2]/span[2]', 20, 3).text 68 print(price) 69 70 return { 71 'statusCode': 200, 72 'body': json.dumps(price) 73 }
回答1件
あなたの回答
tips
プレビュー