基于 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 , 这样就成功获取数据了

相关推荐
通往曙光的路上29 分钟前
day19_添加修改删除
okhttp
android_cai_niao6 小时前
OkHttp连接复用
okhttp·tcp连接·连接缓存池·复用连接
菠萝+冰1 天前
Promise 详解
okhttp
疏狂难除3 天前
spiderdemo第四题
爬虫·okhttp·webassembly
Elieal4 天前
AJAX 知识
前端·ajax·okhttp
咖啡の猫7 天前
Vue 实例生命周期
前端·vue.js·okhttp
Jeled10 天前
Retrofit 与 OkHttp 全面解析与实战使用(含封装示例)
android·okhttp·android studio·retrofit
Jeled11 天前
Android 网络层最佳实践:Retrofit + OkHttp 封装与实战
android·okhttp·kotlin·android studio·retrofit
allk5514 天前
OkHttp源码解析(一)
android·okhttp
allk5514 天前
OkHttp源码解析(二)
android·okhttp