Jsoup读取超时取决于UserAgent字符串

时间:2014-08-30 19:35:27

标签: java jsoup web-crawler user-agent

我正在尝试使用Jsoup处理几个网址。一个这样的例子是:

http://www.aceshowbiz.com/movie/

当我这样做时:

Document doc = Jsoup.connect(url).get();

它抛出

Exception in thread "main" java.net.SocketTimeoutException: Read timed out

但是当我设置一个useragent字符串时,它可以正常工作

Document doc = Jsoup.connect(url).userAgent("Chrome").get();

虽然它不适用于其他UserAgent字符串:

Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6").get();
//again a Read Time Out

我的问题是:当网站允许使用特定的使用者字符串时,这种情况会发生在我身上,而某些网站只在不使用任何使用者字符串时下载。我不确定是什么导致了这种行为。什么是解决这个问题。正如我所说,在某些网站上,我只能在完全不使用useragent字符串时下载。在服务器端是否有某种限制?或者如果一个网站没有使用我的抓取工具的useragent字符串下载,我应该尊重它,不应该尝试更多的情况或者是某种错误。当然不确定为什么网站不允许使用某些useragent字符串/很少在没有使用useragent字符串时下载。

我在http://www.bloombergview.com/topics/entertainment上测试了几个useragent字符串,发现它只在少数时候下载。我们如何决定它的工作原理?

如果是Jsoup的问题,我应该尝试使用http手动下载页面并将其提供给Jsoup.parse(html)吗?不确定那里也会遇到同样的问题。

编辑:我希望我能够传达这个问题: - >如何为我的抓取工具选择一个能够下载所有网站的正确的使用者字符串。我肯定会将我的爬虫名称添加到useragent字符串中(如果此信息很重要),但我现在遇到的问题是如上所述的常规字符串。不确定上述情况会发生什么。

1 个答案:

答案 0 :(得分:1)

关于aceshowbiz,问题不在于userAgent,而在于使用超时选项。 试试这个

Document doc = Jsoup.connect("http://www.aceshowbiz.com/movie/")
                    .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                  //.userAgent("Chrome")
                    .timeout(0)  
                    .get();

我想看一个userAgent工作的例子和另一个不工作的例子。 你有吗?

timeout(0)这将删除超时限制。您可以添加一些大数字,这在性能方面仍然可以接受