Python爬虫之利用cookies跳过登陆验证码

48 篇文章 1 订阅
8 篇文章 0 订阅

在大数据时代,很多人会利用爬虫对网上一些数据进行采集,但有些网站为了反爬会出一些策略,在爬取某些网页时,登陆界面时经常遇到的一个坎,而现在大多数的网站在登陆时都会要求用户填写验证码,验证码的形式多种多样,例如静态图片、动态验证码、滑动、12306验证模式、甚至还用上短信验证码。虽然现在技术也可以解决图片识别,但万一网站改了验证方案,那么整套算法都有可能被推翻,很显然强行破解验证码是一个吃力不讨好的策略。可以利用python中的request模块进行的一个模拟登陆,其中用到了reqeust.session下的cookies来跳过登陆这一环节,本文的调试浏览器为chrome,不同浏览器可能有所差异,但逻辑是一样的。

获取请求头信息

在这里插入图片描述

提取出请求头数据
agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
headers = {
    "HOST": "xxx.com",
    "Referer": "http://xxx.com/Manager/Main.aspx",
    "User-Agent": agent
}

获取cookies

这一步比较重要,就是要人为成功登录一次以便于获取登录信息,F12然后依次F12>Application>Cookies找到成功登陆后的cookie数据。

在这里插入图片描述

图中打码是处于个人隐私,所以临时抹去,接着就是把其中的Name,Value值复制出来并以字典的形式存放在变量里。

cookies = {
	'xxx_cookie_time':'2020-04-28+10%3a59%3a19',
	'xxx_cookie_language': 'zh_CN',
	'ASP.NET_SessionId': 'v0vszqppwpxxxxxxxx',
	'ValidCode':'OicQ%2bxxxx',
	'xxx_session_id':'FUl0%2b4kCmyEyxxxxxxxxxx',
	'_ati':'1733720xxxx'
}

创建session并实现页面登录

然后创建一个session对象,将headers和cookies赋给session

import requests
session = requests.session()
session.headers = headers
requests.utils.add_dict_to_cookiejar(session.cookies, cookies)

其中,值得注意的是,session.headers可以是dict,所以直接赋值没问题,而session.cookies必须是<class ‘requests.cookies.RequestsCookieJar’>,所以要利用requests.utils.add_dict_to_cookiejar进行赋值。现在相当于我们已经有了登录的实时会话了,就可以正常访问该网站的任意网页了。

url='http://xxx.com/Order/CodeByOrder.aspx?OrderCode=xxxxxx'
response = session.get(url)
>>> response
<Response [200]>

现在我们就可以成功获取页面源码,再则就可以对自己需要的数据进行解析提取了。

如果想发送方GET/POST请求,那么就可以把已有的cookie缓存下来,然后再以参数传回requests中即可实现那些需要登录才可以发送请求的操作:

cookies_dict = requests.utils.add_dict_to_cookiejar(session.cookies, cookies)
resget = requests.get(url, headers = headers, cookies = cookies_dict) # GET
respost = requests.post(url, headers = headers, cookies = cookies_dict) # POST
print(resget.text)
print(respost.text)

注:使用cookies模拟登录的方法,人为登录一次的cookies一旦失效,就又得再次登录获取cookies。

完整代码

import requests

agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
headers = {
    "HOST": "xxx.com",
    "Referer": "http://xxx.com/Manager/Main.aspx",
    "User-Agent": agent
}

cookies = {
	'xxx_cookie_time':'2020-04-28xxxx',
	'xxx_cookie_language': 'zh_CN',
	'ASP.NET_SessionId': 'v0vszqppwpxxxxx',
	'ValidCode':'OicQ%2b2xxxx',
	'xxx_session_id':'FUl0%2b4kCmyEyxxxxxxxxxx',
	'_ati':'1733720xxxx'
}
session = requests.session()
session.headers = headers
requests.utils.add_dict_to_cookiejar(session.cookies, cookies)
url='http://xxx.com/Order/CodeByOrder.aspx?OrderCode=xxxxxx'
response = session.get(url)
>>> response
<Response [200]>
注:使用cookies模拟登录的方法,默认cookies失效时间是直到关闭浏览器,我们经常会遇到如果关闭浏览器,再次打开需要登录的网页有需要再次登录,这就是由于浏览器关闭,临时会话session结束,导致临时存放在内存里的cookie被释放掉,所以需要再次输入密码重新登录,重新生成会话、cookie等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值