urllib无法使用python在aws lambda上运行,无法刮取www.avvo.com

urllib无法使用python在aws lambda上运行,无法刮取www.avvo.com,python,aws-lambda,urllib,Python,Aws Lambda,Urllib,下面的抓取脚本在部署到AWS时出错,而它在我的本地机器上工作得很好 API链接如下: 重新导入 导入json 从urllib.request导入请求,urlopen 从bs4导入BeautifulSoup 导入hashlib def lambda_处理程序(事件、上下文): rel_url=event.get(“url”) #rel#u url='attorneys/84025-ut-jason-hunter-284784.html#client#u reviews' url='1〕https:

下面的抓取脚本在部署到AWS时出错,而它在我的本地机器上工作得很好

API链接如下:

重新导入
导入json
从urllib.request导入请求,urlopen
从bs4导入BeautifulSoup
导入hashlib
def lambda_处理程序(事件、上下文):
rel_url=event.get(“url”)
#rel#u url='attorneys/84025-ut-jason-hunter-284784.html#client#u reviews'
url='1〕https://www.avvo.com/“+”+rel\u url
标题={
“用户代理”:“Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.11(KHTML,如Gecko)Chrome/23.0.1271.64 Safari/537.11”,
“接受”:“text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”,
“接受字符集”:“ISO-8859-1,utf-8;q=0.7,*;q=0.3”,
“接受编码”:“无”,
‘接受语言’:‘en-US,en;q=0.8’,
“连接”:“保持活动”
}
使用urlopen(请求(url,headers=headers))作为响应:
soup=BeautifulSoup(response.read(),features=“html.parser”)
数据={}
数据[“网站”]=soup.title.text
数据[“商业标识链接”]=response.url
数据[“post_site_url”]=重新搜索('https?:/([A-Za-z_0-9.-]+).*,response.url)。组(1)
数据[“post_review_link”]=response.url
数据[“biz_favicon”]=re.search('https?:/([A-Za-z_0-9.-]+).*,response.url)。组(1)+“”+(soup.find('link',{rel':'icon'))。get('href'))
data[“total_reviews”]=soup.find('span',{'itemprop':'reviewCount'})。get_text()
数据[“总体评分”]=soup.find('span',{'itemprop':'ratingValue'}).get(“内容”)
评论=[]
对于soup.findAll('div',{'class':'u-vertical-margin-1')中的标记:
尝试:
title=tag.find('h3',{'itemprop':'headline'}).get_text()
除:
标题=“”
尝试:
date=tag.find(“span”,{“itemprop”:“datePublished”}).string
除:
日期=“”
尝试:
rating=tag.find('meta',{'itemprop':'ratingValue'}).get('content')
除:
评级=“”
尝试:
description=tag.find('div',{'class':'sidebarbox'}).get_text()
除:
描述=“”
尝试:
name=tag.find(“span”,{“itemprop”:“author”}).string
除:
名称=“”
项目={}
项目['name']=名称
项目['date']=日期
物品['avatar']=''
项目['rating']=评级
项目['title']=标题
项目['description']=说明
项目['source']=''
strId=f'{name}{date}'
hash_object=hashlib.md5(strId.encode())#采用默认的UTF-8
item['reviewId']=hash_object.hexdigest()
评论。追加(项目)
数据[“评论”]=评论
#打印(json.dumps(数据,排序键=True,缩进=2))
返回{
“状态代码”:200,
“标题”:{
“内容类型”:“应用程序/json”
},
“body”:json.dumps(数据)
}
错误

{
“errorMessage”:“HTTP错误403:禁止”,
“errorType”:“HTTPError”,
“stackTrace”:
[
“文件\“/var/task/lambda_function.py\”,第27行,在lambda_处理程序中\n使用urlopen(请求(url,headers=headers))作为响应:\n“,
“文件\”/var/lang/lib/python3.8/urllib/request.py\”,第222行,在urlopen\n return opener.open(url,数据,超时)中,
“File\”/var/lang/lib/python3.8/urllib/request.py\”,第531行,在open\n response=meth(req,response)\n中,
“File\”/var/lang/lib/python3.8/urllib/request.py\”,第640行,在http\u response\n response=self.parent.error(\n)中,
“File\”/var/lang/lib/python3.8/urllib/request.py\”,第569行,出现错误\n返回self.\u调用链(*args)\n“,
“File\”/var/lang/lib/python3.8/urllib/request.py\”,第502行,在调用链\n result=func(*args)\n中,
“文件\“/var/lang/lib/python3.8/urllib/request.py\”,第649行,在http\u error\u default\n raise HTTPError(req.full\u url,code,msg,hdrs,fp)\n”
]
}

错误很明显:您尝试爬网的一个URL受到保护。因此,您将收到一个
403禁止的
错误


因此,您需要确保处理这些错误。记录无法爬网的URL可能是一个好主意。

在Lambda上运行时会出现什么错误?这是我为AWS上的刮板创建的API。请检查此处的错误,非常感谢您的编辑部分。此外,相同的脚本不会在运行时产生任何问题n我在windows上运行它,但在AWS上返回错误“403禁止”.经过一些研究,我知道我部署到AWS的包是在windows上创建的,因此可能是安装的模块依赖性问题。因此,我将在docker上设置包,然后部署到AWS。我希望它能够完美运行。
urllib
是标准库的一部分,因此,如果您选择在windows上创建它。至少是这一部分。当您加载为不同内核(如windows)或体系结构(如amd64)编译的库时,会出现完全不同的错误。您的问题仍然是您没有访问该页面的权限。这可能是因为它们阻止了AWS IP范围。这就是为什么它在您的本地计算机上工作,而不是在您的Lambda上工作。我曾经有过类似的情况。请参考您的上一句话“我曾经有过类似的情况。”,你想进一步解释吗?我很想知道你是如何在AWS上解决这个问题的?不是在@MujahidAlkausari的评论中。创建一个简单的演示Lambda来复制这个bug。只是HTTP调用来显示调用在AWS中失败,但在本地机器上没有。也许可以创建一个易于使用的Terraform/