selenium101-Mac环境下ChromeDriver配置

介绍配置之前我想说一说我的心路历程

其实很早之前就了解了selenium,也是曾今在写豆瓣相册爬虫(有兴趣戳一下源码)的时候遇到麻烦的反爬机制的困难时,查到想用的方法之一,但是本着尽量不要曲线救国的想法,想出了更好的解决办法。

来说说Selenium + Python + BrowserDriver其实是用来作web自动化检测的好工具,作用是模拟人的操作行为在浏览器里自动操作网页。简单来说就是基于网页的测试,比如往表单里填各种乱七八糟的值,戳一戳提交按钮,看看有什么bug。

然而Selenium + Python 配合BeautifulSoup或者re也可以成为模拟真实用户的爬虫,这个优点就是可以自如应对动态加载的网页的,还包括需要登录的网页。虽然我觉得所有动态加载网页都可以有办法用静态方式,分析链接和css布局来爬取。但是多一条路多一种选择,走完了才知道哪条路远一些,喊声最大的一般都是在起点犹豫的。当然用Selenium爬取缺点也很明显,就是当爬取得量一大速度明显很慢,满足不了大数据量的爬取方式。我觉得因为这是一种模拟用户行为,当正常爬虫已经得到请求了,这边还在submit,所以你说呢(欢迎指正)。

进入正题,环境配置

关于如何安装Selenium,不多说了google it.
我这里说一下PyCharm的package管理真的是良心,我装了python3.5,之前有一些包在terminal里死活装不上3.5里,找了各种办法,堪比Windows下VS环境配置。最后我发现PyCharm可以对不同版本的包进行一站式管理。

1
Preferences > Project: name > Project interpreter

添加,删除都可以操作,如果在非系统版本安装遇到问题,先对系统版本的同名package进行操作,比如删除安装。再到你要安装的版本操作,比如Selenium。

接下来说一下安装ChromeDriver,首先下载ChromeDriver executable这里装最新版本就可以了,没有什么版本限制。解压放到一个路径里(只要你能找得到就好),到这里就是路径的配置,其实没有那么麻烦。我选择每次使用时候把chrome driver所在目录作为参数path传给web driver。

1
driver = webdriver.Chrome('/Users/username/filename/chromedriver') # Optional argument, if not specified will search path.

还有一种就是ChromeDriver目录加入到环境变量

1
2
3
4
vim ~/.bash_profile
export PATH=$PATH:ChromeDriver目录(注意,是存放的目录,不是这个文件)
:wq
source ~/.bash_profile

我用的第一种。因为不是谁的电脑都愿意让你乱动环境变量对吧。
下面是官方文档的测试代码:

1
2
3
4
5
6
7
8
9
10
11
import time
from selenium import webdriver
driver = webdriver.Chrome('/path/to/chromedriver') #Optional argument, if not specified will search path.
driver.get('http://www.google.com/xhtml');
time.sleep(5) # Let the user actually see
search_box = driver.find_element_by_name('q')
search_box.send_keys('ChromeDriver')
search_box.submit()
time.sleep(5) # Let the user actually see
driver.quit()

没报错就成功了。
如果报错像这样:

1
2
3
"ChromeDriver executable needs to be available in the path. "
selenium.common.exceptions.WebDriverException: Message: ChromeDriver executable needs to be available in the path.
Please download from http://chromedriver.storage.googleapis.com/index.html and read up at http://code.google.com/p/selenium/wiki/ChromeDriver

毫无疑问你的ChromeDriver路径问题。