在抓取网页数据时,传统jsoup方案只能对静态页面有效,而有些网页数据往往是js生成的,所以这时候需要其它的方案。
首先的思路是分析js程序,对js的请求进行再次抓取,这适合于特定的页面抓取,要做到对不同目标URL的通用性,比较麻烦。
第二种思路,也是比较成熟的做法是利用第三方的驱动渲染页面,然后下载。这里介绍一下第二种实现思路。
Selenium是一个模拟浏览器的自动化测试工具,它提供一组API可以与真实的浏览器内核交互。
Java环境下的maven配置如下:
org.seleniumhq.selenium
selenium-java
2.46.0
第三方驱动主要有IEDriver,FirefoxDriver,ChromeDriver,HtmlUnitDriver。
htmlUnit也是一种自动化测试的工具。可以用HtmlUnit模拟浏览器运行,获得执行后的html页面。其中HtmlUnitDriver是对htmlUnit的封装。
因为htmlunit对js解析的支持有限,在实际工程中并不常用。
以chrome为例下载对应的驱动:http://code.google.com/p/chromedriver/downloads/list。
下载driver时需要注意与selenium的版本兼容,可能出现异常情况,一般下载最新版本就好。
程序运行前一定要制定驱动位置,比如在Windows下面
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
获取整个页面
public static void testChromeDriver() {
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://picture.youth.cn/qtdb/201506/t20150625_6789707.htm");
String responseBody = webDriver.getPageSource();
System.out.println(responseBody);
webDriver.close();
}获取新浪评论数
public static void waitForSomthing(){
System.getProperties().setProperty("webdriver.chrome.driver",
"D:\\chromedriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://news.sina.com.cn/c/2015-07-04/023532071740.shtml");
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(new ExpectedCondition() {
public Boolean apply(WebDriver webDriver) {
System.out.println("Searching ...");
return webDriver.findElement(By.id("commentCount1")).getText().length() != 0;
}
});
WebElement element = driver.findElement(By.id("commentCount1"));
System.out.println("element="+element.getText());
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/lgcssx/article/details/47174565