我正在创建一个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();
我不确定该如何前进,因为我无法弄清楚为什么我可以成功连接到某些网站,但不能成功地连接到其他网站。
答案 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地址。
*收费适用