質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

HeadlessCMS

HeadlessCMS(ヘッドレスCM)とは、REST APIを用いてコンテンツを提供するCMS。そのため、あらゆるデバイスで表示することができます。フロントエンドとバックエンドの分離されており、フロントエンド側の高い自由度が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

1288閲覧

headless chrome で気象庁のサイトのスクリーンショットを取得した際、ローカルとAWS Lambdaで画像が違う

miyazy

総合スコア8

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

HeadlessCMS

HeadlessCMS(ヘッドレスCM)とは、REST APIを用いてコンテンツを提供するCMS。そのため、あらゆるデバイスで表示することができます。フロントエンドとバックエンドの分離されており、フロントエンド側の高い自由度が特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/05/29 15:32

気象庁の天気図のサイトのスクリーンショットをAWS Lambde定期的に取得しようとしています。
https://www.jma.go.jp/bosai/weather_map

ほぼ同時刻ローカルとAWS Lamdba実行した際に取得されるスクリーンショットの画像が違ってしまいます。
こちらの対策についてご教授願います。

2021年5月30日0時に実行
ローカルで実行 表示時刻 2021年5月29日21時の実況 
(普通にブラウザで接続した際と同じ内容、この画像を取得したい)
![ローカルで実行]

AWS Lamdbaで実行 表示時刻 2021年5月28日121時の実況 (通常接続と異なる画像が取得 1日前の状態)
AWS Lamdbaで実行

python

1#気象庁天気図サイトスクリーンショット取得 2#https://www.jma.go.jp/bosai/weather_map 3 4import time 5import os 6import boto3 7 8from selenium import webdriver 9 10webdriver_path = "/opt/python/bin/chromedriver" #AWS Lambda実行時 11#webdriver_path = "c:/chromedriver/chromedriver" #ローカル実行時 12 13localpath = "/tmp/" 14 15SCREEN_SHOT_PATH_NAME = "/tmp/screenshot.png" 16BUCKET_NAME = 'mybucket' 17OUTPUT_FILE_NAME = 'screenshot.png' 18 19 20# webdriber.chrome option 設定 21options = webdriver.ChromeOptions() 22options.add_argument("--headless") 23options.add_argument("--disable-gpu") 24options.add_argument("--window-size=1704x1078") 25options.add_argument("--disable-application-cache") 26options.add_argument("--disable-infobars") 27options.add_argument("--no-sandbox") 28options.add_argument("--hide-scrollbars") 29options.add_argument("--enable-logging") 30options.add_argument("--log-level=0") 31options.add_argument("--single-process") 32options.add_argument("--ignore-certificate-errors") 33options.add_argument("--homedir=/tmp") 34options.binary_location = "/opt/python/bin/headless-chromium" #AWS Lambda実行時 35 36 37 38def lambda_handler(event, context): 39 40 os.environ['HOME'] = '/opt/' 41 print("環境変数",os.environ['HOME']) 42 43 driver = webdriver.Chrome(webdriver_path, chrome_options=options) 44 45 url = "https://www.jma.go.jp/bosai/weather_map" 46 driver.get(url) 47 48 time.sleep(3) 49 50 imgname = localpath + "screenshot.png" 51 driver.get_screenshot_as_file(imgname) 52 print("スクリーンショット保存: "+url+" --> "+imgname) 53 54 #S3にアップロード 55 s3 = boto3.resource("s3") 56 s3.meta.client.upload_file(SCREEN_SHOT_PATH_NAME, BUCKET_NAME, OUTPUT_FILE_NAME) 57 58 59#print(lambda_handler(0,0)) #ローカル実行時 60 61

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

追記

実際にlambdaで同スクリプトを実行してみました。確かに同じ現象が起こります。
しかもリージョンが北米でも大阪でも結果が同様でした。

おそらくはjavascript上で返すDateがタイムゾーンなしのUTCで、ページ上での時刻処理に何らかの影響を及ぼしていると思います。(天気図HPのスクリプトはminifyされていて解析が困難です)
起点の時間が33時間前になっていると思われます(1日と9時間)

さらに不可解な挙動が、AWS上で「ひとつ前の時間を表示」ボタンをクリックするとひとつ前の天気図ではなく最も未来の予想天気図が表示されることです。
この状態で、さらに「ひとつ前の時間を表示」ボタンをクリックすると最新の実況天気図になります。

全く理屈が不明ですが、とりあえず「ひとつ前の時間を表示」を2回クリックすることで目的の天気図になります。

検証コード:

python

1 #ブラウザの定義 2 driver = webdriver.Chrome( 3 "/opt/headless/python/bin/chromedriver", 4 options=options 5 ) 6 7 driver.get(URL) 8 # scriptで画像表示処理をしているらしい。ちょっと待つ 9 time.sleep(3) 10 title = driver.title 11 viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text 12 print("title", title) 13 print("viewdate", viewdate) 14 img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src') 15 print("img", img); 16 17 # 1つ前の画像を押してみる 18 print("ひとつ前の時間を表示") 19 driver.find_element_by_css_selector('img[title="ひとつ前の時間を表示"]').click() 20 time.sleep(1) 21 viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text 22 print("viewdate", viewdate) 23 img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src') 24 print("img", img); 25 26 # 1つ前の画像を押してみる 27 print("ひとつ前の時間を表示") 28 driver.find_element_by_css_selector('img[title="ひとつ前の時間を表示"]').click() 29 time.sleep(1) 30 viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text 31 print("viewdate", viewdate) 32 img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src') 33 print("img", img); 34 35 imgname = "/tmp/screenshot.png" 36 sfile = driver.get_screenshot_as_file(imgname) 37 print("スクリーンショット保存: --> " + imgname) 38 print("成功したか?", sfile) 39 40 41 # 最新表示ボタンを押す 42 driver.find_element_by_css_selector('.contents-button').click() 43 time.sleep(1) 44 viewdate = driver.find_element_by_css_selector('div.weather-map-time-label').text 45 print("viewdate", viewdate) 46 img = driver.find_element_by_css_selector('.weather-map-viewarea img').get_attribute('src') 47 print("img", img); 48 driver.close()

実行ログ:

text

1/var/task 2title 気象庁|天気図 3viewdate 2021年05月30日12時の実況 4img http://www.jma.go.jp/bosai/weather_map/data/png/20210530050231_0_Z__C_010000_20210530030000_MET_CHT_JCIspas_JCP600x581_JRcolor_Tjmahp_image.png 5ひとつ前の時間を表示 6viewdate 2021年06月02日09時の予想 7img http://www.jma.go.jp/bosai/weather_map/data/png/20210531065231_0_Z__C_010000_20210531000000_MET_CHT_JCIfsas48_Rjp_JCP600x581_JRcolor_Tjmahp_image.png 8ひとつ前の時間を表示 9viewdate 2021年05月31日21時の実況 10img http://www.jma.go.jp/bosai/weather_map/data/png/20210531140801_0_Z__C_010000_20210531120000_MET_CHT_JCIspas_JCP600x581_JRcolor_Tjmahp_image.png 11スクリーンショット保存: --> /tmp/screenshot.png 12成功したか? True 13viewdate 2021年05月30日12時の実況 14img http://www.jma.go.jp/bosai/weather_map/data/png/20210530050231_0_Z__C_010000_20210530030000_MET_CHT_JCIspas_JCP600x581_JRcolor_Tjmahp_image.png

なお、天気図の画像は気象庁が公開?しているAPIでJSON形式で画像ファイル名が取得できます。このリストは画像ファイル名だけですが画像ファイルまでのパスを適切に組み合わせることにより天気図を直に取得することができます。
なので、スクリーンショットをとる必要はないのではとも思います。
(画像は直リンクできるし、JSONを返すAPIはクロスドメイン制約を無効にしているので自由につかっていいのではなかろうか、どうだろうか)

以前の回答

本当に提示のスクリプトをAWS上で実行しているのであれば、lambda_handler関数は実行されていないので実行時にスクリーンショットも取得されていません。
(関数実行する文がコメントアウトされている)
1日前にテストしたスクリーンショットを見ているだけなのでは?
スクリーンショットのタイムスタンプも確認してみてください。

AWSでは試せなかったのでGoogle Colaboratoryで同じコードを実行してみましたが、きちんと日本の環境から見た場合と同じ画像が取れました。Google Colaboratory の仮想マシンもAWSと同じおそらくUSにあると思われますので。

投稿2021/05/31 11:38

編集2021/05/31 18:15
hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyazy

2021/05/31 12:34

テストいただきありがとうございます。 AWS lambdaでlambda_handlerが実行されるように指定しております。 (ローカルでテストにコメントアウト部を実行するようにしています。) 実行結果でprint文が表示されています。 「スクリーンショット保存: https://www.jma.go.jp/bosai/weather_map --> /tmp/screenshot.png」 タイムスタンプも確認しているのですが、1日前のものではありません。 ただ今(5/31 21時)再度実行しましたが、 AWS lambdaでのスクリーンショットは「表示時刻 2021年5月30日09時の実況」となります。 (ローカルでは「表示時刻 2021年5月31日18時の実況」)
miyazy

2021/05/31 13:37

Google Colaboratoryで実行したところおっしゃるとおりほしい画像が取得できました。
miyazy

2021/05/31 22:30 編集

おっしゃるとおり、「ひとつ前」ボタンクリックで48時間予想図、もう一度「ひとつ前」ボタンクリックで最新の画像に行き着くことができました。 実際にほしいのは24時間予想図と48時間予想図なのですが、24時間予想図にはうまく行き着けませんでした。 お教えいただいたJSONファイルから取得するほうが簡単そうですので、こちらでやってみたいと思います。 パスの取得を試みていたのですが、スクリーンショットのほうが違いがわかるかと思った次第でした。 逆にわかりづらくしてしまったでしょうか。 前回の質問https://teratail.com/questions/339014で回答が得られなかったので、内容を変えてみました。 テストしづらい環境でなかなか回答が得られないなか、ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問