使用Selenium来抓取动态加载的页面
来源:互联网 发布:linux路由追踪 编辑:程序博客网 时间:2024/04/30 17:33
有些页面是通过js以及ajax动态加载的,例如:花瓣网。这时如果我们直接分析原始页面的html,是得不到有效的信息的。当然,因为无论怎样动态加载,基础信息总归是包含在初始页面中得,所以我们可以用爬虫代码来模拟js代码,js读取页面元素值,我们也读取页面元素值;js发送ajax,我们就拼凑参数、发送ajax并解析返回的json。这样总归是能做的,但是比较麻烦,有没有比较省力的方法呢?比较好的方法大概是内嵌一个浏览器了。
Selenium是一个模拟浏览器,进行自动化测试的工具,它提供一组API可以与真实的浏览器内核交互。Selenium是跨语言的,有Java、C#、python等版本,并且支持多种浏览器,chrome、firefox以及IE都支持。
在Java项目中使用Selenium,需要做两件事:
在项目中引入Selenium的Java模块,以Maven为例:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.33.0</version> </dependency>
下载对应的driver,以chrome为例:http://code.google.com/p/chromedriver/downloads/list
下载后,需要将driver的位置写到Java的环境变量里,例如我在mac下将其下载到了/Users/yihua/Downloads/chromedriver,则需要在程序里添加以下代码(当然在JVM参数里写-Dxxx=xxx也是可以的):
System.getProperties().setProperty("webdriver.chrome.driver","/Users/yihua/Downloads/chromedriver");
Selenium的API挺简单的,核心是WebDriver,下面是动态渲染页面,并获取最终html的代码:
@Test
public void testSelenium() {
System.getProperties().setProperty("webdriver.chrome.driver", "/Users/yihua/Downloads/chromedriver");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://huaban.com/");
WebElement webElement = webDriver.findElement(By.xpath("/html"));
System.out.println(webElement.getAttribute("outerHTML"));
webDriver.close();
}
值得注意的是,每次new ChromeDriver(),Selenium都会建立一个Chrome进程,并使用一个随机端口在Java中与chrome进程进行通信来交互。由此可见有两个问题:
因此如果直接关闭Java程序,Chrome进程可能是无法关闭的。这里需要显示的调用webDriver.close()来关闭进程。
创建进程的开销还是比较大的,尽量对webDriver进行复用会比较好。可惜根据官方的文档,webDriver不是线程安全的,所以我们需要建立一个webDriver池来保存它们。不清楚Selenium是否有这样的接口,反正我是自己写了一个WebDriverPool来完成这个任务。
Selenium是一个模拟浏览器,进行自动化测试的工具,它提供一组API可以与真实的浏览器内核交互。Selenium是跨语言的,有Java、C#、python等版本,并且支持多种浏览器,chrome、firefox以及IE都支持。
在Java项目中使用Selenium,需要做两件事:
在项目中引入Selenium的Java模块,以Maven为例:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>2.33.0</version> </dependency>
下载对应的driver,以chrome为例:http://code.google.com/p/chromedriver/downloads/list
下载后,需要将driver的位置写到Java的环境变量里,例如我在mac下将其下载到了/Users/yihua/Downloads/chromedriver,则需要在程序里添加以下代码(当然在JVM参数里写-Dxxx=xxx也是可以的):
System.getProperties().setProperty("webdriver.chrome.driver","/Users/yihua/Downloads/chromedriver");
Selenium的API挺简单的,核心是WebDriver,下面是动态渲染页面,并获取最终html的代码:
@Test
public void testSelenium() {
System.getProperties().setProperty("webdriver.chrome.driver", "/Users/yihua/Downloads/chromedriver");
WebDriver webDriver = new ChromeDriver();
webDriver.get("http://huaban.com/");
WebElement webElement = webDriver.findElement(By.xpath("/html"));
System.out.println(webElement.getAttribute("outerHTML"));
webDriver.close();
}
值得注意的是,每次new ChromeDriver(),Selenium都会建立一个Chrome进程,并使用一个随机端口在Java中与chrome进程进行通信来交互。由此可见有两个问题:
因此如果直接关闭Java程序,Chrome进程可能是无法关闭的。这里需要显示的调用webDriver.close()来关闭进程。
创建进程的开销还是比较大的,尽量对webDriver进行复用会比较好。可惜根据官方的文档,webDriver不是线程安全的,所以我们需要建立一个webDriver池来保存它们。不清楚Selenium是否有这样的接口,反正我是自己写了一个WebDriverPool来完成这个任务。
0 0
- 使用Selenium来抓取动态加载的页面
- 使用Selenium来抓取动态加载的页面
- 使用Selenium来抓取动态加载的页面
- 使用selenium抓取JS动态生成的页面
- selenium动态抓取页面元素
- 使用Python+selenium+BeautifulSoup抓取动态网页的关键信息
- 动态网页抓取Selenium的安装与使用
- java 动态加载的页面数据的抓取
- python selenium,PhantomJS运用 抓取滚动条滚动加载的页面, js动作操作,模拟登陆
- Selenium总结:模拟浏览器动态加载页面
- selenium抓取动态网页
- 使用python抓取js动态加载的网页
- 使用python抓取js动态加载的网页
- 使用phantomjs抓取JS动态生成的页面
- 使用phantomjs抓取JS动态生成的页面
- Python抓取网页动态数据——selenium webdriver的使用
- Python使用Selenium + PhantomJS抓取动态网页:今日头条
- python使用spynner抓取动态页面数据
- iphone的尺寸
- 柳州柳州输精管堵塞价格
- Hadoop常用配置总结
- linux下添加用户并赋予root权限
- 柳州柳州治输精管堵塞大约什么价格
- 使用Selenium来抓取动态加载的页面
- linux 驱动相关命令小结
- 公司面试题精选
- mysqldump导出时: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1':
- ViewPager动态加载、删除页面
- android debug工具集(挺全的)
- MINA学习
- 写一个函数实现*, - , /操作,你能使用的操作只有加法+。
- 通过NSURLRequest获得服务器返回的http header和http status