JSoup UserAgent,如何设置正确?

Mar*_*kus 36 jsoup

我正在尝试解析facebook的首页,JSoup但我总是得到移动设备的HTML代码而不是普通浏览器的版本(在我的情况下是Firefox 5.0).

我正在设置我的用户代理:

doc = Jsoup.connect(url)
      .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0")
      .get();
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

编辑:

我刚刚解析了http://whatsmyuseragent.com/,看起来用户代理正在运行.现在,为什么网站http://www.facebook.com/在使用JSoup和我的浏览器时会返回不同的版本,这让我更加困惑.两者都使用相同的用户....

我现在也注意到了其他一些网站上的这种行为.如果你能向我解释问题是什么,我会非常高兴.

小智 49

您也可以尝试设置引荐来源标头:

doc = Jsoup.connect("https://www.facebook.com/")
      .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
      .referrer("http://www.google.com")
      .get();
Run Code Online (Sandbox Code Playgroud)

  • @silentbang,网站可能会寻找"Referer"标题以检测蜘蛛机器人,所以如果你想假装成浏览器,你也需要设置这个值.见http://en.wikipedia.org/wiki/HTTP_referer (3认同)
  • @Gili我的意思是推荐人。它的作用是什么? (2认同)

Sor*_*ter 32

Response response= Jsoup.connect(location)
           .ignoreContentType(true)
           .userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0")  
           .referrer("http://www.google.com")   
           .timeout(12000) 
           .followRedirects(true)
           .execute();

Document doc = response.parse();
Run Code Online (Sandbox Code Playgroud)

用户代理

使用最新的用户代理.这是完整的清单http://www.useragentstring.com/pages/useragentstring.php.

超时

另外不要忘记添加timout,因为有时下载页面需要超过正常超时.

引荐

将引用设置为谷歌.

按照重定向

按照重定向进入页面.

execute()而不是get()

使用execute()获取Response对象.这可以帮助您检查内容类型和状态代码是否有错误.

稍后您可以解析响应对象以获取文档.


dim*_*414 8

Facebook可能会在其请求中设置(然后期待)某些cookie,并认为缺少任何一个僵尸/移动用户/有限浏览器/其他东西的标头.

有关使用JSoup处理cookie的几个问题,但是您可能会发现使用HttpUrlConnection或Apache的HttpClient然后将结果传递给JSoup更简单.对您需要知道的所有内容的优秀撰写:使用java.net.URLConnection来触发和处理HTTP请求

调试浏览器和JSoup之间差异的一种有用方法是Chrome的网络检查员.您可以一次从浏览器向JSoup添加标题,直到获得预期的行为,然后精确缩小所需的标题.