Python爬虫之登录请求

登录流程

实战网址

分析思路

  • 如何快速找到登录请求?
  • 登录请求是静态还是动态?

登录时的图形验证码

图形验证逻辑(实战笔趣阁)

  • random->限定长度随机生成字符串->基于字符串生成图片->ip跟cookie与字符串构成映射关系保存在redis/sql ->发送到前端
  • 前端输入验证码 ==》发送到服务器
  • 服务器判断客户端验证码输入与存在数据库里面的字符串是否相等 ===》可以通过ip取搜索响应
    获取图片
实战笔趣阁
在img面板中找到图形验证码的请求

image-20230119200834688

image-20230120215107595

观察图片中带有响应动态Cookie

Python模拟发送请求获取图形验证码
import os
import requests
url_img = "https://www.bbiquge.cc/checkcode.php"
vary_res = requests.get(url=url_img)
vary_res
dir_path = os.path.dirname(__file__)#获取当前python脚本文件的文件夹目录
with open(dir_path+'/vary.png',mode="wb") as f:
    f.write(vary_res.content)
开始登录请求
  1. 找到请求包:

image-20230119203359511

  1. 构造原有表单数据:

image-20230119204203946

  1. 在Fiddler的辅助下构造headers

image-20230120215441759

仅带有PHPSESSID便可以成功构造请求

登录请求代码:
import os
import requests
url_img = "https://www.bbiquge.cc/checkcode.php"
vary_res = requests.get(url=url_img)
vary_res
dir_path = os.path.dirname(__file__)#获取当前python脚本文件的文件夹目录
with open(dir_path+'/vary.png',mode="wb") as f:
    f.write(vary_res.content)
login_url = "https://www.bbiquge.cc/login.php?do=submit"
headers = {
    
    
    "content-type": "application/x-www-form-urlencoded",
    "cookie": "PHPSESSID=" + vary_res.cookies.get("PHPSESSID")#拿到当前图形验证码对应的cookie
}
checkcode = input("请输入图形验证码:")
data = f"username=jiuwen567&password=test567&checkcode={
      
      checkcode}&usecookie=2592000&action=login&submit=%26%23160%3B%B5%C7%26%23160%3B%26%23160%3B%C2%BC%26%23160%3B"
login_res = requests.post(url=login_url,headers=headers,data=data)
login_res

检验登录请求是否成功:

image-20230120220641813

找不到登录请求的包的情况(实战Minlo)

​ “username”: “minioadmin”,

​ “password”: “minioadmin”

image-20230120221321287

如上图登录时很难找到登录请求包,故请出神器Fidder

image-20230120222517048

如上图用Fidder精准找到登录请求包

image-20230121180002091

  • 当请求的报文类型设置为json形式的时候,提交报文的类型必须是序列化后的json字符串

  • 如果客户端没有序列化json报文以及服务器也没有做序列化请求报文的的逻辑,那么后端就无法正常获取请求的报文

  • 如果不序列化则会出现错误如下图

    image-20230121181946780

    json序列化后:

    image-20230121182206785

    代码展示:

    import json
    import requests
    url = "https://portal-minio.zisu.edu.cn/minio/webrpc"
    headers = {
          
          
        "Content-Type": "application/json",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.55"
    }
    data = {
          
          "id":1,"jsonrpc":"2.0","params":{
          
          "username":"minioadmin","password":"minioadmin"},"method":"Web.Login"}
    res = requests.post(url=url,data=json.dumps(data),headers=headers)
    res
    

猜你喜欢

转载自blog.csdn.net/jiuwencj/article/details/128747130
今日推荐