【python】selenium模拟浏览器

1、模块介绍
selenium最初是一个自动化测试工具,不过爬虫也经常使用该模块,主要是为了解决requests库无法直接获取js代码渲染的数据的问题。
selenium本质是通过驱动浏览器,完全模拟浏览器的动作,可以支持多种浏览器。
使用selenium获取到的页面是所见即所得的,就是说不止后台返回的数据能获取到,通过js渲染的数据也会获取到。
selenium的性能怎么样呢?亲自测试,访问一个链接40次(进程池=6),快的时候需要30秒左右,慢的时候需要180秒左右。
2、模块安装
这儿给出了linux arm, linux x86_64, windows环境安装步骤,按自己情况进行安装。
2.1 Linux armv7l安装
我使用的树莓派测试的sulenium模块

pip3 install selenium==3.141.0

2.1.2 chromium浏览器安装
sudo apt-get install chromium-browser # 这样安装是最新的浏览器
2.1.3 chromium-chromedriver驱动安装
sudo apt-get install chromium-chromedriver # 这样安装是最新的驱动
一般浏览器和驱动安装最新的版本都会对应上,如下图都是92版本:

浏览器和浏览器驱动版本一定要配套。比如,如果你用92版本的驱动去启动86版本的浏览器,直接就会报错。如下图所示:

2.2 Linux x86_64安装
2.2.1 chrome browser下载安装
树莓派系统架构是基于arm的,而现在很多软件都是基于x86_64的或者windows的,如果你的机器架构是x86_64或者windows的,网上很容易找找到安装chrome+chromedriver的教程。
安装最新稳定版本的chrome浏览器:
yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
或者
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum install ./google-chrome-stable_current_x86_64.rpm
如果想安装chrome历史版本,从下方链接里找:
https://www.chromedownloads.net/chrome64linux-stable/
安装好之后查看chrome browser版本
chrome --version
2.2.2 chromedriver驱动下载安装
下载后解压会得到chromedirver二进制文件,并添加a+x执行权限,拷贝到/usr/local/bin或者/usr/bin目录下
# 这儿注意下载驱动版本,要和上面的浏览器版本保持一致
wget https://npm.taobao.org/mirrors/chromedriver/97.0.4692.36/chromedriver_linux64.zip
# 将zip解压到当前目录chromedriver_linux64下
unzip -d ./chromedriver_linux64 chromedriver_linux64.zip
chmod a+x ./chromedriver_linux64/chromedriver
# 如果机器上本来就有驱动,备份下
if [ -f "/usr/local/bin/chromedriver" ]; then
mv /usr/local/bin/chromedriver /usr/local/bin/chromedriver_old
fi
cp ./chromedriver_linux64/chromedriver /usr/local/bin
这儿附上两个找不同版本驱动的链接
官方下载链接:chromedriver.storage.googleapis.com/index.html
taobao下载链接: http://npm.taobao.org/mirrors/chromedriver
2.3 windows安装
2.3.1 chrome browser下载安装
https://www.chromedownloads.net/chrome64win/
2.3.2 chromdriver驱动下载安装
http://npm.taobao.org/mirrors/chromedriver
注意驱动下载之后,要放到python安装包的目录下

3、模块使用
举一个例子:
from selenium import webdriver
if __name__ == "__main__":
options = webdriver.ChromeOptions() # 实例化浏览器选项
options.add_argument('--headless') # 添加无头模式
options.add_argument('ignore-certificate-errors') # 解决“您的链接不是私密链接”错误
driver = webdriver.Chrome(executable_path='/usr/lib/chromium-browser/chromedriver', options=options) # 启动chrome浏览器,executable_path指定的是驱动路径
driver.get("http://www.baidu.com") # 访问百度首页
print(driver.page_source) # 获取访问页面的内容
driver.close() # 关闭浏览器
无头模式:就是你不用可视化浏览器就可以访问url,不需要前台展示。没有头嘛~
4、遇到的问题
4.1 最常见的就是浏览器和驱动版本不一致导致报错,所以发生错误的时候首先检查自己下载的浏览器和驱动版本。
4.2 在创建浏览器的时候,即webdriver.Chrome()这一步卡住了,不输出任何东西,也不报错退出。
解决办法:在/etc/hosts中添加一行: 127.0.0.1 localhost。
4.3 报错:Message: Reached error page:about:neterror?e=proxyConnectFailure……
问题原因:你访问的链接,浏览器打不开。
解决办法:检查你的网络是不是确实打不开该网址。

以上知识如果理解有错误,欢迎指出,共同学习。