xhtdtk 发表于 2021-3-17 23:59

青书学堂利用爬虫和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进行封装,我比较懒,写出来能用就行,打扰大家欣赏代码的雅兴了


xhtdtk 发表于 2021-4-21 13:25

csylyx 发表于 2021-4-21 09:31
大佬,可以帮挂一下吗?

私信发给我一下吧

linyii 发表于 2021-3-18 09:18

感谢楼主分享

雾都孤尔 发表于 2021-3-18 00:12

懂了。赶紧去试试看。感谢分享。

xxxt 发表于 2021-3-18 00:29

刚好需要学习如何走验证码,感谢分享~

richens 发表于 2021-3-18 06:38

谢谢分享,学习一下!

wylksy 发表于 2021-3-18 07:41

首先感谢楼主的分享,其次一起学习一起进步。。。。最后遵守版规

lvcaolhx 发表于 2021-3-18 08:20

能详细介绍一下各参数是怎么找出来的吗?

dingding8208 发表于 2021-3-18 08:29

小白一个,完全没懂。。。我还在挂学时呢

Christia 发表于 2021-3-18 09:24

感觉不错,得好好学习下&#128524;

key_user 发表于 2021-3-18 09:34

感谢楼主分享,拿走了
页: [1] 2 3 4
查看完整版本: 青书学堂利用爬虫和selenium完成验证码登录获取cookie