无法从jsoup api获取某些类

时间:2015-10-08 21:24:37

标签: java web-scraping jsoup

您好我是jsoup的新手,并尝试从以下链接中抓取数据,

https://www.zomato.com/ahmedabad/mcdonalds-navrangpura

但我无法获取以下类的数据:rev-text

这是我的代码:

public class Test {

    public static void main(String[] args) throws IOException {
        Document doc;
        doc = Jsoup.connect("https://www.zomato.com/ahmedabad/mcdonalds-navrangpura").userAgent("Chrome/41.0.2228.0").get();

        // get page title
        String title = doc.title();
        System.out.println("title : " + title);

        // get all links
        Elements links = doc.getElementsByClass("rev-text");

    /*  Elements links = doc.getAllElements();*/
        for (Element link : links) {

            // get the value from href attribute
            System.out.println("\nlink : " + link);
            System.out.println("text : " + link.text());

        }
}
}

请指导我如何做到这一点。

1 个答案:

答案 0 :(得分:0)

问题背景

rev-text元素不是“默认”页面源的一部分,它是使用JavaScript动态加载的。由于Jsoup不是浏览器模拟器,因此它不会在页面上执行它只为您提供源代码的脚本。

测试检索到的源的一种简单方法是将其打印出来;你会看到rev-​​text类根本不存在。

System.out.println(doc.html()); //print out page source

提议的解决方案

通常,为了从JavaScript重量级的网页中抓取内容,使用可以通过执行页面上的脚本来模拟浏览器的工具通常很有用。执行此操作的常见库是Selenium。你可以在selenium中使用PhantomJS(你可以阅读)驱动程序,获取页面,将页面源传递给Jsoup并提取rev文本。

以下是使用selenium提取所需字段的示例代码:

public static void main(String[] args) throws IOException, InterruptedException {
    WebDriver driver = new PhantomJSDriver(new DesiredCapabilities());
    driver.get("https://www.zomato.com/ahmedabad/mcdonalds-navrangpura"); //retrieve page with selenium
    Thread.sleep(3*1000); //bad idea, wait for specific element. e.g rev-text class instead of using sleep[1].
    Document doc = Jsoup.parse(driver.getPageSource());
    driver.quit(); //quit webdriver

        // get page title
        String title = doc.title();
        System.out.println("title : " + title);

        // get all links with rev-text class
        Elements links = doc.getElementsByClass("rev-text");
     for (Element link : links) {
            // get the value from href attribute
            System.out.println("\nlink : " + link);
            System.out.println("text : " + link.text());

        }
    }
}

您需要将selenium库添加到类路径中。我正在使用maven所以我添加的是:

    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.8.3</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.45.0</version>
    </dependency>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-remote-driver</artifactId>
        <version>2.45.0</version>
    </dependency>
    <dependency>
        <groupId>com.codeborne</groupId>
        <artifactId>phantomjsdriver</artifactId>
        <version>1.2.1</version>
    </dependency>

这对我来说很好,并在页面中提取评论。

  1. Wait for specific element in selenium