前言
爬虫方向的小伙伴们都知道网页爬虫常常遇到的问题就是登陆帐户,有些简单的网站咱们能够简单的send key来输入帐户密码就能够登陆,可是有不少网站须要验证码之类的就不太好用了,这时候就体现到了cookie登陆的优势了,前段时间网上搜了搜,发现没有什么完整的教程,本文就使用selenium来cookie登陆为例作一个简单的教程。python
环境准备
- python3
- selenium
- chromedriver
selenium就再也不过多解释了,咱们在使用的过程当中惟一须要注意的就是本身浏览器版本与driver版本的问题,至于具体对应版本,在chromedriver下载页面中会有显示web
代码编写
此次就以 百度 为例,www.baidu.com 首先使用 selenium 打开百度看一下未登陆是什么样子chrome
代码:json
from selenium import webdriver #填写webdriver的保存目录 driver = webdriver.Chrome('../chromedriver.exe') #记得写完整的url 包括http和https driver.get('https://www.baidu.com')
这就是直接打开的样子,咱们想要将网页变成登陆后的样子,以下图网页爬虫
这是登陆帐号后的样子,那么咱们该怎么获取cookie以达到登陆效果呢?浏览器
咱们能够直接使用F12查看当前网页的cookie,可是你会发现直接获取到的并非那么好插入到selenium中,由于cookie在浏览器中实际是这个样子的cookie
它须要额外添加一些东西,那么咱们该如何获取呢?其实也很简单,最简单的方法就是咱们首先使用selenium手动登陆一下而后获取cookie值保存到本地,以后再登录的时候直接调用本地cookie就能够了函数
怎么获取呢?selenium有一个 get_cookies() 函数能够帮咱们获取当前网页的cookie值,因此咱们首先编写一个 getcookies.py 文件来获取cookie值网站
from selenium import webdriver import time import json #填写webdriver的保存目录 driver = webdriver.Chrome('../chromedriver.exe') #记得写完整的url 包括http和https driver.get('https://www.baidu.com') #程序打开网页后20秒内手动登录帐户 time.sleep(20) with open('cookies.txt','w') as cookief: #将cookies保存为json格式 cookief.write(json.dumps(driver.get_cookies())) driver.close()
运行程序后以下图 点击登陆 输入帐号密码,输入验证码(程序内写的20秒完成操做,由于20秒后程序将得到cookies)url
如今发现项目目录下已经有了一个名称为 cookies.txt 的文件 ,如今咱们已经将cookies保存到了本地,如今咱们来编写程序使用cookies
编写 addcookies.py 文件
from selenium import webdriver import time import json #填写webdriver的保存目录 driver = webdriver.Chrome('../chromedriver.exe') #记得写完整的url 包括http和https driver.get('https://www.baidu.com') #首先清除因为浏览器打开已有的cookies driver.delete_all_cookies() with open('cookies.txt','r') as cookief: #使用json读取cookies 注意读取的是文件 因此用load而不是loads cookieslist = json.load(cookief) for cookie in cookieslist: driver.add_cookie(cookie)
运行,有小伙伴可能会发现如今出问题了,在插入cookie的时候 返回错误
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid 'expiry'
这个 expiry 是什么呢? 它是cookie的生命周期,也就是失效时间,为何在这里会报错呢?咱们有两种解决办法
- #方法1 将expiry类型变为int(其实不太清楚为何变为int就能够)
- #方法2删除该字段
从新编写代码:
from selenium import webdriver import json #填写webdriver的保存目录 driver = webdriver.Chrome('../chromedriver.exe') #记得写完整的url 包括http和https driver.get('https://www.baidu.com') #首先清除因为浏览器打开已有的cookies driver.delete_all_cookies() with open('cookies.txt','r') as cookief: #使用json读取cookies 注意读取的是文件 因此用load而不是loads cookieslist = json.load(cookief) # 方法1 将expiry类型变为int for cookie in cookieslist: #并非全部cookie都含有expiry 因此要用dict的get方法来获取 if isinstance(cookie.get('expiry'), float): cookie['expiry'] = int(cookie['expiry']) driver.add_cookie(cookie) #方法2删除该字段 # for cookie in cookieslist: # #该字段有问题因此删除就能够 浏览器打开后记得刷新页面 有的网页注入cookie后仍须要刷新一下 # if 'expiry' in cookie: # del cookie['expiry'] # driver.add_cookie(cookie)
这时候发现没有报错了,能够发现,怎么仍是登陆以前的页面啊?为何cookies插入成功了却不是登录后的页面?
别急,这时候咱们点击一下浏览器的刷新就会发现其实已经登陆上去了只不过页面没有变化而已,因此必定记得点刷新,如今咱们就成功的使用cookie完成了登陆操做。