selenium 的 add_experimental_option无法识别问题

2021-03-11 11:46发布

[图]不光是excludeSwitches参数,其他的add_experimental_option参数都出现相同情况。3天前使用还是好的,今天早上就不行了。

不光是excludeSwitches参数,其他的add_experimental_option参数都出现相同情况。3天前使用还是好的,今天早上就不行了。


1条回答
Anonyem
2楼 · 2021-03-18 14:46





selenium+python配置chrome浏览器的选项

  1. 背景

  2. 在使用selenium浏览器渲染技术,爬取网站信息时,默认情况下就是一个普通的纯净的chrome浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用。相对应的,当我们用chrome浏览器爬取网站时,可能需要对这个chrome做一些特殊的配置,以满足爬虫的行为。常用的行为有:禁止图片和视频的加载:提升网页加载速度。添加代理:用于翻墙访问某些页面,或者应对IP访问频率限制的反爬技术。使用移动头:访问移动端的站点,一般这种站点的反爬技术比较薄弱。添加扩展:像正常使用浏览器一样的功能。设置编码:应对中文站,防止乱码。阻止JavaScript执行。………

  3. 2.环境

  4. python3.6.1系统:win7IDE:pycharm安装过chrome浏览器配置好chromedriverselenium3.7.0

  5. 3.chromeOptions

  6. chromeOptions是一个配置chrome启动是属性的类。通过这个类,我们可以为chrome配置如下参数(这个部分可以通过selenium源码看到):设置chrome二进制文件位置(binary_location)添加启动参数(add_argument)添加扩展应用(add_extension,add_encoded_extension)添加实验性质的设置参数(add_experimental_option)设置调试器地址(debugger_address)源代码:

  7. #.\Lib\site-packages\selenium\webdriver\chrome\options.py

  8. classOptions(object):

def__init__(self):

#设置chrome二进制文件位置

self._binary_location=''

#添加启动参数

self._arguments=[]

#添加扩展应用

self._extension_files=[]

self._extensions=[]

#添加实验性质的设置参数

self._experimental_options={}

#设置调试器地址

self._debugger_address=None


使用案例:

#设置默认编码为utf-8,也就是中文


fromseleniumimportwebdriver

options=webdriver.ChromeOptions()

options.add_argument('lang=zh_CN.UTF-8')

driver=webdriver.Chrome(chrome_options=options)


4.常用配置

官方网站参考:https://sites.google.com/a/chromium.org/chromedriver/capabilities

4.1.设置编码格式

#设置默认编码为utf-8,也就是中文


fromseleniumimportwebdriver

options=webdriver.ChromeOptions()

options.add_argument('lang=zh_CN.UTF-8')

driver=webdriver.Chrome(chrome_options=options)


4.2.模拟移动设备

移动设备user-agent表格:http://www.fynas.com/ua因为移动版网站的反爬虫的能力比较弱

#通过设置user-agent,用来模拟移动设备

#比如模拟android浏览器

options.add_argument('user-agent="MBrowser/26Mozilla/5.0(Linux;U;Android2.3.7;zh-cn;MB200Build/GRJ22;CyanogenMod-7)AppleWebKit/533.1(KHTML,likeGecko)Version/4.0MobileSafari/533.1"')


#模拟iPhone6

options.add_argument('user-agent="Mozilla/5.0(iPhone;CPUiPhoneOS9_1likeMacOSX)AppleWebKit/601.1.46(KHTML,likeGecko)Version/9.0Mobile/13B143Safari/601.1"')


4.3.禁止图片加载

不加载图片的情况下,可以提升爬取速度。

#禁止图片的加载

fromseleniumimportwebdriver


chrome_options=webdriver.ChromeOptions()

prefs={"profile.managed_default_content_settings.images":2}

chrome_options.add_experimental_option("prefs",prefs)


#启动浏览器,并设置好wait

browser=webdriver.Chrome(chrome_options=chrome_options)

browser.set_window_size(configure.windowHeight,configure.windowWidth)#根据桌面分辨率来定,主要是为了抓到验证码的截屏

wait=WebDriverWait(browser,timeout=configure.timeoutMain)


4.4.添加代理

为selenium爬虫添加代理,这个地方尤其需要注意的是,在选择代理时,尽量选择静态IP,才能提升爬取的稳定性。因为如果选择selenium来做爬虫,说明网站的反爬能力比较高(要不然直接上scrapy了),对网页之间的连贯性,cookies,用户状态等有较高的监测。如果使用动态匿名IP,每个IP的存活时间是很短的(1~3分钟)。

fromseleniumimportwebdriver

#静态IP:102.23.1.105:2005

#阿布云动态IP:http://D37EPSERV96VT4W2:CERU56DAEB345HU90@proxy.abuyun.com:9020

PROXY="proxy_host:proxy:port"

options=webdriver.ChromeOptions()

desired_capabilities=options.to_capabilities()

desired_capabilities['proxy']={

"httpProxy":PROXY,

"ftpProxy":PROXY,

"sslProxy":PROXY,

"noProxy":None,

"proxyType":"MANUAL",

"class":"org.openqa.selenium.Proxy",

"autodetect":False

}

driver=webdriver.Chrome(desired_capabilities=desired_capabilities)


4.5.浏览器选项设置

selenium一般打开的是不带扩展的纯净的浏览器,但是有时候我们想对浏览器进行一些设置,比如设置flash选项的默认值为全局始终允许,清除cookies,清除缓存之类。想要实现这个目的,有一种思路,下面以chrome浏览器为例:在selenium爬虫启动时,首先开一个窗口,在地址栏键入:chrome://settings/content或chrome://settings/privacy,然后由程序,像操作普通网页一样,进行设置,保存。

4.6.添加浏览器扩展应用

selenium一般打开的是不带扩展的纯净的浏览器,但是有时候我们爬取数据时需要借助一些插件,比如解析类xpathhelper,翻译类,获取额外信息(销量)等。那我们怎么在启动chromedriver时,带上一些我们需要的插件呢?下面以在chrome中加载XpathHelper插件为例:

4.6.1.下载相应的插件

XpathHelper下载地址:http://download.csdn.net/download/gengliang123/9944202如下,是一个以crx为后缀的文件:

4.6.2.将插件路径填入代码中

#添加xpathhelper应用


fromseleniumimportwebdriver

chrome_options=webdriver.ChromeOptions()


#设置好应用扩展

extension_path='D:/extension/XPath-Helper_v2.0.2.crx'

chrome_options.add_extension(extension_path)


#启动浏览器,并设置好wait

browser=webdriver.Chrome(chrome_options=chrome_options)


4.6.3.结果展示


4.6.4.注意事项

第一,为了提高爬取速度,尽可能的少加载插件。第二,有一种方案会加载用户对chrome浏览器的所有配置信息,但是测试并无法使用,如下:参考文章:http://blog.csdn.net/y100100/article/details/44061469参考文章:https://www.cnblogs.com/stonewang313/p/3938488.html参考文章:http://blog.csdn.net/liaojianqiu0115/article/details/78353267首先进入C:\Users(用户)\你的电脑名称\AppData\Local\Google\Chrome\UserData\Default\Extensions,点开Extensions,里面的文件夹就是安装过的扩展,(记得先把电脑隐藏文件夹显示出来,否则找不到)但是名字是一堆我看不懂的无序的英文字母,我的办法是一个一个点开找到对应的插件版本号,版本号在chromeExtensions选项里找然后打包你需要的插件:打开chrome的设置,在里面点开扩展程序,选中开发者模式,你安装的插件的下面会出现一个ID,这个ID对应的就是你要打包的插件,然后打包扩展程序,找到对应的文件夹(或者你也可以把这个文件夹复制到电脑任意地方)下面的版本号的文件夹,也就是ID名文件夹内部的那个文件夹,然后点击打包扩展程序,就可以了,会相应的在版本号的同一级地方出现后缀名是crx和pem的文件,这个crx的文件就是我们需要的(不过按照这种方式,在我的本地目录是找不到这样的crx文件,需要单独下载…)。准备工作完成,看代码:

#第一种方式

#chrome浏览器的扩展程序都在:C:\Users\Administrator\AppData\Local\Google\Chrome\UserData\Profile2\Extensions\下

chrome_options.add_argument("user-data-dir=C:/Users/Administrator/AppData/Local/Google/Chrome/UserData")


#加载所有Chrome配置,用Chrome地址栏输入chrome://version/,查看自己的“个人资料路径”,然后在浏览器启动时,调用这个配置文件,代码如下:

fromseleniumimportwebdriver

option=webdriver.ChromeOptions()

option.add_argument('--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\UserData')#设置成用户自己的数据目录

driver=webdriver.Chrome(chrome_options=option)


#出现错误结果

第一,所有浏览器窗口,包括自己打开的都会被控制住。

第二,其他动作不起作用,而且会crash。

Traceback(mostrecentcalllast):

File"E:/PyCharmCode/taobaoProductSelenium/taobaoSelenium.py",line40,in

#启动浏览器,并设置好wait

File"E:\Miniconda\lib\site-packages\selenium\webdriver\chrome\webdriver.py",line69,in__init__

desired_capabilities=desired_capabilities)

File"E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webdriver.py",line151,in__init__

self.start_session(desired_capabilities,browser_profile)

File"E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webdriver.py",line240,instart_session

response=self.execute(Command.NEW_SESSION,parameters)

File"E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webdriver.py",line308,inexecute

self.error_handler.check_response(response)

File"E:\Miniconda\lib\site-packages\selenium\webdriver\remote\errorhandler.py",line194,incheck_response

raiseexception_class(message,screen,stacktrace)

selenium.common.exceptions.WebDriverException:Message:unknownerror:Chromefailedtostart:crashed

(Driverinfo:chromedriver=2.32.498550(9dec58e66c31bcc53a9ce3c7226f0c1c5810906a),platform=WindowsNT6.1.7601SP1x86_64)


4.7.登录时关闭弹出的密码保存提示框

最近在使用chrome登录网站的时候总有密码保存提示框,并不是所有的都会有密码保存提示框,其实只需要设置启动chrome的相关参数就可以避免这种问题。

fromtimeimportsleep

fromseleniumimportwebdriver

fromselenium.webdriver.common.byimportBy

options=webdriver.ChromeOptions()

prefs={}

#设置这两个参数就可以避免密码提示框的弹出

prefs[“credentials_enable_service”]=False

prefs[“profile.password_manager_enabled”]=False

options.add_experimental_option(“prefs”,prefs)

browser=webdriver.Chrome(chrome_options=options)

browser.get('https://www.baidu.com/')


5.其他参数

参考文章:http://blog.csdn.net/liaojianqiu0115/article/details/78353267

5.1.chrome地址栏命令

在Chrome的浏览器地址栏中输入以下命令,就会返回相应的结果。这些命令包括查看内存状态,浏览器状态,网络状态,DNS服务器状态,插件缓存等等。但是需要注意的是这些命令会不停的变动,所以不一定都是好用的。  about:version-显示当前版本  about:memory-显示本机浏览器内存使用状况  about:plugins-显示已安装插件  about:histograms-显示历史记录  about:dns-显示DNS状态  about:cache-显示缓存页面  about:gpu-是否有硬件加速  about:flags-开启一些插件//使用后弹出这么些东西:“请小心,这些实验可能有风险”,不知会不会搞乱俺的配置啊!  chrome://extensions/-查看已经安装的扩展

5.2.chrome实用参数

其他的一些关于Chrome的实用参数及简要的中文说明,使用方法同上4.5.4,当然也可以在shell中使用。  –user-data-dir=”[PATH]”指定用户文件夹UserData路径,可以把书签这样的用户数据保存在系统分区以外的分区。  –disk-cache-dir=”[PATH]“指定缓存Cache路径  –disk-cache-size=指定Cache大小,单位Byte  –firstrun重置到初始状态,第一次运行  –incognito隐身模式启动  –disable-javascript禁用Javascript  --omnibox-popup-count=“num”将地址栏弹出的提示菜单数量改为num个。我都改为15个了。  --user-agent=“xxxxxxxx”修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果  --disable-plugins禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果  --disable-javascript禁用JavaScript,如果觉得速度慢在加上这个  --disable-java禁用java  --start-maximized启动就最大化  --no-sandbox取消沙盒模式  --single-process单进程运行  --process-per-tab每个标签使用单独进程  --process-per-site每个站点使用单独进程  --in-process-plugins插件不启用单独进程  --disable-popup-blocking禁用弹出拦截  --disable-plugins禁用插件  --disable-images禁用图像  --incognito启动进入隐身模式  --enable-udd-profiles启用账户切换菜单  --proxy-pac-url使用pac代理[via1/2]  --lang=zh-CN设置语言为简体中文  --disk-cache-dir自定义缓存目录  --disk-cache-size自定义缓存最大值(单位byte)  --media-cache-size自定义多媒体缓存最大值(单位byte)  --bookmark-menu在工具栏增加一个书签按钮  --enable-sync启用书签同步  –single-process单进程运行GoogleChrome  –start-maximized启动GoogleChrome就最大化  –disable-java禁止Java  –no-sandbox非沙盒模式运行


相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问