我正在Firebase Cloud Functions上构建Web抓取应用程序的后端,它由两个函数组成:
- WEBSRACAPER FUNCTION,在Python3中使用BeautifulSoup编写,从多个页面(轻松地在500页左右(中抓取内容,并以json形式返回抓取的内容
- SCHEDULED FUNCTION,用Nodejs编写,每隔一小时调用项1中的webscraper,并用刮来的内容更新Firestore
调度函数使用Axios执行获取请求。
问题我一直不定期地在计划功能中收到以下错误。这种情况有时在每次调用时都会发生,有时甚至不会发生一次,这使得调试非常困难。不规则性也发生在开发、阶段和生产环境中:
//err.response
{ status: 500,
statusText: 'Internal Server Error',
headers:
{ 'x-cloud-trace-context': '2f22d7fc6a9044dcfc31acafc2d50e54',
date: 'Thu, 23 Apr 2020 04:45:39 GMT',
'content-type': 'text/html; charset=UTF-8',
server: 'Google Frontend',
'content-length': '323',
'alt-svc': 'quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000',
connection: 'close' },
config:
{ url: 'CLOUD_FUNCTIONS_URL',
method: 'get',
params: {//params}
}
无论何时在SCHEDULED FUNCTION中发生此类错误,WEBSSCRAPER FUNCTION实际上都没有发生错误,即Firebase Cloud FUNCTION控制台为WEBSSCRaper FUNCTION打印Function execution took XXXX ms, finished with status code: 200
。
我还对WEBSSCRAPER FUNCTION进行了检查,当它完成status code: 200
时,将正确返回有效结果。
我的代码部分如下:
//In the SCHEDULED FUNCTION where I call the WEBSCRAPER FUNCTION
function getContentPromise(param1, param2) {
let url = //WEBSCRAPER FUNCTION's url
let parameters = {param1: param1, param2: param2};
let config = {
params: parameters,
}
return axios.get(url, config)
.then((response) => {
return response.data
})
.catch((err) => {
console.log('Retrying...', err.response) //Error thrown here
return getContentPromise(param1, param2)
})
}
//In the WEBSCRAPER FUNCTION
//At main.py
def scrape(request):
response_object = scrape(request)
return jsonify(response_object)
//At the scrape function
def scrape(request):
param1 = request.args.get('param1')
param2 = request.args.get('param2')
//Some scraping stuff happening here using beautifulsoup
response_object = {}
response_object[constants.status_code_key] = 200
response_object['contents'] = contents //contents in json
return response_object
你在执行哪个防火基地计划?Blaze计划只允许对非谷歌服务的出站网络请求。
如果你的应用程序在本地环境中工作,但在生产中提供500个响应代码,你可以确定它是否是这样。