Python Selenium操作Cookies|读取Cookies,保存cookies,报错“invalid argument: invalid 'expiry”

发表时间:2019-12-13

1.selenium读取浏览器已有Cookies

浏览器已有Cookies有一个好处是我们的真实行为,里面保存的数据都是我们经常使用的账号数据,这在抓取网站时有较大好处,因为对这些老账号,真实Cookies,被爬网站会对你的抓取行为宽松一些。

比如你在浏览器登陆和访问过微博的话,使用selenium读取操作老cookies,访问微博的话,你就不需要再登陆啦。

如何操作老Cookie呢?使用add_argument()方法,看代码演示。拿Chrome浏览器举例,代码在Python 3.7里测试通过。

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("user-data-dir=C:\\Users\\41780\\AppData\\Local\\Google\\Chrome\\User Data")

options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])

driver = webdriver.Chrome(executable_path="D:/chromedriver/chromedriver.exe",options=options)

driver.maximize_window()

driver.get('https://www.weibo.com')

print(driver.get_cookies())

Snipaste_2019-12-13_10-04-42.png

add_argument()方法里填你Chrome浏览器保存Cookies的路径。

add_experimental_option()方法是访问https的网站,Selenium可能会报错,使用这个方法可以忽略报错。

get_cookies()方法可以得到当前访问网站的Cookies。

上述例子就可以使用浏览器已有Cookies了,并且你后续使用Selenium的访问操作网站记录也会保存在这个Cookies理。

PS:电脑内存不够或已经打开了Chrome,再用Selenium打开一个Chrome时,可能会报:unable to move cache folder ShaderCache/GPUCache错误。

这时要把之前的Chrome关闭才行。

2.selenium保存cookies

上面介绍了如何读取老cookies并免登陆访问网站,还有一种情况有些网站对单个账号有访问频率限制,所以你准备了多个账号,想要每隔一段时间换一个账号来访问网站。

这样如果让浏览器自己来保存Cookies的话,会把你之前的账户Cookie覆盖一部分,会导致之前的账号访问网站时要求你输入账号密码登陆。

这种情况就要来管理Cookies,让每个账号都保存在不同文件里,这个过程要借助pickle库来序列化数据(把格式数据存入文件和加载到内存)。看下面实例:

#coding=utf-8
from selenium import webdriver
import json
import time

driver = webdriver.Chrome(executable_path="D:/chromedriver/chromedriver.exe")
driver.get('https://www.douban.com')

time.sleep(30)

cookies = driver.get_cookies()
with open(r"D:/test_cookies/cookie.txt", 'w') as file1:
for cookie in cookies:
file1.write(json.dumps(cookie) + "\n")

print ('done')

上面示例演示通过selenium打开豆瓣网,你要在豆瓣网上输入账号密码点击登录,程序会把登录成功后的豆瓣网cookie保存到指定文件夹下面。

上面睡眠30秒是给你足够时间输入账号密码。

接下来的程序就来调用我们刚才保存的cookies来登录豆瓣。

#coding=utf-8
from selenium import webdriver
import json
import time

driver = webdriver.Chrome(executable_path="D:/chromedriver/chromedriver.exe")
#不带cookies访问豆瓣
driver.get('https://www.douban.com')
#删掉cookies
driver.delete_all_cookies()

with open(r"D:/test_cookies/cookie.txt", 'r') as file2:
res = file2.readlines()
for line in res:
# print(line)
cookie = json.loads(line)
# print(cookie)
if "expiry" in cookie:
del cookie["expiry"]
driver.add_cookie(cookie)


print(cookie)

#带我们保存的cookie访问豆瓣
driver.get('https://www.douban.com')

print('done')

Snipaste_2019-12-13_11-14-07.png

是不是能够自动登陆豆瓣了?这里大家注意一个细节——要删除expiry这个字段,否则会报错“invalid argument: invalid 'expiry”,这个错误是由于expiry格式不符合要求引起的。解决办法就是删除expiry这个字段

注意上面的流程,先是不带cookie访问网站,然后把网站的cookies删掉,把保存的cookie加入到浏览器中,再重新访问网站,直接带我们的cookies访问网站,可能会失败。

上面的两个程序示例,就实现了把cookies按单个账户来保存到我们指定的文件夹中,不同的账户,你只需要按不同的账户名来保存文件就,这样方便管理。 以后就可以实现切换不用的账户来访问网站。

3.Selenium操作cookies总结

回顾一下,添加cookie的方法是add_cookie(),一般一个网站会有多个cookie,所以需要按上面的方法循环把cookie都加入。

另外删除cookies的方法是delete_all_cookies()

还有使用Selenium操作浏览器,如果你退出程序时不保存cookies,那cookies是不会被保存到文件的。

文章来源互联网,尊重作者原创,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890


Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free