基于 JWT 的模拟登录爬取实战

准备工作

  1. 了解 JWT 相关知识

  2. 安装 requests 库,并了解其基本使用

案例介绍

爬取网站: https://login3.scrape.center/

用户名和密码是: admin

模拟登录

基于 JWT 的网站通常采用的是前后端分离式, 前后端的数据传输依赖于 Ajax , 登录验证依赖于 JWT 这个本事就是 token 的值, 如果 JWT 经验证是有效的, 服务器就会返回相应的数据。

打开开发者工具,执行登录操作,,查看登录过程产生的数据

可以看出,登录时的请求 URL 为https://login3.scrape.center/api/login ,是通过 Ajax 请求的, 请求体式 JSON 格式的数据, 而不是表单数据, 返回状态码为 200

来看一下 token 字段

token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzIyOTYwOTk4LCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNzIyOTE3Nzk4fQ.qkSWgwMI_0MJs7U5y1bAaUyQW17O09i_f5s7E0C1GVc"

由 . (点) 把整个字段分为 3 部分,Header , Payload 和 Signature, 具体介绍在上一节

写文章-CSDN创作中心

而在后续发出用于获取数据的 Ajax 请求中, 请求头里多了一个 authorization 字段, 其内容为 jwt 加上刚才的 token 字段, 返回结果也是 JSON 格式的数据,其内容也是网站首页内容,那么现在模拟登录的思路也就有了

  1. 模拟登录请求,带上必要的信息, 获取返回的JWT

  2. 之后发送请求时, 在请求头里面加上 authorization 字段, 值就是 JWT 对应的内容

复制代码
import requests
from urllib.parse import urljoin

BASE_URL = 'https://login3.scrape.center/'
LOGIN_URL = urljoin(BASE_URL, '/api/login')
INDEX_URL = urljoin(BASE_URL, '/api/book')
USERNAME = 'admin'
PASSWORD = 'admin'

response_login = requests.post(LOGIN_URL, json={
    'username': USERNAME,
    'password': PASSWORD
})

data = response_login.json()
print('Response JSON', data)
jwt = data.get('token')
print('JWT', jwt)

headers = {'Authorization': f'jwt {jwt}'}
response_index = requests.get(INDEX_URL, params={
    'limit': '18',
    'offset': 0,
}, headers=headers)
print('Response Index', response_index.status_code)
print('Response URL', response_index.url)
print('Response Data', response_index.json())

Response JSON {'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzIyOTcyMjg2LCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNzIyOTI5MDg2fQ.ac63vnW9JF7U6DoZgIJd0dmqLc9FchrI_GbjDWjLZas'}

JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzIyOTcyMjg2LCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNzIyOTI5MDg2fQ.ac63vnW9JF7U6DoZgIJd0dmqLc9FchrI_GbjDWjLZas

Response Index 200

Response URL https://login3.scrape.center/api/book/?limit=18\&offset=0

Response Data {'count': 9200, 'results': [{'id': '34473697', 'name': 'R数据科学实战:工具详解与案例分析

这里我们先定义了登录接口和获取数据的接口,分别是 LOGIN_URL 和 INDEX_URL, 接着调用 requests 的 post 方法进行了模拟登录。 由于这了提交的数据是 JSON 格式, 所以使用 json 参数来传递数据。接着获取并打印出了返回结果中包含的 JWT 。 之后构造请求头, 设置 Authorization 字段并传入刚获取的 JWT , 这样就成功获取数据了

相关推荐
CYY953 天前
OkHttp 和 Retrofit 封装使用
okhttp·retrofit
CYY954 天前
OkHttp 的使用
okhttp
朝星15 天前
Android开发[14]:网络优化之OkHttp
android·okhttp·kotlin
之歆17 天前
Promise 基础技术深度解析:从回调地狱到链式调用
前端·okhttp·promise
之歆17 天前
Ajax 基础技术深度解析:XHR 从入门到跨域
前端·ajax·okhttp
YHHLAI18 天前
Ajax — 异步数据交互
ajax·okhttp·交互
Xaire1 个月前
行行查案例-数据解密-国密s4-webpack打包模块补齐
okhttp
霸道流氓气质1 个月前
Spring AI Ollama 连接超时问题排查与解决:OkHttp 读超时配置全指南
人工智能·spring·okhttp
你觉得脆皮鸡好吃吗1 个月前
XSS渗透 COOKIE
网络·http·okhttp·网络安全学习
彭于晏Yan1 个月前
OkHttp 与 RestTemplate 技术选型对比
java·spring boot·后端·okhttp