我正在创建一个AWS函数来使用JSoup进行一些基本的web抓取。我已经设置了必要的VPC和相应的需求(我认为)。
当我通过AWS测试界面执行lambda函数时,我可以成功地连接到基本的网站,如google/cnn/etc (https://www.google.com/)和(https://www.cnn.com/)。
然而,当我尝试刮我感兴趣的网站时
https://www.wordplays.com/crossword-solver/egyptian-snake/
我得到一个IO例外:
org.jsoup.HttpStatusException: HTTP错误获取URL。Status=403。
但是,当我在本地(在我的计算机上)使用该URL运行相同的代码时,它能够很好地连接和读取网站。这使我认为我的VPC设置错误,但我不知道为什么我能够到达www.google.com而不是www.wordplays.com。
这就是我如何调用jsoup的方式:
Document document = Jsoup.connect(html)
.userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36")
.get();我不知道如何前进,因为我不知道为什么我可以成功地连接到一些网站,但另一些。
发布于 2020-01-03 06:39:12
我猜是网站屏蔽了你。许多网站阻止亚马逊AWS IP地址范围,以保护他们的数据不受网络爬虫的影响。事实上,AWS范围很可能是最阻塞的范围。行为取决于实现,但通常网站返回4xx错误或让请求超时。
您可以尝试使用超出AWS范围的代理服务器。
在一个更大的网站,克服保护可能更复杂,你可能需要一个完整的浏览器这样做。我的同事写了一篇关于这个话题的文章-- https://help.apify.com/en/articles/1961361-several-tips-how-to-bypass-website-anti-scraping-protections。但是在99%的情况下,代理服务器将解决这个问题。
发布于 2020-01-03 06:07:09
VPC中的Lambda函数需要子网,因为它没有公共IP地址。
如果您希望您的Lambda功能访问互联网,它需要这样做使用NAT网关*。如果子集只能通过IGW访问internet,Lambda函数将无法与internet通信,因为它没有,也不能接收公共IP地址。
*收费适用
https://stackoverflow.com/questions/59568584
复制相似问题