也许你在浏览一些网页的时候会遇到这种情况,有的网页的内容会设置为登录可见。
如果想要用driver去驱动浏览器浏览隐藏内容的话,就需要事先给它添加cookie信息,这几天使用的时候遇到了一些坑,简单说明下。
首先,我们先创建一个driver:
创建出来的driver专门有一个添加cookie信息的方法 driver.add_cookie() ,他接受的参数是一个字典。回到本文正题,下面说说坑。
add_cookie() 方法接受的字典参数的键名不是随意起的。
不能想当然地分解获取到内容的等号左右的信息。他的键名都是有意义的,一般记住 name 和 value 即可,分别代表cookie的名称和动态生成的值。
确保获取到的cookie内容是有效的。
举个栗子,这是我在登陆某网站后看到的cookie内容:
当然,不知道的话也可以多尝试,但如果你是第一次使用 add_cookie() 方法,建议你一定要在尝试前先看看坑三!
当你高高兴兴地进入目标网址,并想给driver添加好cookie信息:
它可能会报错,注意,这里说的是可能。
如果你遇到了类似 Message: unable to set cookie 的错误,建议使用更稳妥的方式:
就是说,在登录页面添加cookie信息,然后再访问目标网址。
如有错误,欢迎指正~
1. 下载、安装selenium
下载地址:https://pypi.python.org/pypi/selenium
目前的版本是:3.0.0b2
支持:Firefox, Chrome, Internet Explorer, PhantomJS
tar包的下载:selenium-3.0.0b2.tar.gz
解压selenium-3.0.0b2.tar.gz,进入selenium-3.0.0b2目录,执行下面的命令安装:
python setup.py install
2. 下载浏览器Driver Server
Internet Explorer Driver Server
IEDriverServer_Win32_2.53.1.zip
IEDriverServer_x64_2.53.1.zip
如果下载不了,可以到IEDriverServer_Win32_2.53.1.zip,IEDriverServer_x64_2.53.1.zip中下载。
Firefox geckodriver
geckodriver-v0.10.0-linux64.tar.gz
geckodriver-v0.10.0-win64.zip
geckodriver的其他版本
其他浏览器的driver server
解压,并将解压目录添加到环境变量中。
注意1:在windows 64位系统也要使用IEDriverServer Win32版本的,否则可能会出现错误In particular, be sure you are not attempting to use a 64-bit IEDriverServer.exe against IE 10 or 11, even on 64-bit Windows.
注意2:geckodriver不能在cygwin中使用。IEDriverServer在windows和cygwin环境中都可以使用。
注意3: 关于geckodriver的说明: 早期名字叫wires,如果提示wires找不到,可以将geckodriver重命名为wires。
3. 示例
3. 1 示例一:通过IE获取cookie
在python命令行中执行:
>>>from selenium import webdriver>>>ie = webdriver.Ie()>>>ie.get("http://www.cnvd.org.cn")>>>ie.get_cookies()[{'value': 'CA2DD4EBD61BECAC3C19546F4AA52BD0', 'httpOnly': False, 'name': 'JSESSIONID', 'secure': False}, {'secure': False, 'httpOnly': False, 'expiry': 1470457299, 'value': '1470453699.622|0|sWEFsKmkH%2FTLajrFqRkRWKSdTeY%3D', 'domain': 'www.cnvd.org.cn', 'path': '/', 'name': '__jsl_clearance'}, {'value': '14dbf9b7ec3482ba76b140b2e2a8ae14', 'httpOnly': True, 'name': '__jsluid', 'secure': False}, {'secure': False, 'httpOnly': False, 'expiry': 1659704113, 'value': '1470401713484', 'domain': 'www.cnvd.org.cn', 'path': '/', 'name': 'bdshare_firstime'}]12345
如果你的IE浏览器页面的放大率不是100%,则会有如下错误:
selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Browser zoom level was set to 130%. It should be set to 100%
解决方法:点击浏览器右下角的“更改缩放级别”,改为100%
3.2 示例二:通过Firefox获取cookie
>>>from selenium import webdriver>>>firefox = webdriver.Firefox()>>>firefox.get("http://www.cnvd.org.cn")>>>firefox.get_cookies()[{'name': '__jsluid', 'expiry': None, 'httpOnly': True, 'secure': False, 'path': '/', 'domain': 'www.cnvd.org.cn', 'value': '6227ceeae8067fc9f47f832093b92067'}, {'name': '__jsl_clearance', 'expiry': None, 'httpOnly': False, 'secure': False, 'path': '/', 'domain': 'www.cnvd.org.cn', 'value': '1470453972.745|0|5w9OUDO2vOYMvowWI%2BF3xGBQlf0%3D'}, {'name': 'JSESSIONID', 'expiry': None, 'httpOnly': False, 'secure': False, 'path': '/', 'domain': 'www.cnvd.org.cn', 'value': '91EC775B4CF2D948FC74E126D9E17013'}, {'name': 'bdshare_firstime', 'expiry': None, 'httpOnly': False, 'secure': False, 'path': '/', 'domain': 'www.cnvd.org.cn', 'value': '1470453972212'}]12345
在cygwin中执行firefox = webdriver.Firefox(),会有错误:
selenium.common.exceptions.WebDriverException: Message: entity not found,
在windows环境执行中不会有问题。
3.3 示例三:python脚本
get_cookie.py
import timefrom selenium import webdriverfrom selenium.common.exceptions import WebDriverExceptiondef GetCookie():url = "http://www.cnvd.org.cn/flaw/list.htm"
cookies = [] try:
print('open IE browser')
ie = webdriver.Ie()
print('visit cnvd website')
ie.get(url)
timesleep = 8 #需要延时,来获取完整的cookies
print('sleep {} seconds'.format(timesleep))
time.sleep(timesleep) # important to get full cookies
except WebDriverException as wde:
print(wde) if ie != None:
ie.quit() else:
print('get cookies...')
cookies = ie.get_cookies()
ie.quit() if cookies == '' or type(cookies) != list or cookies.__len__() == 0:
print('cookie is not found') else:
print('cookies: {}, size: {}'.format(cookies, cookies.__len__()))
GetCookie()123456789101112131415161718192021222324252627282930
输出Log:
$ python3 get_cookie.pyopen IE browser
visit cnvd website
sleep 8 seconds
get cookies...cookies: [{'name': 'JSESSIONID', 'value': '288C44E9485D45D8CD6DCF5ECD45FE48', 'httpOnly': False, 'secure': False}, {'httpOnly': False, 'path': '/', 'name': '__jsl_clearance', 'domain': 'www.cnvd.org.cn', 'expiry': 1472317063, 'value': '1472313463.29|0|qhvo%2BKl%2BfNxrWIU82bwTrL%2BxISE%3D', 'secure': False}, {'name': '__jsluid', 'value': 'c44ca6d63264ac8b08e969cfb0390c3b', 'httpOnly': True, 'secure': False}, {'httpOnly': False, 'path': '/', 'name': 'bdshare_firstime', 'domain': 'www.cnvd.org.cn', 'expiry': 1661615471, 'value': '1472313071070', 'secure': False}], size: 4123456
可能出现的问题:
问题1:selenium.common.exceptions.NoSuchWindowException: Message: Unable to get browser
问题2:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones.
解决方法1:Internet选项->安全->“Internet”,“本地Intranet”,“受信任的站点”,“受限制的站点”的“启用保护模式”需要设置成一样的。都设置成选中状态,可以解决。或者试试都设置成非选中状态。
解决方法2:在上面的解决方法用过之后,在windows中可能还会有问题Unable to get browser,可以尝试着以管理员权限打开cmd,也许会有惊喜。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)