【笔记】Python3|爬虫请求 CSRF-Token 时如何获取Token、Token过期、处理 CSRF-Token 需要注意的问题及示例

这篇具有很好参考价值的文章主要介绍了【笔记】Python3|爬虫请求 CSRF-Token 时如何获取Token、Token过期、处理 CSRF-Token 需要注意的问题及示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  CSRF-Token 机制是 Web 应用程序中常用的安全机制,它可以防止跨站请求伪造攻击,但会给爬虫造成一定的困扰。本文将介绍在使用 Python3 爬虫时,处理 CSRF-Token 机制需要注意的问题及示例

1 CSRF-Token 机制的原理

  在 Web 开发中,每次发送请求时,服务器都会生成一个 CSRF-Token。当用户访问 Web 页面时,该 CSRF-Token 将被嵌入到 Web 表单请求 URL请求头 中。当用户提交表单或者发送请求时,该 CSRF-Token 将会被服务器验证,以防止跨站请求伪造攻击。

2 爬虫处理 CSRF-Token 机制的问题

  由于爬虫不同于浏览器,它无法直接接收服务器生成的 CSRF-Token。因此,在使用爬虫时,我们需要解决如下问题:

  1. CSRF-Token 在哪生成?
  2. 如何将 CSRF-Token 嵌入到请求中?

3 CSRF-Token 可能存在的位置

  在使用 Python3 爬虫时,针对不同类型的 CSRF-Token 有不同的获取方法。一般来说,CSRF-Token 可能位于 Web 表单、响应头或响应体中。

  如果你认为 CSRF-Token 位于请求 URL 或 请求头 中,你需要找到生成 CSRF-Token 的具体请求报文或者网页元素,而不是从这个请求 URL 中直接分离 CSRF-Token。因为 CSRF-Token 会动态更新。具体来说,我们需要先分析网页或者应用程序,找到生成 CSRF-Token 的具体请求报文或者网页元素,然后从中获取 CSRF-Token。

  下面,我们将分别介绍这三种情况的获取方法。

3.1 CSRF-Token 位于 Web 表单时

  如果 CSRF-Token 位于 Web 表单中,我们可以使用 Beautiful Soup 库或者正则表达式来查找表单元素,然后获取 CSRF-Token。具体代码如下所示:

3.1.1 使用 Beautiful Soup 库

import requests
from bs4 import BeautifulSoup

url = 'http://example.com'

response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')
csrf_token = soup.find('input', {'name': 'csrf_token'}).get('value')

在上面的代码中,我们使用 requests 库来发送 GET 请求,并使用 Beautiful Soup 库来查找 CSRF-Token。

其中 Beautiful Soup 库需要使用pip3安装:

pip3 install BeautifulSoup4

3.1.2 使用正则表达式

import re
import requests

url = 'http://example.com'

response = requests.get(url)

csrf_token = re.findall(r'<input.*?name="csrf_token".*?value="(.*?)".*?>', response.text)[0]

在上面的代码中,我们使用 requests 库来发送 GET 请求,并使用正则表达式来匹配 CSRF-Token。

3.2 CSRF-Token 位于 响应体 时

  我们需要首先通过分析 HTML 页面或者 JavaScript 代码,找到生成 CSRF-Token 的具体请求报文。比如,假设生成 CSRF-Token 的请求报文为:

POST /api/csrf_token HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer 1234567890

{"user_id": "1234567890"}

  我们可以使用 requests 库来发送该请求报文,并从响应体中获取 CSRF-Token。具体代码如下所示:

import requests

url = 'http://example.com/api/csrf_token'

headers = {
    'Authorization': 'Bearer 1234567890',
    'Content-Type': 'application/json'
}

data = {
    'user_id': '1234567890'
}

response = requests.post(url, headers=headers, json=data)

csrf_token = response.json().get('csrf_token')

在上面的代码中,我们使用 requests 库来发送 POST 请求,并使用 response.json() 来解析响应的 JSON 数据,从而获取 CSRF-Token。

  需要注意的是,由于 CSRF-Token 会动态更新,因此我们需要在每次请求时重新获取 CSRF-Token

  另外需要注意的是,有些网站在后台生成 CSRF-Token 时可能会根据不同的请求参数生成不同的 Token,这意味着您需要在发送完整的请求(包括所有参数)之后才能获取到完整的 CSRF-Token。如果在获取 CSRF-Token 时发现它不正确或已过期,您可以尝试重新请求页面并获取新的 CSRF-Token。

3.3 CSRF-Token 位于 响应头 时

  CSRF-Token 除了可以存在于响应体(Response Body)之外,还可能被隐藏在请求的响应头(Response Header)中。因此,在获取 CSRF-Token 时,您还应该查看完整的响应头,以查看是否有其他的 CSRF-Token。具体代码如下所示:

import requests

url = 'http://example.com/api/csrf_token'

headers = {
    'Authorization': 'Bearer 1234567890',
    'Content-Type': 'application/json'
}

data = {
    'user_id': '1234567890'
}

response = requests.post(url, headers=headers, json=data)
csrf_token = dict(response.headers)['Csrf-Token']

以上就是针对 CSRF-Token 存在的三个位置获取 CSRF-Token 的 两种方法。在实际爬虫过程中,我们需要根据 CSRF-Token 的具体位置来选择相应的方法来获取 CSRF-Token。

3.4 注意事项

  Request 请求的构造过程往往只有以下两步:

  1. 首先,去网站上找一下对应的请求链接。
  2. 使用 requests.get或requests.post 发起请求就行。

  然而,由于 CSRF-Token 往往用于判断同一个会话的合法性,因此有这种机制的时候,需要保证获取 CSRF-Token 的请求和下一个请求处于同一个会话中(会话:Session),所以需要额外使用 requests.Session,然后将 requests.getrequests.post 直接替换成 Session.getSession.post

下面是一个简单的示例:

import requests

# 创建一个 Session 对象
session = requests.Session()

# 先请求登录页面获取 csrf_token
login_url = 'http://example.com/login'
login_page = session.get(login_url).text
csrf_token = re.findall('csrf_token=(.*?)&', login_page)[0]

# 使用获取到的 csrf_token 登录
data = {
    'username': 'admin',
    'password': '123456',
    'csrf_token': csrf_token
}
login_result = session.post(login_url, data=data)

# 在同一个 Session 下进行其他操作
data = {
    'param1': 'value1',
    'param2': 'value2',
    'csrf_token': csrf_token
}
result = session.post('http://example.com/other_operation', data=data)

在上面的代码中,我们首先使用 session.get 获取登录页面,然后使用正则表达式获取其中的 csrf_token,接着使用 session.post 发起登录请求,并在同一个 session 对象下进行其他操作,确保处于同一个会话中,从而绕过 CSRF-Token 的检查。

4 将 CSRF-Token 嵌入到请求中

  获取 CSRF-Token 后,我们需要将它嵌入到请求中,以便服务器可以验证请求的合法性。在使用 Python3 爬虫时,需要根据具体的网址判断 CSRF-Token 的嵌入位置,嵌入位置一般在请求头或请求参数中。下面我们将介绍这两种嵌入位置应该如何嵌入。

4.1 CSRF-Token 嵌入请求头

  在请求头中嵌入 CSRF-Token 的方法和普通的请求头差不多,只需要在请求头中加入 X-CSRF-Token 或者 X-XSRF-Token 等字段(根据具体网址判断字段名称),并将获取到的 CSRF-Token 作为该字段的值即可。示例代码如下:

import requests

url = 'http://example.com/submit_form'
csrf_token = '1234567890abcdef'

headers = {
    'X-CSRF-Token': csrf_token,
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

data = {
    'param1': 'value1',
    'param2': 'value2'
}

response = requests.post(url, headers=headers, data=data)

4.2 CSRF-Token 嵌入请求参数

  在请求参数中嵌入 CSRF-Token 的方法也很简单,只需要在请求参数中加入名为 csrf_token 的字段,并将获取到的 CSRF-Token 作为该字段的值即可。示例代码如下:

import requests

url = 'http://example.com/submit_form'
csrf_token = '1234567890abcdef'

params = {
    'param1': 'value1',
    'param2': 'value2',
    'csrf_token': csrf_token
}

response = requests.get(url, params=params)

以上代码中,如果是post请求,则需要使用requests.post(url, headers=headers, data=data),将 CSRF-Token 嵌入到 data 字段。

  需要注意的是,不同的网站可能采用不同的嵌入位置,甚至可能采用多种嵌入方式,需要具体情况具体分析。

5 示例

  下面,我们将使用 requests 库来实现一个简单的爬虫,用于获取西北工业大学的招生计划。

  首先,我们需要获取西北工业大学网站的 CSRF-Token。具体代码如下所示:

import requests
import json

headers = {} # 请自行去网站上复制补全
get_token_url = "https://zsb.nwpu.edu.cn/f/ajax_get_csrfToken"
Session = requests.Session()
def get_csrf_token():
    global data
    update_ts()
    response = Session.post(get_token_url, headers=headers, data=data)
    csrf_token = json.loads(response.text)['data']
    return csrf_token

在上面的代码中,我们使用 requests 库来发送 GET 请求,并使用 Beautiful Soup 库来查找 CSRF-Token。

  接下来,我们需要将 CSRF-Token 添加到请求头中,并发送请求。具体代码如下所示:

headers["Csrf-Token"] = get_csrf_token()
get_zsjh_url = "https://zsb.nwpu.edu.cn/f/ajax_zsjh"
response = Session.post(get_zsjh_url, headers=headers, data=data)
print(response.text)

在上面的代码中,我们将 CSRF-Token 添加到请求头中,并使用 requests 库发送 POST 请求。由于西北工业大学的招生计划是动态生成的,因此我们需要使用 POST 请求来获取数据。

  运行上面的代码后,我们将会得到西北工业大学的招生计划。

  需要注意的是,该会话接下来的 CSRF-Token 在这个response 的响应头。因此如果需要继续请求,需要使用这个response的headers去更新 CSRF-Token,代码如下所示:

# update Csrf-Token
headers["Csrf-Token"] = dict(response.headers)['Csrf-Token']

6 总结

  在使用 Python3 爬虫时,我们需要了解 CSRF-Token 机制,并正确地处理它,以便服务器可以验证请求的合法性。

  具体来说,我们需要通过发送 GET 请求来获取 CSRF-Token,然后将 CSRF-Token 嵌入到请求中,以便服务器可以验证请求的合法性。在 Python3 中,我们可以使用 requests 库和 Beautiful Soup 库来实现这一过程。文章来源地址https://www.toymoban.com/news/detail-765961.html

到了这里,关于【笔记】Python3|爬虫请求 CSRF-Token 时如何获取Token、Token过期、处理 CSRF-Token 需要注意的问题及示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python3爬虫之 Selenium库的使用

    今天在官网看了下Selenium库,总结了下常用的方法,直接上代码。(沈略环境搭建,网上多得是),新手建议去了解10分钟再来看这里的代码。 这里列举一下常用的查找元素方法:其实find_element_by_xpath是万能的。 单元素定位: find_element_by_name find_element_by_id find_element_by_xpath

    2024年02月11日
    浏览(32)
  • python3 爬虫相关学习1:安装requests模块

    目录 1 安装前:避免python2  python3 引起的问题 2 如何安装python3 2.1 直接上python3 官网下载 2.2 或者windows的话,microsoft store 里也可以下载 2.3 查看python版本 3 安装requests模块 3.1 很可能安装requests模块之前会遇到报错,需要先升级pip 3.2 安装 requests模块 4 开始使用 requests 模块 4.

    2024年02月05日
    浏览(55)
  • springboot项目中如何获取请求头当中的token

    一.直接在controller层当中直接获取token 在controller层获取前端在请求头中存储的token有两种方式: 获取token方式1 获取token方式2 二.在service业务层获取token 在service层中获取token需要使用相应的工具类,这里我分享一个有用的工具类。代码如下: 那么这个工具类如何使用呢?很简

    2024年02月06日
    浏览(29)
  • python3 爬虫相关学习7:初步摸索使用 BeautifulSoup

    目录 1 一个爬图片pic的代码的例子 1.1 学习的原文章 1.2 原始代码的问题总结 问题1 问题2 问题3 其他问题 1.3 原始代码 2  直接在cmd里 python运行报错 和 处理 2.1 运行报错 2.2 报错原因: 没有提前安装这个bs4  模块 2.3 如何提前知道我的python环境下有没有安装bs4 或其他模块呢

    2024年02月08日
    浏览(32)
  • python3 爬虫相关学习9:BeautifulSoup 官方文档学习

    目录 1 BeautifulSoup 官方文档 2 用bs 和 requests 打开 本地html的区别:代码里的一段html内容 2.1 代码和运行结果 2.2 用beautiful 打开 本地 html 文件 2.2.1 本地html文件 2.2.2 soup1=BeautifulSoup(html1,\\\"lxml\\\") 2.3 用requests打开 本地 html 文件 2.3.1 本地html文件 2.3.2 print(html1) 3 用bs 和 requests 打开 本

    2024年02月08日
    浏览(31)
  • python中应用requests库模拟postman请求携带token,使用get和post方法请求头携带token

    实际开发中, Python程序中需要调用后台接口 ,充当前端, 后端规定请求头需要携带token postman中 form-data、x-www-form-urlencoded的区别_叫我峰兄的博客-CSDN博客 python requests 带请求头Token发起http请求_python request token_软件测试李同学的博客-CSDN博客 python发送requests请求时,使用登录的

    2024年02月16日
    浏览(37)
  • python3 爬虫相关学习8:python 的常见报错内容 汇总收集

    目录 1 低级错误(比如拼写错误等)  1.1 NameError:  1.2 属性错误 AttributeError:  属性拼写错误 2  应用错误(类型应用,属性使用的错误) 2.1 类型错误 TypeError:  如字符串连接错误 2.2  属性应用错误  AttributeError 3 模块相关错误 3.1 找不到对应模块 ModuleNotFoundError: 3.2 相关模

    2024年02月09日
    浏览(36)
  • 【Spring Security】认证&密码加密&Token令牌&CSRF的使用详解

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Security》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一

    2024年02月04日
    浏览(36)
  • 【小5聊】Python3 使用selenium模块实现简单爬虫系列一

    第一次听说Python还是在工作的时候,还是一位女生在用,当时她说可以用来处理excel文档,特别是一些统计分析。第二次让我真正进入python世界,还是在一次C站举办的大赛上。聊聊你是因为什么机缘巧合进入到python圈的呢?不妨留言说说 本期主要是聊聊,我接触到的selenium模

    2024年02月06日
    浏览(59)
  • Python3 网络爬虫开发实战 第2版 (崔庆才) PDF 高清

    《Python 3 网络爬虫开发实战(第二版)》是由崔庆才所著的一本关于使用 Python 进行网络爬虫开发的书籍。 网络爬虫基础:介绍网络爬虫的基本概念、工作原理和常见的应用场景。 HTTP 协议与 Scrapy 框架:解释 HTTP 协议的基本知识,以及如何使用 Scrapy 框架来构建和管理爬虫项

    2024年04月09日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包