実現したいこと
flask(app.py)で作成したスクレイピングコードをAWS App Runnerで実行したいです。
何が原因なのかわからないので、少しでもおかしな点があればアドバイスしていただきたいです。
前提
ローカルでの実行は成功したのですが、AWS App Runnerにデプロイした場合、実行できませんでした。
また、AWSのログ情報を見ても、 could not determine the L2 cache size on this system, assuming 256k
などの情報のみで具体的なエラーは発見できませんでした。
app.pyとcodesフォルダは同ディレクトリ内にあります。
ちなみに、こちらのスクレイピングはサイトの管理者に許可を得て行っています。
発生している問題・エラーメッセージ
デフォルトドメインにアクセスした時、chromeに以下のような文章が表示されます。
5vynrmr2hp.ap-northeast-1.awsapprunner.com では現在このリクエストを処理できません。 HTTP ERROR 502
該当のソースコード
python
1#app.py 2from flask import Flask, request, Response, jsonify,render_template,abort 3from bs4 import BeautifulSoup 4import joblib 5import requests 6from tqdm import tqdm 7from codes.data import joblib_get_url 8from flask_cors import CORS 9import logging 10import traceback 11 12app = Flask(__name__) 13CORS(app) 14app.config['JSON_AS_ASCII'] = False 15 16logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') 17 18@app.route('/', methods=['GET','POST']) 19 20def get_data(): 21 22 logging.info('get_data() 関数が呼ばれました。') 23 24 25 url="https://---- 26 res=requests.get(url) 27 soup=BeautifulSoup(res.text,"html.parser") 28 29 selector="----" 30 total_num=soup.select_one(selector).get_text() 31 total_num=int(total_num.replace(",","")) 32 33 n=50 34 if total_num % n ==0: 35 total_page_num=total_num // n 36 else: 37 total_page_num=total_num // n +1 38 39 url_list_1=list() 40 url="----" 41 url_list_1.append(url) 42 43 for i in range(2,total_page_num): 44 url_key="https://------"+str(i) 45 url_list_1.append(url_key) 46 47 #return url_list_1-------(1) 48 49 url_list_002 = list() 50 51 a=1 52 joblib_num=10 53 54 for n in tqdm(range(0, joblib_num)): 55 try: 56 resultList = joblib.Parallel(n_jobs=12, verbose=3)( [joblib.delayed(joblib_get_url)(url_list_1[i]) for i in range(n*a,(n+1)*a) ]) 57 url_list_2.extend(resultList) 58 except Exception as e: 59 logging.error('エラーが発生しました: %s', str(e)) 60 logging.error(traceback.format_exc()) # スタックトレースをログに出力 61 return None 62 63 64 return url_list_2 65 66if __name__ == "__main__": 67 port = int(os.environ.get('PORT', 8080)) 68 app.run(host='0.0.0.0', port=port,timeout=60)
python
1#codes/data.py 2from bs4 import BeautifulSoup 3import requests 4import joblib 5from tqdm import tqdm 6import pandas as pd 7import re 8 9def joblib_get_url(url_1): 10 url_list_pre=list() 11 url=url_1 12 13 res=requests.get(url) 14 soup=BeautifulSoup(res.text,"html.parser") 15 16 for i in range(0,50): 17 try: 18 elem=soup.find_all("div",class_="layout layoutList02")[i].find----- 19 url_key=elem.attrs["href"] 20 url_list_pre.append(url_key) 21 except Exception as e: 22 print("Error:",e) 23 24 return url_list_pre
試したこと
前述したとおりローカルではapp.pyは正常に動きました。
またapp.pyの47行目(return url_list_1)までを記載し、デプロイを試したところ正常にurl_list_1のリストが表示されました。
補足情報(FW/ツールのバージョンなど)
runtime.txtには
python-3.9.6と記述しています。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。