您好我是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());
}
}
}
请指导我如何做到这一点。
答案 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>
这对我来说很好,并在页面中提取评论。