JSoup用户代理,如何正确设置?

47

我想用 JSoup 解析 Facebook 的首页,但我始终只能获取移动设备的 HTML 代码,而不是正常浏览器版本(在我的情况下是 Firefox 5.0)。

我这样设置 User Agent:

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/,看来用户代理是正常工作的。现在对我来说更加困惑的是,当使用JSoup和我的浏览器时,网站http://www.facebook.com/返回不同的版本。两者都使用相同的用户代理......

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


2
我不可能是唯一遇到这个问题的人,对吧? - Markus
谢谢Markus。仅添加用户代理就解决了我的问题。 - Bloomberg58
4个回答

59

你可以尝试设置引荐头部:

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

2
@Gili 我指的是引荐者。它在这个过程中的作用是什么? - Duc Tran
4
@silentbang,网站可能会查找“Referer”标头以便检测蜘蛛爬虫,因此如果你想要假装成一个浏览器,你也需要设置该值。参见http://en.wikipedia.org/wiki/HTTP_referer - Gili
我发现如果我将用户代理设置为Windows或Mac的浏览器,YouTube将忽略HTML中的所有mate标签。因此,我必须将其删除以检索缩略图、标题、描述以预览这些页面。 - Kimi Chiu

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

User Agent

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

Timeout

还要记得添加超时时间,因为有时需要比正常超时时间更长的时间来下载页面。

Referer

将引用设置为google。

Follow redirects

跟随重定向以访问页面。

execute() instead of get()

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

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

在github上托管了完整示例


1
useragentstring.com 现在似乎出现了问题。 - Siddhartha
仅供澄清,虽然答案中的确切链接已经失效(http://www.useragentstring.com/pages/Firefox/),但该网站本身仍在运行(截至本评论撰写时)。链接已更新为:http://www.useragentstring.com/。 - The Student Soul
谢谢。已更新答案中的链接。 - Sorter
它对https://www.masterclass.com无效。你能给我提些建议吗? - gopalanrc

8
很可能Facebook在其请求中设置(并期望)某些cookie,并认为缺少任何cookie的标头是机器人/移动用户/受限浏览器/其他内容。
有几个关于使用JSoup处理cookie的问题,但您可能会发现使用HttpUrlConnection或Apache的HttpClient并将结果传递给JSoup更简单。一篇关于您需要了解的所有内容的优秀文章:使用java.net.URLConnection进行HTTP请求和处理的写作
调试浏览器和JSoup之间差异的一个有用方法是Chrome的网络检查器。您可以逐个从浏览器向JSoup添加标头,直到获得所期望的行为,然后缩小确切需要哪些标头的范围。

1
我遇到了403问题,设置.userAgent("Mozilla")对我有用(所以它不需要非常具体才能工作)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接