青书学堂利用爬虫和selenium完成验证码登录获取cookie
本帖最后由 xhtdtk 于 2021-3-19 11:38 编辑先说点别的
目前各大院校的作业又开始了,虽然可以直接利用cookie进行请求,但很多人不知道cookie是什么在哪里,所以还是通过模拟登录来而获取cookie
这是我睡下午觉突然想的方法,这个方法没参考过别人的文章,但是那么简单肯定有很多人知道或者在别的地方发表过,各位知道我不是盗版就好
1、请求的url和登录表单数据
#请求的url:https://www.qingshuxuetang.com/Login?_t=1615993555750
#登录表单数据:
username: 1
password: 1
deviceInfoQS: {"netType":1,"appType":3,"clientType":3,"deviceName":"PCWeb","osVersion":"Win32","appVersion":"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3776.400 QQBrowser/10.6.4212.400","imei":"","mac":"","idfa":""}
type: 3
sessionId: 02415a85-a8e2-4324-bfe4-2f973efc2321
userInput: 1
ref:
2、分析
请求的url:_t为当前时间戳转换为毫秒
登录表单数据:
①username和password分别为账号、密码
②deviceInfoQS不知道是什么参数,可能与浏览器有关,无论登录成功与否都没有改变,是固定参数
③type与deviceInfoQS一样,不知道是什么参数,但也是固定参数
④sessionId不知道是什么参数,不是固定参数,但是可以从别的接口获取
⑤userInput用户需要输入的验证码,与sessionId在同一接口
⑥ref不知道是什么参数,一直是空值
3、根据分析,只要获取sessionId和userInput(验证码)就能完成登录
正常进入页面后在账号一行输入任意内容,便能获取一个POST的url:https://www.qingshuxuetang.com/Svc/GetValidationCode?_t=1615995065065
需要提交的表单数据都是固定参数,再查看reponse的内容,正是需要的sessionId和验证码图片的二进制流
搜索了一下如何用python将二进制流转换为图片,没有找到自己想要的,于是使用selenium来打开验证码图片,图片正常显示,用户就能根据图片输入验证码了
4、代码及获取cookie
import requests
import time
import datetime
from selenium import webdriver
from bs4 import BeautifulSoup
import re
#创建一个会话
s=requests.session()
#账号密码
username=input("输入账号:")
password=input("输入密码:")
#获取当前时间戳
t = time.time()
rnd = int(round(t * 1000)) #毫秒级时间戳
#获取session和图片验证
param={'_t': str(rnd)}
data_code={"recv": str(username),"validationType": 3}
rep_getcode=s.post('https://www.qingshuxuetang.com/Svc/GetValidationCode',params=param,json=data_code)
sessionId=rep_getcode.json()['data']['sessionId']
print(sessionId)
code='data:image/png;base64,'+rep_getcode.json()['data']['code']
driver=webdriver.Chrome()
driver.get(code)
userInput=input("输入验证码:")
data_login={
'username': str(username),
'password': str(password),
'deviceInfoQS': '{"netType":1,"appType":3,"clientType":3,"deviceName":"PCWeb","osVersion":"Win32","appVersion":"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3776.400 QQBrowser/10.6.4212.400","imei":"","mac":"","idfa":""}',
'type': '3',
'sessionId': str(sessionId),
'userInput': str(userInput),
'ref':''
}
rep_login=s.post('https://www.qingshuxuetang.com/Login?',params=param,data=data_login)
print(str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))+' 登录状态:'+rep_login.json()['message'])
num=0
for num_cookie in rep_login.cookies:
if num == 0:
cookie_1=re.findall('<Cookie (.*?) for',str(num_cookie))
if num == 1:
cookie_2=re.findall('<Cookie (.*?) for',str(num_cookie))
num = num + 1
cookie=cookie_1+'; '+cookie_2
print(cookie)
代码写的比较粗糙,不过思路介绍完了,你们一定能写出一个比我更好的,
为什么不用def进行封装,我比较懒,写出来能用就行,打扰大家欣赏代码的雅兴了
csylyx 发表于 2021-4-21 09:31
大佬,可以帮挂一下吗?
私信发给我一下吧 感谢楼主分享 懂了。赶紧去试试看。感谢分享。 刚好需要学习如何走验证码,感谢分享~ 谢谢分享,学习一下! 首先感谢楼主的分享,其次一起学习一起进步。。。。最后遵守版规 能详细介绍一下各参数是怎么找出来的吗? 小白一个,完全没懂。。。我还在挂学时呢 感觉不错,得好好学习下😌 感谢楼主分享,拿走了