我使用JSoup连接到网页并从中抓取数据,但是它给了我一个HTTP 403响应(不像我的浏览器,它成功加载它)。根据我的理解,我必须让我的刮刀假装它是一个浏览器。我尝试过两件事:将用户代理设置为浏览器,并将引用者设置为同一个网站(我通过浏览StackOverflow获得这两个网站)。然而,我仍然得到403.我的代码看起来像这样(我知道浏览器已经老了,我只是复制它,当然它不应该重要吗?):
Document doc = Jsoup.connect("http://www.website.com/subpage/")
.userAgent("\"User-Agent\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11\"")
.referrer("http://www.website.com")
.get();
我还需要做些什么才能诱使服务器认为我是浏览器?
答案 0 :(得分:5)
由于您可以使用浏览器成功加载页面(200?),因此可以使用该信息创建Jsoup连接。
在开发视图中打开浏览器的网络选项卡,查看请求并模仿它。例如,此页面的GET类似于
Host: stackoverflow.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0)
Gecko/20100101 Firefox/46.0
Accept: application/json, text/javascript; q=0.01
Accept-Language: sv-SE,sv;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Referer: http://stackoverflow.com/questions/37134906/fake-being-a-browser-to-avoid-a-403-error
Content-Length: 263
Cookie: x; prov=x; acct=t=wx
DNT: 1
Connection: keep-alive
所有这些都有相应的Jsoup方法。这应该足以欺骗网络服务器。
如果您仍遇到问题,则应记录实际请求,看是否按预期发送。
答案 1 :(得分:1)
有多种方法可以区分Web浏览器和机器人用户代理。想到的一种可能性是检查Accept标头内容。 我建议您使用Firefox开发人员工具检查您的请求,并将标头/ cookie添加到您的scraper应用程序中。 此外,您可以使用数据包嗅探器(ngrep,wireshark)并将您的请求与真实浏览器会话的请求进行比较,以确定使用的信号。
答案 2 :(得分:0)
Web服务器可能会返回 403 Forbidden HTTP状态代码,以响应客户端对网页或资源的请求,以指示可以访问服务器并了解该请求,但拒绝采取进一步行动。状态代码403响应是 Web服务器被配置为拒绝访问的结果,由于某种原因,客户端请求资源。
它在浏览器中工作,在浏览器中他可能需要一些标题或 饼干。
请使用 Fiddler 或简单的浏览器&amp ;;查看标题或任何其他参数需要的内容。在Jsoup
中设置这些值可以解决您的问题。