在抓取网页数据时,传统jsoup方案只能对静态页面有效,而有些网页数据往往是js生成的,所以这时候需要其它的方案。
首先的思路是分析js程序,对js的请求进行再次抓取,这适合于特定的页面抓取,要做到对不同目标URL的通用性,比较麻烦。
第二种思路,也是比较成熟的做法是利用第三方的驱动渲染页面,然后下载。这里介绍一下第二种实现思路。
Selenium是一个模拟浏览器的自动化测试工具,它提供一组API可以与真实的浏览器内核交互。
Java环境下的maven配置如下:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.46.0</version> </dependency>
第三方驱动主要有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<Boolean>() { 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()); }
关于selenium的更多api及介绍:http://docs.seleniumhq.org/docs/
参考:http://my.oschina.net/flashsword/blog/147334
一些driver的测试报告:http://my.oschina.net/xxjbs001/blog/396564
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-13 21:41:38