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

Cannot reach some websites within AWS-lambda function

我正在创建一个 AWS lambda 函数来使用 JSoup 进行一些基本的网络抓取。我已经设置了必要的 VPC 和相应的要求(我认为)。

当我通过AWS测试接口执行lambda函数时,我可以成功连接到google/cnn/etc (https://www.google.com/) and (https://www.cnn.com/).

等基本网站

但是,当我尝试抓取我感兴趣的网站时

https://www.wordplays.com/crossword-solver/egyptian-snake/

我收到 IO 异常:

org.jsoup.HttpStatusException:获取 HTTP 错误 URL。状态=403.

但是,当我 运行 在本地(在我的计算机上)使用 URL 相同的代码时,它能够完全正常地连接和阅读网站。这让我觉得我的 VPC 设置不正确,但我不知道为什么我能够到达 www.google.com and not 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();

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

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

如果您希望 Lambda 函数访问互联网,则需要使用 NAT 网关*。如果子集只能通过 IGW 访问互联网,Lambda 函数将无法与互联网通信,因为它没有也无法接收 public IP 地址。

*收费

我的猜测是该网站阻止了您。许多网站阻止 Amazon AWS IP 地址范围以保护其数据免受网络爬虫的攻击。事实上,AWS 范围可能是那里被封锁最多的范围。行为取决于实施,但网站经常 returns 4xx 错误或让请求超时。

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

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