JavaJSoupGoogle图像搜索结果解析

JavaJSoupGoogle图像搜索结果解析,java,jsoup,Java,Jsoup,我正在使用jsoup解析Google图像结果。我正在尝试获取图像的src。这是到目前为止我的代码。由于某种原因,输出被截断,我无法访问src属性。有人知道为什么会发生这种情况吗?我能做些什么来解决它?非常感谢 public static void main(String args[]) { try { // Does a google image search for "test" final Document doc = Jsoup.connect("h

我正在使用jsoup解析Google图像结果。我正在尝试获取图像的
src
。这是到目前为止我的代码。由于某种原因,输出被截断,我无法访问
src
属性。有人知道为什么会发生这种情况吗?我能做些什么来解决它?非常感谢

public static void main(String args[]) {
    try {
        // Does a google image search for "test"
        final Document doc = Jsoup.connect("https://www.google.com/search?q=test&tbm=isch").userAgent(USER_AGENT).get();

        // selects images
        Elements elements = doc.select("img.rg_ic.rg_i");
            // cycles through elements and prints attributes
            for (Element e : elements) {
                System.out.print(e);
            }


    } catch (IOException e) {
        e.printStackTrace();
    }
}
输出:

<img class="rg_ic rg_i" data-sz="f" name="XWXPqrX1RFJiaM:" alt="Image result for test" jsaction="load:str.tbn" onload="google.aft&&google.aft(this)">

以下代码提供了jsoup的前100个图像结果的URL。如果您需要所有结果,您必须使用无头浏览器(我建议,请参阅了解用法)

静态html源将前100个结果的图像URL单独存储在中。为了解析刮取的JSON对象,我使用

JSON对象包含在类为
rg_meta
元素中,其形式如下:

{"st":"Uber","tu":"https:\/\/encrypted-tbn3.gstatic.com\/images?q=tbn:ANd9GcTSEUMluu1kigjR3JU40BYfaH0fQ6JW1vk9WScBiXr--lsMILf2","ru":"https:\/\/newsroom.uber.com\/uberkittens-are-back\/","tw":300,"pt":"UberKittens Delivers Kittens to Play or Stay","ou":"https:\/\/newsroom.uber.com\/wp-content\/uploads\/2015\/10\/HQ_uberkittens_blog_960x540_r1v1.jpg","ow":960,"cl":6,"isu":"newsroom.uber.com","rid":"vLA3QXY8xPE4PM","cr":3,"ity":"jpg","sc":1,"ct":15,"s":"Clear Your Calendars\u2014#UberKITTENS Are Back","th":168,"oh":540,"id":"qCR7qXt7VX38iM:","itg":false,"cb":15}
因此,对于url,我们需要提取键“ou”的值

示例代码

// can only grab first 100 results
String userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36";
String url = "https://www.google.com/search?site=imghp&tbm=isch&source=hp&q=kittens&gws_rd=cr";

List<String> resultUrls = new ArrayList<String>();

try {
    Document doc = Jsoup.connect(url).userAgent(userAgent).referrer("https://www.google.com/").get();

    Elements elements = doc.select("div.rg_meta");

    JSONObject jsonObject;
    for (Element element : elements) {
        if (element.childNodeSize() > 0) {
            jsonObject = (JSONObject) new JSONParser().parse(element.childNode(0).toString());
            resultUrls.add((String) jsonObject.get("ou"));
        }
    }

    System.out.println("number of results: " + resultUrls.size());

    for (String imageUrl : resultUrls) {
        System.out.println(imageUrl);
    }

} catch (IOException | ParseException e) {
    e.printStackTrace();
}

在浏览器中使用禁用的JavaScript尝试可能会出现重复的问题,您就知道问题的根源了。所以jsoup allone无法完成这项工作,在上面的回答中,我能够使用phantomJS提取结果。jsoup是一个不支持JavaScript的html解析器。在jsoup不能提供预期输出的情况下,网站通常依赖JavaScript。然后,您通常会尝试不同的方法:查看后台请求(可能是您可以使用的API调用),在rhino之类的引擎中运行选定的脚本,或者使用支持JavaScript的无头浏览器(Java:HtmlUnit;PhantomJS等)。@FredericKlein什么是PhantomJS?Jsoup只读取来自服务器的静态网站,但是Javascript是在客户端处理的,所以通常在浏览器中,浏览器有一个Javascript引擎。脚本更改网站、获取额外数据等。这些更改将丢失给jsoup,因此您需要一个能够处理JavaScript并使页面更像实际浏览器的工具。结果(完整的html源代码)当然可以用jsoup解析。文档部分中有一个HtmlUnit与jsoup结合的示例:非常感谢。您能简单地解释一下JSON对象到底是什么,以及为什么需要JSON.simple来获取我需要的信息吗?非常感谢。@namarino什么是JSON:w3schools.com/js/js_JSON.asp在静态html源中,图像URL只能通过JSON对象访问,JSON对象存储在带有rg_meta类的div元素中。Jsoup是一个html解析器,因此JSON结构是不可解析的。因此,我们需要一个JSON解析器,比如JSON。解析对象和查询特定键(“ou”)的值(URL)非常简单。嘿,非常感谢,我真的非常感谢你的帮助。这不起作用,可能是因为没有
rg_meta
,所以我检查了页面并尝试了
img[class^=rg_]
,但仍然不起作用,你能用这个指导我吗
number of results: 100
https://newsroom.uber.com/wp-content/uploads/2015/10/HQ_uberkittens_blog_960x540_r1v1.jpg
https://pbs.twimg.com/profile_images/562466745340817408/_nIu8KHX.jpeg
http://leecamp.net/wp-content/uploads/kitten-3.jpg 
...