WebDriver 是一个开源的工具,一般用于web应用的自动化测试,或者抓取浏览器中元素。
在使用 Selenium 过程中,我们需要对 Chrome 做一些初始化设置,以便浏览器完成我们期望的行为。
ChromeOptions 属性
ChromeOptions 可以在浏览器启动之前设置加载的选项,可以通过 Selenium 源码看到:
class Options(object):
KEY = "goog:chromeOptions"
def __init__(self):
self._binary_location = ''
self._arguments = []
self._extension_files = []
self._extensions = []
self._experimental_options = {}
self._debugger_address = None
ChromeOoptions 主要提供以下功能:
- 设置 chrome 文件位置(binary_location)
- 添加启动配置(arguments)
- 添加插件(add_extension)
- 添加设置参数(add_experimental_options)
下面就根据这几个参数展开描述:
测试代码如下
import time
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
# 最常见的场景是设置 user-argument 来模拟移动设备
# 比如下面模拟 iphone6
options.add_argument(
'user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) '
'AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 '
'Mobile/13B143 Safari/601.1"')
# 禁止加载图片
prefs = {
'profile.default_content_setting_values.images': 2
}
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(chrome_options=options)
urls = [
'http://www.touxiangzhan.com/qinglvtouxiang/',
'http://www.touxiangzhan.com/nanshengtouxiang/',
'http://www.touxiangzhan.com/nvshengtouxiang/',
'http://www.touxiangzhan.com/oumeitouxiang/',
'http://www.touxiangzhan.com/daizitouxiang/',
'http://www.touxiangzhan.com/katongtouxiang/',
'http://www.touxiangzhan.com/gexingtouxiang/',
'http://www.touxiangzhan.com/weixintouxiang/',
'http://www.touxiangzhan.com/touxiang/',
'http://www.touxiangzhan.com/qinglvtouxiang/daizi/',
'http://www.touxiangzhan.com/qinglvtouxiang/katong/',
'http://www.touxiangzhan.com/qinglvtouxiang/oumei/',
'http://www.touxiangzhan.com/qinglvtouxiang/baqi/',
'http://www.touxiangzhan.com/qinglvtouxiang/feizhuliu/',
'http://www.touxiangzhan.com/qinglvtouxiang/yizuoyiyou/',
'http://www.touxiangzhan.com/qinglvtouxiang/jiewen/',
'http://www.touxiangzhan.com/qinglvtouxiang/weimei/',
'http://www.touxiangzhan.com/qinglvtouxiang/heibai/',
'http://www.touxiangzhan.com/qinglvtouxiang/haokan/',
'http://www.touxiangzhan.com/qinglvtouxiang/xiaoqingxin/',
'http://www.touxiangzhan.com/qinglvtouxiang/yinanyinv/',
'http://www.touxiangzhan.com/qinglvtouxiang/keai/'
]
start_time = time.time()
for url in urls:
try:
driver.get(url)
except Exception as e:
print(e)
print(time.time() - start_time)
driver.quit()
修改 chrome 设置
一、禁止加载图片
在页面加载过程中,我们或许不需要图片相关信息,这个时候,就需要浏览器加载页面时屏蔽图片,可以使用下面这种方式:
options = webdriver.ChromeOptions()
prefs = {
'profile.default_content_setting_values.images': 2
}
prefs = {
'profile.default_content_setting_values':
{'images': 2}
} # 这两行代码表达的意思相同,只要给prefs参数一个明确的json格式就可以
options.add_experimental_option('prefs', prefs)
二、添加chrome插件
在使用 ChromeDriver 过程中,经常会碰到这样的问题,我不想加载什么?除了上文说到的图片,我们第一反应就是广告了,这绝对不是我们想获取的有效信息,什么办法解决呢?
简单!日常过程中我们怎么使用 chrome屏蔽广告,现在也怎么做。
第一步,不用说,要下载离线版的 插件
Chrome 的插件都是crx格式,如果在应用商店直接安装插件,插件在安装完毕后会自动被Chrome 清理,所以需要下载离线版本的插件。(这里以屏蔽广告的 Adblock Plus 为例)
搜索并获取插件id
第二步:进入这个神奇的网站 https://yurl.sinaapp.com/crx.php,复制 插件ID ,按照提示另存为到当前文件某个目录下(这里涉及到文件的相对路径,所以要自己把控)
目前为止已经有了插件,设置 crx 文件到插件选项
options = webdriver.ChromeOptions()
options.add_extension('../source/extension_1_13_4.crx')
# 特别申明,这里的相对路径是我本地代码的路径,如果有问题,修改为下载好
# 的crx文件位置,如果不了解相对路径,可以先用绝对路径测试
driver = webdriver.Chrome(chrome_options=options)
启动后效果如下:
启动效果
三、巨无霸初始化方式
毋庸置疑,巨无霸方式可以把初始化的过程够囊括进来
这里的侧重点是如何设置浏览器代理
CHROME = {
"browserName": "chrome",
"version": "",
"platform": "ANY",
"javascriptEnabled": True,
"chrome.prefs": {"profile.managed_default_content_settings.images": 2},
"proxy": {
"httpProxy":"localhost:8118",
"ftpProxy":None,
"sslProxy":None,
"noProxy":None,
"proxyType":"MANUAL",
"class":"org.openqa.selenium.Proxy",
"autodetect":False
},
"chrome.switches": ["window-size=1003,719", "allow-running-insecure-content", "disable-web-security", "disk-cache-dir=/var/www/cake2.2.4/app/tmp/cache/selenium-chrome-cache", "no-referrers"],
}
self.selenium = webdriver.Chrome(desired_capabilities=CHROME)
# 参考来源 https://stackoverflow.com/questions/15165593/set-chrome-prefs-with-python-binding-for-selenium-in-chromedriver
四、小结
总体来说,所有的 options 设置选项都是根据 ChromeDriver 暴露出来的配置项,塞入我们需要的 dict 格式文件,一旦格式正确,就可以获得期望的结果。这就是工具的使用,
光说不练假把式
最后我们来看看去除非有效信息后页面加载的效果:(效果相差两个数量级)
没有设置过滤信息前:
打开22个包含图片页面耗费时间 144.80
设置过滤信息后:
打开22个包含图片页面耗费时间 6.07
(这里针对的是图片较多网站做的测试,效果明显点)
过滤后结果
网友评论