【问题标题】:JSoup UserAgent, how to set it right?JSoup UserAgent,如何正确设置?
【发布时间】:2011-07-05 11:06:50
【问题描述】:

我正在尝试使用 JSoup 解析 facebook 的首页,但我总是得到移动设备的 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();

我做错了吗?

编辑:

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

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

【问题讨论】:

  • 我不可能是唯一遇到此问题的人,还是我?
  • 谢谢马库斯。添加用户代理只解决了我的问题

标签: jsoup


【解决方案1】:

您也可以尝试设置引荐来源网址:

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();

【讨论】:

  • @Gili 我的意思是推荐人。它在其中的作用是什么?
  • @silentbang,网站可能会寻找 Referer 标头以检测蜘蛛机器人,因此如果您想伪装成浏览器,您也需要设置该值。见en.wikipedia.org/wiki/HTTP_referer
  • 我为“www.cnn.com”尝试了这段代码,但它仍然返回了移动版本的网页内容..
  • 我发现如果我将user-agent设置为windows或mac的浏览器,YouTube会忽略html中所有的mate标签。所以我必须删除它来检索缩略图、标题、描述来预览这些页面。
【解决方案2】:
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();

用户代理

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

超时

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

推荐人

将referer设置为google。

关注重定向

按照重定向到达页面。

execute() 而不是 get()

使用 execute() 获取 Response 对象。这可以帮助您检查内容 发生错误时的类型和状态代码。

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

【讨论】:

【解决方案3】:

Facebook 很可能在其请求中设置(然后期望)某些 cookie,并认为缺少任何标题的标题是机器人/移动用户/受限浏览器/其他东西。

关于handling cookies with JSoup 有几个问题,但是您可能会发现使用 HttpUrlConnection 或 Apache 的 HttpClient 然后将结果传递给 JSoup 更简单。关于你需要知道的一切的精彩文章:Using java.net.URLConnection to fire and handle HTTP requests

调试浏览器和 JSoup 之间差异的一种有用方法是Chrome's network inspector。您可以一次将一个标头从浏览器添加到 JSoup,直到获得您期望的行为,然后准确缩小您需要的标头。

【讨论】:

    【解决方案4】:

    我遇到了 403 问题,设置 .userAgent("Mozilla") 对我有用(因此它不需要非常具体地工作。

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 2017-03-25
      • 2011-11-03
      • 2011-04-15
      • 2020-08-20
      相关资源
      最近更新 更多