【问题标题】:Fetching data from the internet in Java使用 Java 从 Internet 获取数据
【发布时间】:2012-09-18 20:45:32
【问题描述】:

美好的一天,我是 Java 新手,我正在尝试从互联网上获取一些数据。如果我想以搜索谷歌并存储结果数量和搜索时间为例。 我考虑过使用 jsoup DOM 功能,但我不知道如何获取该特定元素的值。

如果我使用谷歌浏览器检查元素,我感兴趣的是

<div id="resultStats">
About 6,480,000,000 results
<nobr>  (0.26 seconds)&nbsp;</nobr>
</div>    

这是我唯一可以开始工作的事情,但文档不包含该元素。

import org.jsoup.nodes.Document;


import java.io.IOException;

public class google_time {
    public static void main(String[] args) throws IOException {
        String url = "https://www.google.com/webhp?hl=en&tab=Tw&q=data#hl=en&newwindow=1&output=search&sclient=psy-ab&q=data&oq=data&gs_l=hp.12...0.0.0.1682.0.0.0.0.0.0.0.0..0.0.les%3B..0.0...1c.Q9UUbwkFy-I&pbx=1&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&fp=6a12f0870d3ff179&biw=1066&bih=483";

        Document doc = Jsoup.connect(url).get();
        System.out.println(doc);

    }
}

那么我怎样才能只得到那一点 resultStatic 和里面的文字呢?

【问题讨论】:

  • jsoup 提供了可以导航的 DOM(文档对象模型),尝试阅读 examples here
  • 还可以查看this,尤其是jqueryexamples 部分

标签: java dom jsoup


【解决方案1】:

首先是问题:

看起来像 url https://www.google.com/webhp 用于动态呈现谷歌搜索页面。即使用 AJAX 获取搜索结果,然后使用 javascript 将其呈现到页面中。由于jsoup 不是浏览器且不运行javascript,因此您使用jsoup 获得的html 将不会有任何搜索结果。

所以我们可以使用https://www.google.com/search。这将呈现一个普通的 html 页面,其结果没有任何 AJAX 呼喊。但是 google 仍然会阻止来自非浏览器来源的请求,因此您必须将 UserAgent 标头添加到您的 Jsoup 请求中,如下所示:

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

您的最终代码将如下所示:

import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Element;
import org.jsoup.Jsoup;
import java.util.Iterator;
import java.io.IOException;

public class GoogleScraper {
    public static void main(String[] args) throws IOException {
        String url = "https://www.google.com/search?"+
        "hl=en&tab=Tw&q=data#hl=en&newwindow=1&"+
        "output=search&sclient=psy-ab&q=data&oq=data"+
        "&gs_l=hp.12...0.0.0.1682.0.0.0.0.0.0.0.0..0.0.les"+
        "%3B..0.0...1c.Q9UUbwkFy-I&pbx=1&bav=on.2,"+
        "or.r_gc.r_pw.r_cp.r_qf.&fp=6a12f0870d3ff179&biw=1066&bih=483";

        try{

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

            //Prints the whole markup
            //System.out.println(doc.toString());

            Elements resultDivElems = doc.select("div#resultStats");
            Iterator<Element> itr = resultDivElems.iterator();

            //Prints only what you need, ie the result details
            while(itr.hasNext()){
                System.out.println(((Element)itr.next()).text());
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

【讨论】:

  • 谢谢,但这不起作用,你必须使用元素而不是元素,但仍然没有成功
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
相关资源
最近更新 更多