伪造浏览器以避免403错误

Blu*_*ire 1 java web-scraping jsoup

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

我还需要做些什么才能诱使服务器认为我是浏览器?

Pen*_*uzi 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
Run Code Online (Sandbox Code Playgroud)

所有这些都有相应的Jsoup方法.这应该足以欺骗Web服务器.

如果您仍然遇到问题,则应记录实际请求以查看是否按预期发送.