无法访问AWS-lambda函数内的某些网站

时间:2020-01-02 18:55:36

标签: html amazon-web-services aws-lambda jsoup

我正在创建一个AWS lambda函数,以使用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:提取URL时发生HTTP错误。状态= 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();

我不确定该如何前进,因为我无法弄清楚为什么我可以成功连接到某些网站,但不能成功地连接到其他网站。

2 个答案:

答案 0 :(得分:1)

我的猜测是该网站阻止了您。许多网站阻止Amazon AWS IP地址范围以保护其数据不受Web爬网程序的攻击。实际上,AWS范围可能是其中受阻最大的范围。行为取决于实现方式,但网站通常会返回4xx错误或让请求超时。

您可以尝试使用不在AWS范围内的代理服务器。

对于较大的网站,保护措施的克服可能会更加复杂,您可能需要完整的浏览器才能做到。我的同事写了一篇有关该主题的文章-https://help.apify.com/en/articles/1961361-several-tips-how-to-bypass-website-anti-scraping-protections。但是在99%的情况下,代理服务器将解决此问题。

答案 1 :(得分:-1)

VPC中的Lambda函数需要子网划分,因为它没有公共IP地址。

如果您想让Lambda函数访问Internet,则需要使用NAT网关*。如果子集只能通过IGW访问Internet,则Lambda功能将无法与Internet通信,因为它没有公共IP地址,也无法接收公共IP地址。

*收费适用