浏览器已有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())
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关闭才行。
上面介绍了如何读取老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')
是不是能够自动登陆豆瓣了?这里大家注意一个细节——要删除expiry这个字段,否则会报错“invalid argument: invalid 'expiry”,这个错误是由于expiry格式不符合要求引起的。解决办法就是删除expiry这个字段
注意上面的流程,先是不带cookie访问网站,然后把网站的cookies删掉,把保存的cookie加入到浏览器中,再重新访问网站,直接带我们的cookies访问网站,可能会失败。
上面的两个程序示例,就实现了把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