1. 安装Selenium + Gecko

1.1 安装selenium

1
sudo pip install selenium
1
2
3
4
$ python
>>> import selenium
>>> print selenium.__version__
3.11.0

1.2 测试

1
2
3
4
5
6
7
from selenium import webdriver

driver = webdriver.Chrome()
# driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
print driver.title
driver.quit()

运行时在driver = webdriver.Chrome()处报错,说明没有安装driver。

1.3 安装driver

chromedriver(Chrome浏览器):

http://chromedriver.storage.googleapis.com/index.html

geckodriver(Firefox浏览器)

https://github.com/mozilla/geckodriver/releases

安装的方法

http://stackoverflow.com/questions/8255929/running-webdriver-chrome-with-selenium

下载解压后,放到/usr/bin,然后加上执行权限,命令如下:

1
2
3
4
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/bin/
cd /usr/bin
sudo chmod +x chromedriver

另一个geckodriver也是一样。

1.4 后记

再次执行测试代码成功,说明selenium基本安装成功了。

2. 小试牛刀

1
2
3
4
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://sg.search.yahoo.com/")

我们使用火狐进行模拟,运行自动打开了雅虎搜索网页。下一步,进行模拟输入,要先找到输入的标签。用浏览器打开雅虎(此处用的FireFox),右键输入框-查看元素,可以得知输入框的id为yschsp ,搜索按钮的class为sbb。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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的强大之处,这样对于很多动态页面也能很方便地爬取了!

3. 问题

selenium的慢是出了名的,很多坑需要用一些手段来处理。我总结一下目前遇到的一些问题。

3.1 编译器报错

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:

这是为什么呢,因为浏览器驱动器看不到你要找的元素!最可能的情况就是网速慢导致还没加载出来,那我们就等他加载出来。

1
2
import time
time.sleep(1)

当然还有其他更加灵活的方法,可以查api来学习。(其实是笔者还不太会,不敢乱讲(逃))

3.2 需要通过交互才能加载出来,比如要按个按钮

这就需要自己仔细地去查找了。

3.3 需要滚动才会加载新东西,比如qq空间

1
2
js="document.documentElement.scrollTop=10000" #拖动滚动条到屏幕底端
driver.execute_script(js)

我们可以使用js强制滚动,这样就可以加载出新的元素。

3.4 找到的按钮click根本没用,可能是网页框架引起的

可能需要点击父元素,同样的也是要找到父元素后使用click方法。