写爬虫的时候免不了操作Cookies,使用Selenium可以很方便的读取浏览器已有Cookies,管理Cookies也很方便。
1.selenium读取浏览器已有Cookies
浏览器已有Cookies有一个好处是我们的真实行为,里面保存的数据都是我们经常使用的账号数据,这在抓取网站时有较大好处,因为对这些老账号,真实Cookies,被爬网站会对你的抓取行为宽松一些。
比如你在浏览器登陆和访问过微博的话,使用selenium读取操作老cookies,访问微博的话,你就不需要再登陆啦。
如何操作老Cookie呢?使用add_argument()方法,看代码演示。拿Chrome浏览器举例,代码在Python 3.6里测试通过。
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir=C:\\Users\\HN\\AppData\\Local\\Google\\Chrome\\User Data")
options.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
driver = webdriver.Chrome(executable_path="C:/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关闭才行。
2.selenium保存cookies
上面介绍了如何读取老cookies并免登陆访问网站,还有一种情况有些网站对单个账号有访问频率限制,所以你准备了多个账号,想要每隔一段时间换一个账号来访问网站。
这样如果让浏览器自己来保存Cookies的话,会把你之前的账户Cookie覆盖一部分,会导致之前的账号访问网站时要求你输入账号密码登陆。
这种情况就要来管理Cookies,让每个账号都保存在不同文件里,这个过程要借助pickle库来序列化数据(把格式数据存入文件和加载到内存)。看下面实例:
#coding=utf-8
from selenium import webdriver
import pickle
import time
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
driver.maximize_window()
driver.get('https://www.douban.com')
time.sleep(60)
cookies = driver.get_cookies()
with open('D:/test_cookies/db_cookie_1','wb') as f:
pickle.dump(cookies,f)
print ('done')
上面示例演示通过selenium打开豆瓣网,你要在豆瓣网上输入账号密码点击登录,程序会把登录成功后的豆瓣网cookie保存到指定文件夹下面。保存cookies到文件是用pickle库的dump方法来完成的,它可以帮助你序列化数据,很方便。
上面睡眠60秒是给你足够时间输入账号密码。
接下来的程序就来调用我们刚才保存的cookies来登录豆瓣。
#coding=utf-8
from selenium import webdriver
import pickle
import time
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe")
#不带cookies访问豆瓣
driver.get('https://www.douban.com')
#删掉cookies
driver.delete_all_cookies()
with open('D:/test_cookies/db_cookie_1','rb') as f:
cookies = pickle.load(f)
for cookie in cookies:
driver.add_cookie(cookie)
print(cookie)
#带我们保存的cookie访问豆瓣
driver.get('https://www.douban.com')
print('done')
是不是能够自动登陆豆瓣了?
这里面还是用到pickle库的load()方法来载入cookie,使用add_cookie()方法来把保存的cookie加入到浏览器里。
注意上面的流程,先是不带cookie访问网站,然后把网站的cookies删掉,把保存的cookie加入到浏览器中,再重新访问网站,这样就能带我们自己的cookie访问了。
不安上面的流程,直接带我们的cookies访问网站,可能会失败。
上面的两个程序示例,就实现了把cookies按单个账户来保存到我们指定的文件夹中,不同的账户,你只需要按不同的账户名来保存文件就,这样方便管理。 以后就可以实现切换不用的账户来访问网站。
3.Selenium操作cookies总结
回顾一下,添加cookie的方法是add_cookie(),一般一个网站会有多个cookie,所以需要按上面的方法循环把cookie都加入。
另外删除cookies的方法是delete_all_cookies()
还有使用Selenium操作浏览器,如果你退出程序时不保存cookies,那cookies是不会被保存到文件的。

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。
***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.con 原创,没有猿人学授权,请勿以任何形式转载。***
说点什么吧...