Google app engine GAE gunicorn flask处理30-60分钟请求的最佳方式

Google app engine GAE gunicorn flask处理30-60分钟请求的最佳方式,google-app-engine,flask,beautifulsoup,youtube-data-api,gunicorn,Google App Engine,Flask,Beautifulsoup,Youtube Data Api,Gunicorn,我用flask构建了一个应用程序,它应该能够抓取一些数据。第一步是使用Youtube数据API获取用户的一些数据,包括用户上传的所有视频的列表。那很好用!在我得到视频ID列表后,我尝试从youtube上抓取所有这些视频,提取所有视频的喜好和浏览量,并将它们相加为两个大数字。我在没有gunicorn的情况下在本地测试了它,而不是在应用程序引擎中,它工作正常!但当用户上传6700个视频时,可能需要30分钟才能完成请求(本地有效)。 当我尝试在GAE中运行相同的代码时,它在几分钟后返回502 Bad

我用flask构建了一个应用程序,它应该能够抓取一些数据。第一步是使用Youtube数据API获取用户的一些数据,包括用户上传的所有视频的列表。那很好用!在我得到视频ID列表后,我尝试从youtube上抓取所有这些视频,提取所有视频的喜好和浏览量,并将它们相加为两个大数字。我在没有gunicorn的情况下在本地测试了它,而不是在应用程序引擎中,它工作正常!但当用户上传6700个视频时,可能需要30分钟才能完成请求(本地有效)。 当我尝试在GAE中运行相同的代码时,它在几分钟后返回502 Bad Gateway,但在日志中我看到它仍在爬行。 这是GET 502:

工人继续刮了几分钟。

以下是我为爬网编写的代码: 这是我的app.yaml。使用-t 36000,工人可以沉默一小时,直到他们被杀死并重新启动

runtime: python37
service: crawler
entrypoint: . ./env.inc.sh && gunicorn -t 36000 -b :$PORT app:app
这是my app.py中的路径,称为:

@app.route('/youtube/username/'))
def YouTubStatistics(用户):
响应=crawler.crawl\u youtube\u用户(os.environ['youtube\u API\u KEY',用户)
如果回答:
返回jsonify(响应),200
其他:
返回jsonify({“prettyMessage”:“可能超过配额限制”}),403
以下是我使用的爬虫功能:

def scrape_url(url):
r=请求。获取(url)
page=r.text
soup=bs(页面“html.parser”)
返汤
def crawl_youtube_用户(密钥、用户名):
youtube=设置(键)
request=youtube.channels().list(
part=“snippet,contentDetails,statistics”,
forUsername=username
)
UploadPlayId=“”
数据={}
尝试:
response=request.execute()
除:
返回{}
如果(响应[“pageInfo”][“totalResults”]>0):
统计数据=响应[“项目”][0][“统计数据”]
数据[“subscriberCount”]=stats[“subscriberCount”]
数据[“videoCount”]=统计数据[“videoCount”]
数据[“发布数据”]=响应[“项目”][0][“代码段”][“发布数据”]
UploadPlayId=响应[“项目”][0][“内容详细信息”][“相关播放列表”][“上传”]
request=youtube.playlitems().list(
part=“snippet,contentDetails”,
maxResults=50,
playlaid=上传的playlaid
)
videoIds=[]
尽管如此:
尝试:
response=request.execute()
除:
返回{}
对于响应[“项目”]中的视频:
videoId.append(vid[“snippet”][“resourceId”][“videoId”])
如果“nextPageToken”未响应:
打破
其他:
request=youtube.playlitems().list(
part=“snippet,contentDetails”,
maxResults=50,
playlaid=上传的playlaid,
pageToken=响应[“nextPageToken”]
)
数据更新(抓取youtube视频(VideoID))
返回数据
def爬网视频(ID):
数据={'viewCount':0,'videoLikes':0}
计数器=0
idlength=len(ids)
对于id中的id:
计数器+=1
打印({}/{}:Scraping Youtube videoId{})。格式(计数器,idlength,id))
汤=刮取url('https://www.youtube.com/watch?v={}&gl=DE&hl=DE'.格式(id))
尝试:
数据['viewCount']+=int(soup.find('div',class='watch-view-count').getText().split('[0].replace(','').replace(','',''))
除:
打印(“尝试提取视频视图时出错:{}.”格式(sys.exc_info()[0]))
尝试:
数据['videoLikes']+=int(soup.find(“按钮”,{“标题”):“Mag ich”}.find(“span”).getText().replace('.','').replace(',',''))
除:
打印(“尝试提取类似视频时出错:{}.”格式(sys.exc_info()[0]))
返回数据
我不想使用更多的线程或类似的东西,使整个过程更快!我害怕我的IP被阻止或类似的事情,如果我在短时间内刮到许多网站。我只是试着让请求保持活动状态,直到得到我想要的响应。
那么,是否有更多的机制可以保护GAE应用程序不受长响应时间或类似情况的影响<强>什么是最好的方法来处理30-60分钟的请求?< /强>

< p>你应该考虑使用一个类似的背景任务队列。p> 到位后,您的请求将对作业进行排队。然后,您可以查询任务队列并根据需要获取作业状态

是开始使用这两种选项的一个很好的资源