我使用jsoup连接到一个网页并从中提取数据,但是它给了我一个http403响应(不像我的浏览器,它成功地加载了它)。据我所知,我必须让我的刮板假装它是一个浏览器。我尝试了两件事:将用户代理设置为浏览器,并将referer设置为同一个网站(这两件事我都是通过浏览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();
我还需要做什么才能诱使服务器认为我是一个浏览器?
3条答案
按热度按时间h79rfbju1#
有几种方法可以区分web浏览器和robot用户代理。我想到的一种可能性是检查accept头内容。我建议您使用firefox开发工具来检查您的请求,并向scraper应用程序添加头文件/cookies。此外,您还可以使用数据包嗅探器(ngrep、wireshark),将您的请求与实际浏览器会话的请求进行比较,以确定使用了哪些信号。
smtd7mpg2#
web服务器可以响应于来自客户端的对网页或资源的请求而返回403禁止的http状态码,以指示可以到达服务器并理解该请求,但是拒绝采取任何进一步的操作。状态码403响应是web服务器由于某种原因被配置为拒绝客户端对请求的资源的访问的结果。
它在浏览器中工作,在浏览器中他可能会获取一些头文件或cookies。
请使用fiddler或simple browser检查哪些是标题或任何其他参数,并在中设置这些值
Jsoup
它会解决你的问题。vcudknz33#
由于可以使用浏览器成功加载页面(200?),因此可以使用该信息创建jsoup连接。
在“开发”视图中打开浏览器的“网络”选项卡,查看并模拟请求。例如,一个get to this page如下所示
所有这些都有相应的jsoup方法。这应该足以欺骗web服务器。
如果您仍然遇到问题,您应该记录实际请求,以查看它是否按预期发送。