【问题标题】:Any Javascript prevents my program from crawling this page任何 Javascript 都会阻止我的程序抓取此页面
【发布时间】:2012-12-01 09:06:08
【问题描述】:
    Document doc = Jsoup.connect("http://www.utah.edu/").get();
    Elements lists = doc.select("ul");
    for (Element list: lists) {
        Elements li = list.select("li a");
        if (li.size() > 0) {
            ArrayList<String> anchors = new ArrayList<String>();
            for (Element e : li) {
                anchors.add(e.text());
            }
            System.out.println(anchors);
        }
    }

我正在尝试从this page 中获取由ul 标记呈现的所有html 列表。但它失败了。我怀疑页面中有脚本阻止我的程序这样做。

编辑:为了让我的问题更简单,请考虑以下代码:

Document doc = Jsoup.connect("http://www.utah.edu/").get();
Elements lists = doc.select("ul");
System.out.println(lists.size());

输出:

0

【问题讨论】:

  • 但它失败了。到底发生了什么?有错误信息吗?我不认为页面可以使用任何脚本来阻止您解析它。但是,如果您的 HTTP 请求中未包含用户代理,有时 Web 服务器会阻止您下载该页面。
  • @dbaseman 程序成功运行结束,但没有任何输出发送到控制台。现在我确定我的程序没有提取任何列表。
  • @TerryLi jsoup 不会执行 javascript。
  • @xiaoyi 好的,这次会有什么问题?我检查了源代码,其中显示了很多列表。
  • @TerryLi 一个可能的答案是,jsoup 发送的用户代理字符串使 utah.edu 认为它是一个机器人而不是浏览器。所以它返回其他页面内容。您可以将浏览器的用户代理(在 chrome 的检查器中)更改为 jsoup 的,看看会发生什么。

标签: java javascript html web-crawler jsoup


【解决方案1】:

一个可能的答案是,jsoup 发送的 User-Agent 标头使 utah.edu 认为它是机器人而不是浏览器。所以它返回其他页面内容。

org/jsoup/helper/HttpConnection.java 中实现get(),默认情况下不发送User-Agent 标头,除非另有说明。

所以你需要使用userAgent()手动设置。

例如,伪造 Chrome:

String ua = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11";
Document doc = Jsoup.connect("http://www.utah.edu/").userAgent(ua).get();

【讨论】:

    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多