准备工作
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 , 这样就成功获取数据了