最近看了才大(静觅博客博主)的selenium教程,在使用过程中也遇到了不少问题,现在应该也算是入了点自动化测试的门道了。
Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。
由于目前前端框架的兴起,很多网站的页面是由javascript生成的,静态页面的爬虫就显得比较无力。这时候就需要拿出selenium这般神器了,他可以模拟浏览器的操作,例如表单操作,点击事件等等。
所以,我们可以通过selenium来爬取一些复杂的网站的信息。譬如淘宝,京东一类的通过框架渲染出来的页面。
那就废话不多说。我们用python结合selenium进行动态爬虫的世界。
首先当然是安装Selenium库,使用pip安装:
pip install selenium
先别急,使用selenium没有浏览器驱动器模拟怎么行,所以推荐使用火狐(FireFox)或者PhantomJs,这里就要问了,什么是PhantamJs呢.
PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。
显然,它和火狐也一样是浏览器,只不过不能直接看到,可以间接的用截图来看。
不过还是推荐使用火狐,因为火狐是比较直观地能看到它的动作的。(为什么不用Chrome呢,因为我找了很多解决方案都没有用,感觉应该是selenium和chrome的驱动器版本不匹配吧 -_-)
当然,这里两者都会提供一下windows的安装方式
这两个东西,由于我的无知,掉了很多坑!终于弄明白安装方式了!
1、PhantomJs,下载地址:
https://npm.taobao.org/dist/phantomjs/
找到对应的版本就好,比如我下载的是phantomjs-2.1.1-windows.zip
解压到任意盘(我是解压到E盘),然后找到bin里的phantomJs.exe。
在这里就可以写javascript脚本了,例如
这样就会输入Hello world了。
但怎么才能在selenium中使用phantomJs呢。Windows用户需要配置环境变量。
因为我的phantomJs.exe在E:\phantomjs-2.1.1-windows\bin里,我就将该位置添加进系统变量的Path里
这个时候phantomJs就配置好了。
进入cmd控制台,输入
phantomJs -v
便可以查询版本,若配置完全,就可以显示版本,我这里显示的就是2.1.1。否则,检查环境变量是否配置正确。
2、火狐(Firefox),下载地址
https://github.com/mozilla/geckodriver/releases
选择合适的版本下载,例如我的是geckodriver-v0.18.0-win64
安装分四步
1、首先得要有个FireFox浏览器,然后把FireFox的安装位置添加到环境变量中,如果不太清楚这步,可以参考phantomjs的过程。
2、然后把刚刚下载的压缩包中的geckodriver.exe 放到 FireFox的安装目录下。
3、最后最好再把geckodriver.exe 放到 python的安装目录下
4、OK,为自己鼓鼓掌,配置成功!
配置完所有环境后,就是 进入正题了,动态爬虫!
这里以FireFox驱动为例,进行selenium的示范
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://sg.search.yahoo.com/")
driver的类型为FireFox,也就是用火狐进行模拟。
driver.get("https://sg.search.yahoo.com/") 这一句是请求雅虎,运行会发现,自动打开了雅虎搜索网页!(我也不知道为啥百度打不开了!!只能拿雅虎试水 :|)
下一步,进行模拟输入,怎么办呢,很简单,找到输入的标签
那么用浏览器打开雅虎(此处用的FireFox),右键输入框-查看元素
可以得知输入框的id为yschsp , 搜索按钮的class为sbb。那就可以写代码了!
from selenium importwebdriver
driver=webdriver.Firefox()
driver.get("https://sg.search.yahoo.com/")
searchWhat=driver.find_element_by_id("yschsp")
#获取id叫做'yschsp'的元素
searchWhat.clear()
#通过clear方法,可以将输入框内的字符清空,比较保险的做法
searchWhat.send_keys("python")
#通过send_keys方法把'python'传递给serchWhat元素,即id叫做'yschsp'的元素
searchBtn=driver.find_element_by_class_name("sbb")
#获取id叫做'sbb'的元素,但通常不推荐用class找,用selector能更精确的找到
searchBtn.click()
#通过click()方法点击
运行后,可以看见浏览器自动输入python后,又点击了按钮进行了搜索!
哈哈哈哈!这就是selenium的强大之处,这样对于很多动态页面也能很方便地爬取了!
然而这个selenium可没那么简单,它的慢是出了名的,很多坑需要用一些手段来处理。我总结一下目前遇到的一些问题。
一、最容易遇到的问题就是 编译器报错:
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:
这是为什么呢,因为浏览器驱动器看不到你要找的元素!对!看不到!
最可能的情况就是网速慢导致还没加载出来,那我们就等他加载出来
import time
time.sleep(1)
强制等待到加载出来。
当然还有其他更加灵活的方法,可以查api来学习。(其实是笔者还不太会,不敢乱讲(逃))
第二种可能是没有通过一些交互的方式加载出来,比如要按个按钮啊之类的,这就需要
自己仔细地去查找了。
第三种是有些网站需要滚动才会加载新的东西,比如qq空间,这时候要用js来强制滚动
js="document.documentElement.scrollTop=10000" #拖动滚动条到屏幕底端
driver.execute_script(js)
这样就可以滚动后再加载出新的元素
二、还有些比较坑的情况,就是你找到的按钮可能用click点击根本没用,并不是找错了,而可能是这个网页的框架引起的,还需要点击父元素,同样的也是要找到父元素后使用click方法。超坑的有木有! (微笑脸)
哈,终于写完了~写完日记写代码~