河南创达建设工程管理有限公司网站网站建设公司优惠中
2026/4/9 15:32:25 网站建设 项目流程
河南创达建设工程管理有限公司网站,网站建设公司优惠中,软件外包公司介绍,平面设计好的网站目录Python 爬虫实战#xff1a;如何优雅地处理带有 JWT 认证的接口提交第一章#xff1a;当爬虫遇上“隐形门卫”——JWT 认证机制解析1.1 什么是 JWT#xff1f;1.2 为什么爬虫需要特别关注 JWT#xff1f;1.3 JWT 的“双刃剑”对爬虫的影响第二章#xff1a;Python 实战…目录Python 爬虫实战如何优雅地处理带有 JWT 认证的接口提交第一章当爬虫遇上“隐形门卫”——JWT 认证机制解析1.1 什么是 JWT1.2 为什么爬虫需要特别关注 JWT1.3 JWT 的“双刃剑”对爬虫的影响第二章Python 实战模拟登录与 Token 获取2.1 准备工作分析目标 API2.2 编写获取 Token 的 Python 代码2.3 常见登录陷阱与应对第三章带着“通行证”出发在请求中注入 JWT3.1 构造带认证的 Header3.2 封装为通用爬虫类Class第四章进阶技巧与安全防御视角4.1 应对高级防御Token 存储与刷新4.2 从防御者角度看 JWT 爬虫4.3 总结专栏导读 欢迎来到Python办公自动化专栏—Python处理办公问题解放您的双手️‍ 个人博客主页请点击—— 个人的博客主页 求收藏️‍ Github主页请点击—— Github主页 求Star⭐️‍ 知乎主页请点击—— 知乎主页 求关注️‍ CSDN博客主页请点击—— CSDN的博客主页 求关注 该系列文章专栏请点击——Python办公自动化专栏 求订阅 此外还有爬虫专栏请点击——Python爬虫基础专栏 求订阅 此外还有python基础专栏请点击——Python基础学习专栏 求订阅文章作者技术和水平有限如果文中出现错误希望大家能指正❤️ 欢迎各位佬关注 ❤️Python 爬虫实战如何优雅地处理带有 JWT 认证的接口提交第一章当爬虫遇上“隐形门卫”——JWT 认证机制解析在传统的网页爬虫开发中我们习惯于直接请求目标 URL解析 HTML提取数据。然而随着现代 Web 应用架构的演进前后端分离SPA已成为主流。这意味着数据不再是直接嵌入在 HTML 中而是通过 API 接口以 JSON 格式交互。为了保护这些接口的安全开发者往往会设置一道“门卫”——JWT (JSON Web Token)。对于爬虫工程师而言理解 JWT 的工作原理是绕过这道门卫的关键。点击 投票 获取Python办公自动化高清书籍点击 投票 获取Python办公自动化高清书籍点击 投票 获取Python办公自动化高清书籍(Excel Python飞速搞定数据分析与处理 (【瑞士】费利克斯·朱姆斯坦) )1.1 什么是 JWTJWT 是一种开放标准RFC 7519用于在网络应用环境间传递声明。它将用户信息加密成一个 Token通常由三部分组成Header头部包含令牌类型和签名算法如 HMAC SHA256 或 RSA。Payload负载包含用户身份信息如用户ID、过期时间。Signature签名这是安全性的核心。服务器使用 Header 和 Payload配合只有服务器知道的密钥Secret进行签名。1.2 为什么爬虫需要特别关注 JWT在传统的 Session/Cookie 机制中服务器会在客户端保留一个 Session ID爬虫只需保持 Cookie 即可。但在 JWT 模式下服务器是无状态的。客户端浏览器在登录成功后会收到一个长字符串Token之后的每一次请求都必须在 HTTP Header 中携带这个 Token通常是Authorization: Bearer token。如果我们的爬虫忽略了这个机制直接去请求需要登录的接口服务器会直接返回401 Unauthorized就像被门卫直接拦在门外一样。1.3 JWT 的“双刃剑”对爬虫的影响优势Token 可以跨域使用且不需要服务器查询数据库验证 Session速度极快。挑战Token 有过期时间exp一旦过期必须重新获取。此外为了安全很多应用会使用 Refresh Token 机制或者对 Token 进行加密处理JWE这大大增加了爬虫模拟的复杂度。第二章Python 实战模拟登录与 Token 获取在掌握了理论基础后我们需要动手操作。本章节将使用 Python 的requests库演示如何从零开始获取一个 JWT Token。2.1 准备工作分析目标 API假设我们要爬取一个名为 “DataHub” 的虚构平台数据。首先我们需要打开浏览器的开发者工具F12切换到 Network 面板进行一次真实的登录操作。观察结果请求 URLhttps://api.datahub.com/v1/auth/login请求方法POST请求体Payload{username: your_user, password: your_password}2.2 编写获取 Token 的 Python 代码利用requests库我们可以轻松模拟这个过程。importrequests# 1. 定义登录接口和凭证login_urlhttps://api.datahub.com/v1/auth/loginheaders{Content-Type:application/json,User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36}payload{username:your_username,password:your_password}# 2. 发送登录请求try:responserequests.post(login_url,jsonpayload,headersheaders)# 检查响应状态ifresponse.status_code200:# 3. 解析响应数据dataresponse.json()# 假设服务器返回的数据结构如下# {code: 0, msg: success, data: {access_token: eyJhbGciOiJIUz..., refresh_token: ...}}access_tokendata.get(data,{}).get(access_token)ifaccess_token:print(f成功获取 Token:{access_token[:20]}...)else:print(响应中未找到 access_token 字段)else:print(f登录失败状态码:{response.status_code}, 原因:{response.text})exceptExceptionase:print(f发生错误:{e})2.3 常见登录陷阱与应对验证码Captcha如果登录接口带有图形验证码简单的requests就失效了。此时你需要引入 OCR 库如ddddocr或者接入打码平台。CSRF Token部分老式网站在登录时会要求携带一个隐藏的 CSRF Token。你需要先请求一次登录页解析 HTML 获取该 Token再发起登录。加密参数现在的前端为了安全往往会将密码进行 JS 加密如 RSA 或 AES。你需要使用 Python 的pycryptodome库复现该加密逻辑或者直接使用PyExecJS执行原生 JS 代码。第三章带着“通行证”出发在请求中注入 JWT拿到 Token 后万里长征走完了一半。现在我们需要将这个 Token 应用到后续的数据提交和获取请求中。3.1 构造带认证的 Header这是最关键的一步。绝大多数 API 规范要求将 Token 放入 HTTP Header 的Authorization字段中格式通常为Bearer token。importrequests# 假设我们已经获取到了 tokenaccess_tokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...# 1. 构造请求头headers{Authorization:fBearer{access_token},Content-Type:application/json,Accept:application/json}# 2. 访问需要认证的接口例如提交数据或获取用户信息target_urlhttps://api.datahub.com/v1/user/profile# 或者是一个 POST 提交接口# target_url https://api.datahub.com/v1/data/submittry:# 发起 GET 请求获取数据resprequests.get(target_url,headersheaders)ifresp.status_code200:print(数据获取成功:,resp.json())elifresp.status_code401:print(错误Token 失效或未提供请重新登录)elifresp.status_code403:print(错误Token 有效但权限不足Scope 不够)else:print(f未知错误:{resp.status_code})exceptExceptionase:print(f请求异常:{e})3.2 封装为通用爬虫类Class为了代码的复用性和可维护性建议将 Token 管理封装成一个类classJWTCrawler:def__init__(self,username,password):self.usernameusername self.passwordpassword self.base_urlhttps://api.datahub.comself.tokenNoneself.sessionrequests.Session()# 使用 Session 保持连接deflogin(self):登录并获取 Tokenurlf{self.base_url}/v1/auth/loginpayload{username:self.username,password:self.password}try:respself.session.post(url,jsonpayload)self.tokenresp.json().get(data,{}).get(access_token)returnTrueifself.tokenelseFalseexceptExceptionase:print(f登录失败:{e})returnFalsedefrequest(self,method,endpoint,**kwargs):通用请求方法自动注入 Tokenifnotself.token:ifnotself.login():raiseException(无法获取有效 Token)urlf{self.base_url}{endpoint}headerskwargs.get(headers,{})headers[Authorization]fBearer{self.token}kwargs[headers]headers responseself.session.request(method,url,**kwargs)# 处理 Token 过期的情况通常状态码为 401ifresponse.status_code401:print(Token 已过期尝试重新登录...)ifself.login():# 重新发起请求headers[Authorization]fBearer{self.token}kwargs[headers]headers responseself.session.request(method,url,**kwargs)else:raiseException(刷新 Token 失败)returnresponse# 使用示例# crawler JWTCrawler(user, pass)# resp crawler.request(GET, /v1/data/list)# print(resp.json())第四章进阶技巧与安全防御视角作为一名资深的爬虫开发者不仅要学会攻还要懂防。了解 JWT 的弱点能帮助我们应对更复杂的反爬机制了解防御策略则能帮助我们开发更健壮的应用。4.1 应对高级防御Token 存储与刷新Refresh Token 机制为了安全很多应用不会给 Access Token 很长的过期时间如 15 分钟。此时服务器会同时返回一个 Refresh Token有效期 7 天。当 Access Token 过期时客户端应使用 Refresh Token 去请求/refresh接口换取新的 Access Token。爬虫应对在JWTCrawler类中增加refresh_token字段并在request方法捕获 401 错误后优先尝试调用刷新接口而不是直接重新登录避免频繁触发登录风控。HttpOnly Cookie有些应用虽然使用了 JWT但为了防止 XSS 攻击会将 Token 存储在HttpOnly的 Cookie 中而不是 JS 可读的localStorage。这种情况下requests直接读取 JS 变量是行不通的。爬虫应对使用Selenium或Playwright等浏览器自动化工具。先用浏览器自动化工具完成登录然后通过get_cookies()提取 Token再转交给requests使用。4.2 从防御者角度看 JWT 爬虫如果你是 API 的开发者该如何防止他人通过模拟 JWT 爬取数据签名算法选择严禁使用None算法。推荐使用HS256对称或RS256非对称。如果密钥泄露攻击者可以伪造任何用户的 Token。增加黑名单机制JWT 的特性是“一旦签发无法撤回”。为了解决这个问题可以在 Redis 中维护一个 Token 黑名单用户注销或修改密码时将旧 Token 加入黑名单。IP 与 User-Agent 绑定在 Payload 中加入 IP 或设备指纹信息并在验证时检查。如果一个 Token 突然在不同的 IP 下使用判定为异常。动态 Token混淆 Token像 WeChat 这样的应用会使用动态 Token每次请求后 Token 都会变化或者使用加密的二进制格式大大增加了逆向难度。4.3 总结处理带有 JWT 认证的 Python 爬虫核心在于模拟“客户端行为”。这不仅仅是发送 HTTP 请求更是一个对认证流程的逆向工程。初级阶段手动抓包硬编码 Token。中级阶段编写登录脚本自动获取并管理 Token。高级阶段处理 Token 过期刷新、应对加密参数、结合浏览器自动化工具解决复杂渲染问题。随着反爬技术的升级单纯的 HTTP 请求越来越难以满足需求将requests的高效与playwright的渲染能力相结合是未来爬虫开发的必然趋势。互动环节你在爬取带有 JWT 认证的网站时遇到过最棘手的问题是什么是复杂的加密参数还是动态变化的 Token欢迎在评论区分享你的经历我们一起探讨解决方案结尾希望对初学者有帮助致力于办公自动化的小小程序员一枚希望能得到大家的【❤️一个免费关注❤️】感谢求个 关注 ❤️ 喜欢 ❤️ 收藏 此外还有办公自动化专栏欢迎大家订阅Python办公自动化专栏此外还有爬虫专栏欢迎大家订阅Python爬虫基础专栏此外还有Python基础专栏欢迎大家订阅Python基础学习专栏

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询