AWS lambdaで気象庁のサイトから天気図(24時間予想図、48時間予想図)のURLを取得しようとしています。
https://www.jma.go.jp/bosai/weather_mapに接続後
「▷」ボタンを押して表示される24時間予想図のURLを取得したいのですが、
ローカルでテストすると正しいアドレスが取得できるのですが、
AWS lambdaで実行すると違うアドレスが取得されてしまします。
当初はうまくいっていたのですが、なにかのタイミングでおかしなアドレスが取得されるようになってしましました。
解決方法についてご教授願います。
気象庁のサイトのjavascriptが実行環境によって異なった動きをするとかでしょうか?
python
1#気象庁天気図 24時間予想図、48時間予想図のURLを取得 2#https://www.jma.go.jp/bosai/weather_map 3 4import time 5import urllib.error 6import urllib.request 7 8from selenium import webdriver 9from bs4 import BeautifulSoup 10 11 12#webdriver_path = "/opt/python/bin/chromedriver" #AWS Lambda実行時 13webdriver_path = "c:/chromedriver/chromedriver" #ローカル実行時 14 15# webdriber.chrome option 設定 16options = webdriver.ChromeOptions() 17options.add_argument("--headless") 18options.add_argument("--disable-gpu") 19options.add_argument("--window-size=1704x1078") 20options.add_argument("--disable-application-cache") 21options.add_argument("--disable-infobars") 22options.add_argument("--no-sandbox") 23options.add_argument("--hide-scrollbars") 24options.add_argument("--enable-logging") 25options.add_argument("--log-level=0") 26options.add_argument("--single-process") 27options.add_argument("--ignore-certificate-errors") 28options.add_argument("--homedir=/tmp") 29#options.binary_location = "/opt/python/bin/headless-chromium" #AWS Lambda実行時 30 31 32 33def lambda_handler(event, context): 34 35 #========= 24時間予想図、48時間予想図のURLを取得してを保存 ============= 36 37 print() 38 print("========= 24時間予想図、48時間予想図 =========") 39 40 driver = webdriver.Chrome(webdriver_path, chrome_options=options) 41 42 url = "https://www.jma.go.jp/bosai/weather_map" 43 driver.get(url) 44 title = driver.title 45 46 print("URL: "+url +" --- title: "+ title) 47 48 time.sleep(3) 49 50 #24時間予想図 51 # 「⇒」ボタンをクリックする 52 driver.find_element_by_xpath("//img[@src='../common/image/slider_skip_forward_y.svg']").click() 53 54 # 天気図のアドレスを取得して表示 55 soup = BeautifulSoup(driver.page_source, "html5lib") 56 image_td24 = soup.find('td', class_='weather-map-viewarea') 57 adress24 = "https://www.jma.go.jp/bosai/weather_map/" + image_td24.find("img")["src"] 58 print("24時間予想図---> "+adress24) 59 60 time.sleep(3) 61 62 #48時間予想図 63 # 「⇒」ボタンをクリックする 64 driver.find_element_by_xpath("//img[@src='../common/image/slider_skip_forward_y.svg']").click() 65 66 # 天気図のアドレスを取得して表示 67 soup2 = BeautifulSoup(driver.page_source, "html5lib") 68 image_td48 = soup2.find('td', class_='weather-map-viewarea') 69 adress48 = "https://www.jma.go.jp/bosai/weather_map/" + image_td48.find("img")["src"] 70 print("48時間予想図---> "+adress48) 71 72 73print(lambda_handler(0,0)) #ローカル実行時 74 75
ローカル上で次の環境で実行
24時間予想図---> https://www.jma.go.jp/bosai/weather_map/data/png/20210517053001_0_Z__C_010000_20210517000000_MET_CHT_JCIfsas24_Rjp_JCP600x581_JRcolor_Tjmahp_image.png
「令和3年5月18日9時の予想 24時間予想図」
48時間予想図---> https://www.jma.go.jp/bosai/weather_map/data/png/20210517065930_0_Z__C_010000_20210517000000_MET_CHT_JCIfsas48_Rjp_JCP600x581_JRcolor_Tjmahp_image.png
「令和3年5月19日9時の予想 48時間予想図」
AWS Lambda上で次の環境で実行
headless chrome=64.0.3282.167
chromedriver=2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7),platform=Linux 4.14.225-175.364.amzn2.x86_64 x86_64)
<結果> 取得アドレスがおかしい
24時間予想図---> https://www.jma.go.jp/bosai/weather_map/data/png/20210516021231_0_Z__C_010000_20210516000000_MET_CHT_JCIspas_JCP600x581_JRcolor_Tjmahp_image.png
「令和3年5月16日9時」
48時間予想図---> https://www.jma.go.jp/bosai/weather_map/data/png/20210516021231_0_Z__C_010000_20210516000000_MET_CHT_JCIspas_JCP600x581_JRcolor_Tjmahp_image.png
「令和3年5月16日9時」
AWS Lambda上で次の環境で実行
headless chrome=67.0.3396.99
chromedriver=2.40.565383 (76257d1ab79276b2d53ee976b2c3e3b9f335cde7),platform=Linux 4.14.225-175.364.amzn2.x86_64 x86_64
<結果> 以下のようなエラーが発生
{
"errorMessage": "Message: no such element: Unable to locate element: {"method":"xpath","selector":"//img[@src='../common/image/slider_skip_forward_y.svg']"}\n
(Session info: headless chrome=67.0.3396.99)\n (Driver info: chromedriver=2.40.565383 (76257d1ab79276b2d53ee976b2c3e3b9f335cde7),platform=Linux 4.14.225-175.364.amzn2.x86_64 x86_64)\n",
"errorType": "NoSuchElementException",
"stackTrace": [
" File "/var/task/lambda_function.py", line 52, in lambda_handler\n
driver.find_element_by_xpath("//img[@src='../common/image/slider_skip_forward_y.svg']").click()\n",
" File "/opt/python/selenium/webdriver/remote/webdriver.py", line 394, in find_element_by_xpath\n
return self.find_element(by=By.XPATH, value=xpath)\n",
あなたの回答
tips
プレビュー