Python爬虫之登录请求

文章目录

  • 登录流程
    • 实战网址
    • 分析思路
    • 登录时的图形验证码
      • 图形验证逻辑(实战笔趣阁)
        • 实战笔趣阁
          • 在img面板中找到图形验证码的请求
          • Python模拟发送请求获取图形验证码
          • 开始登录请求
          • 登录请求代码:
    • 找不到登录请求的包的情况(实战Minlo)

登录流程

实战网址

  • 笔趣阁-免费小说阅读网 (bbiquge.cc)
  • MinIO Browser (zisu.edu.cn)

分析思路

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

登录时的图形验证码

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

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

Python爬虫之登录请求_第1张图片

Python爬虫之登录请求_第2张图片

观察图片中带有响应动态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. 找到请求包:

Python爬虫之登录请求_第3张图片

  1. 构造原有表单数据:

Python爬虫之登录请求_第4张图片

  1. 在Fiddler的辅助下构造headers

Python爬虫之登录请求_第5张图片

仅带有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

检验登录请求是否成功:

Python爬虫之登录请求_第6张图片

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

​ “username”: “minioadmin”,

​ “password”: “minioadmin”

Python爬虫之登录请求_第7张图片

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

Python爬虫之登录请求_第8张图片

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

Python爬虫之登录请求_第9张图片

Python爬虫之登录请求_第10张图片

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

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

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

    Python爬虫之登录请求_第11张图片

    json序列化后:

    Python爬虫之登录请求_第12张图片

    代码展示:

    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
    

你可能感兴趣的:(Python,python,爬虫,开发语言)