工具:python/java + selenium + firefox/chrome/phantomjsjavascript
默认已经安装好了firefox
php
pip是一个python的软件包管理工具,用于自动下载并安装、更新python 包,python3以后的某些版本已经自带pip,在python 2.7以前的话,须要本身安装,如今的安装方法已经很是简单,直接查看官方doc:http://pip.readthedocs.org/en /stable/installing/,下载get-pip.py并执行python get-pip.py便可一键安装。其余方法可参考《怎么在windows下安装pip》。为了便于使用,最好添加到系统变量PATH中。
css
从官网下载windows版本的压缩包(http://phantomjs.org/download.html)。下载以后,直接解压到本地。建议使用最新版phantomjs-2.0.0-windows.zip,由于有些状况下phantomjs不能正确的解析仅仅是由于版本兼容性很差,这种bug基本无解,绕来绕去最终换过版本就行了。html
若是是python环境,安装好pip以后,直接使用java
若是是java环境,下载一个完整的selenium-server-standalone-2.48.2.jar包便可,这个包很大,已经包含了全部依赖包和各类driver如(htmlunit driver之类的)
python
版权问题,debian自带的浏览器并非firefox。若是想在debian环境下,使用firefoxDriver进行模拟点击,就必须先安装firefox。我在debian服务器上试了几种方法均失败,不过下面仍是说一下找到的几种方法。linux
方法一:从firefox官网下载linux版以后,直接解压firefoxgit
方法二:命令行安装。github
参考
web
1.
具体可参考phantomjs的官网:http://phantomjs.org/build.html
跟windows同样简单,直接pip install selenium就搞定,前提是pip可用。
selenium是一个自动化测试工具,支持多种编程语言java/python /javascript/ruby/php/C#/perl。咱们在爬虫中主要用于抓取动态页面时模拟浏览器行为,绕事后台执行js的复杂过程,用“所见 即所得”的方式进行页面点击、截屏、悬浮窗拖拽等。以前中文资料比较少,加上selenium 2.0和1.0巨大的区别,csdn上的中文博客大多很差使。刚搜了一下,好像有些中文社区和更正式一点的博客,感受不错,先贴出来:
1. 《webDriver中文教程 & 中文社区》貌似是今年的,比较官方的样子,还没细看
3. 官网的webdriver使用文档,也属于入门级别,有些复杂操做须要从其余有经验的使用者的博客里边略窥一二。
4.《The Selenium Browser Automation Project》介绍比较全面。
下面主要介绍一下可能遇到的坑,别人的经验能够参考《记录我遇到的使用selenium让人摸不着头脑的问题 》,下面是我碰过几回的
Selenium2(webdriver)在使用get(url)方法打开一个网页的时候,是不会继续加载里面的iframe中的页面源码,这与selenium 1的使用不一样。当碰到有些元素不可选的时候,可使用开发者工具查看是否有iframe元素。
官网已经有使用webdriver的优缺点的比较,例如firefox一般比ie快,而无界面的HtmlUnitDriver一般会比firefox快,但对js的支持并非那么好。而且不一样driver对xpath语法的支持也不同。
就我的使用经验来看,即使是一样的webdriver差异仍是有点大的。例如在某些firefox的版本是能够抓取数据的,但在另一些版本就不 行,selenium在这两年的演化过程当中,中途出现过对最新firefox各类报错、但对老版本firefox就正常,以及对老phantomjs不能 抓取,最新版本phantomjs就OK的状况。当遇到各类很诡异的关于浏览器不能抓取问题的时候,须要考虑尝试不一样的webdriver,以避开 selenium对个别型号的浏览器支持不良的状况。
当网页上有ajax等动态元素时,webdriver.get(url)只会等待html和js文件加载完成,但不必定会等待js生成的元素都出如今页面 源码中。使用xpath或者css选择器的时候,若是js产生的代码没有加载完成,就会报错,这种咱们用开发者工具能发现的元素,但webdriver找 不到的状况,一般都是由于等待时间不够形成的。一般有两种方法:
第一种隐式等待,优势是想法简单,缺点是不一样的页面须要的加载时间不一样,为了保证数据正确,须要取一个最大的等待时间,拖慢代码执行效率。python中的源码以下
driver.implicitly_wait(10) 第二种是显示等待。用于指定等待到页面加载到某些为真的可控条件,例如出现某个元素以后,就认为须要的页面内容已经加载完成了,python代码以下:
wait = WebDriverWait(driver, 30)
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,'authFrame'))) 关于数据等待能够参考:《如何等待页面元素加载完成》java实现,同时举了个须要页面等待的栗子。
一切不上代码的演示都是耍流氓。
若是想访问别的数据页面,能够driver.get(url)和click方法逐步访问、点击。这个效率会比较低,selenium也可使用多线程操做,但selenium并不保证多线程的数据一致性,简单的讲对多线程的支持不是很好。