基于JWT模拟登录爬取案例

案例URL:https://login3.scrape.center/

用户名:admin    密码:admin

首次访问网址,会跳转到登录界面,打开 开发者工具,点击Network,刷新页面,输入用户名和密码,点击登录,查看第二个login请求。此处的URL变更为:https://login3.scrape.center/api/login,Payload中返回username和password,Preview返回了token的值。

登录成功后跳转到URL对应的网页,点击 ?limit=18&offset=0 ,页面内容URL:https://login3.scrape.center/api/book/?limit=18&offset=0,根据Response Headers中的Content-Type分析,服务器返回的数据格式为json类型点击Preview,展开results ,查看页面数据

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

Request Headers中出现了一个Authorization字段,其键值也是token

步骤

1.模拟登录请求,保存返回的JWT

2.在之后的请求当中,在headers中加上Authorization字段,通过token验证,如何爬取内容

完整代码:

import requests
from urllib.parse import urljoin
import urllib3

BASEURL = 'https://login3.scrape.center/'        # 首页
LOGIN_URL = urljoin(BASEURL, '/api/login')       # 登录界面
INDEX_URL = urljoin(BASEURL, '/api/book')        # 内容页面

USERNAME = 'admin'  # 用户名
PASSWORD = 'admin'  # 密码
urllib3.disable_warnings()  # 忽视警告

# https://login3.scrape.center/api/login
json = {
    "username": USERNAME,
    "password": PASSWORD,
}

response_login = requests.post(LOGIN_URL, json=json, verify=False)  # verify=False 取消证书验证
data = response_login.json()
print('Response json', data)
jwt = data.get('token')
print('JWT', jwt)

headers = {
    "Authorization": f'jwt {jwt}'
}  # jwt {jwt}中间有空格,漏打程序会报错。

#  https://login3.scrape.center/api/book?limit=18&offset=0  第一页
#  https://login3.scrape.center/api/book?limit=18&offset=18 第二页
#  https://login3.scrape.center/api/book?limit=18&offset=36 第三页
params = {
    "limit": 18,
    "offset": 0
}

response_index = requests.get(INDEX_URL, params=params, headers=headers, verify=False)

print('Response_code', response_index.status_code)  # 输出状态码
print('Response_URL', response_index.url)  # 输出网页的URL
print(response_index.text)  # 输出内容

上述代码中仅爬取第一页,如果需要爬取多页可以进行for循环

#  通过控制page的范围控制爬取的页数
#  https://login3.scrape.center/api/book?limit=18&offset=0  第一页
#  https://login3.scrape.center/api/book?limit=18&offset=18 第二页
#  https://login3.scrape.center/api/book?limit=18&offset=36 第三页

for page in range(0, 10):
    params = {
        'limit': '18',
        'offset': page * 18
    }
    response_index = requests.get(INDEX_URL, params=params, headers=headers, verify=False)
    print('Response_code', response_index.status_code)
    print('Response_URL', response_index.url)
    print(response_index.text)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 Spring Cloud Gateway 基于JWT的验证代码案例: 1. 首先,确保你的项目中已经引入了相关的依赖,包括 Spring Cloud Gateway、Spring Security 和 JWT 相关的库。 2. 创建一个自定义的 GatewayFilter,用于验证JWT并将用户身份信息添加到请求头中: ```java import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; @Component public class JwtAuthFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 从请求头中获取 JWT String jwt = exchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION); // 验证 JWT,根据需要进行相应的验证逻辑 // 如果验证成功,将用户身份信息添加到请求头中 exchange.getRequest().mutate() .header("X-User-Id", "123") // 示例,替换为实际的用户身份信息 .build(); return chain.filter(exchange); } } ``` 3. 在配置类中注册自定义的 GatewayFilter: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class GatewayConfig { @Bean public JwtAuthFilter jwtAuthFilter() { return new JwtAuthFilter(); } } ``` 4. 配置 Spring Cloud Gateway 路由谓词和过滤器,指定需要进行JWT验证的路由: ```yaml spring: cloud: gateway: routes: - id: example_route uri: http://example.com predicates: - Path=/example/** filters: - JwtAuthFilter= # 指定使用 JwtAuthFilter 进行JWT验证 ``` 在这个示例中,我们创建了一个名为 `JwtAuthFilter` 的自定义过滤器,用于验证JWT并将用户身份信息添加到请求头中。然后在配置类中注册该过滤器,并在路由配置中指定需要使用该过滤器的路由。 请注意,这只是一个简单的示例,实际的JWT验证逻辑可能更复杂。你可以根据自己的需求进行相应的调整和扩展。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值