我正在尝试使用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和我的浏览器时会返回不同的版本。两者都使用相同的用户......
我现在也注意到了其他一些网站上的这种行为。如果你能向我解释问题是什么,我会非常高兴。
答案 0 :(得分:46)
您也可以尝试设置引荐来源标头:
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();
答案 1 :(得分:31)
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。
<强>超时强>
另外,请不要忘记添加timout,因为下载页面有时需要超过正常的超时时间。
<强> Referer的强>
将引用者设置为谷歌。
关注重定向
按照重定向进入页面。
执行()而不是get()
使用execute()获取Response对象。这可以帮助您检查内容 类型和状态代码有误。
稍后您可以解析响应对象以获取文档。
答案 2 :(得分:8)
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添加标题,直到您获得预期的行为,然后精确缩小您需要的标题。
答案 3 :(得分:1)
我遇到了403问题并且.userAgent("Mozilla")
设置为我工作(所以它不需要特定于工作。