通过AWS ApiGateway用ip-rotator爬取Google scholar报BadRequestException错误
错误根因
你遇到的Invalid HTTP endpoint specified for URI报错,是因为初始化ApiGateway时传入的地址包含了查询参数。AWS ApiGateway的PutIntegration接口要求集成的HTTP端点必须为不带查询参数的基础路径,你将包含?hl=en&as_sdt=0%2C5&q={}&btnG=的完整查询地址传入初始化接口,不符合AWS接口校验规则。最初几次运行未报错是临时校验未触发,后续校验生效就会抛出异常。
修复步骤
- 拆分基础域名和查询模板,不要将查询参数放在ApiGateway初始化的地址中
- ApiGateway初始化仅传入基础域名,会话挂载也对应绑定基础域名即可,IP轮换逻辑会自动覆盖该域名下的所有请求
- 发起请求时再拼接完整的带查询参数的请求地址
修复后的初始化代码
# 拆分基础域名和查询模板 base_url = 'https://scholar.google.com' query_template = '/scholar?hl=en&as_sdt=0%2C5&q={}&btnG=' # 初始化网关仅传入基础域名 gateway = ApiGateway(base_url, access_key_id="KEY", access_key_secret="SECRET_KEY") gateway.start()
修复后的会话挂载代码
session = requests.Session() # 挂载基础域名,同域名下所有请求都会自动走IP轮换 session.mount(base_url, gateway)
修复后的请求代码
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'} search_string = '{}+and+{}+and+{}+and+{}'.format('term1','term2','term3','term4') # 拼接完整请求地址 url = base_url + query_template.format(search_string) print(url) response = session.get(url,headers=header) tree = BeautifulSoup(response.content,'lxml') result = tree.find('div',id='gs_ab_md') print(response.status_code) print(result.text) print(len(result.text)) number=[int(s.replace('.','').replace(',','')) for s in result.text.split() \ if s.replace('.','').replace(',','').isdigit()]
网关销毁代码无需调整,执行gateway.shutdown()即可正常清理资源。
额外注意事项
- 若此前运行时未正常执行销毁逻辑,会导致AWS后台残留无效的ApiGateway资源,建议先登录AWS控制台进入ApiGateway服务手动删除残留资源,避免占用配额导致后续报错。
- AWS ApiGateway有调用次数配额限制,爬取时请控制请求速率,避免触发配额拦截。
内容的提问来源于stack exchange,提问作者user12292528
相关产品推荐
相关产品推荐

