Python实现复杂Post请求数据爬取实战:Query与Body共存场景解析

江岸
江岸
发布时间:2026-10-13| 6人浏览过
原创

本文详解如何利用Python的requests库爬取包含复杂参数的Post接口。针对部分网站要求同时传递Query字符串参数与空的JSON Body以触发反爬机制的特殊场景,提供了具体的代码实现方案。文章分析了请求头配置、参数序列化及raw格式提交的关键点,帮助开发者解决此类逆向工程难题。

背景与问题概述

背景动机

在与同学交流过程中,对方提出需要爬取某个特定网站的Post请求数据,这成为了本次技术探讨的起点。

复杂Post请求参数结构分析

现象观察

经过对该网站Post请求参数的深入分析,发现其参数结构具有特殊性,主要包含两种类型:第一类是将参数直接拼接在URL的Query字符串中;第二类则要求在Body中携带一个空的JSON对象。关于为何必须添加这个空JSON对象,推测这可能是网站用于反爬虫的一种策略。这种同时包含Query参数和带有空对象的Body参数的设计,确实较为少见且颇具挑战性。起初,通过在apizza网站进行相关实验,才验证了这一规律,并确认该网站的请求参数必须以raw形式提交。如果直接编写代码去猜测这种规律,难度极大。

Python代码实现方案

核心代码实现


import requests
import json
headers = {
    'Accept':'application/json, text/javascript, */*; q=0.01',
    'X-Requested-With':'XMLHttpRequest',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
    'Content-Type':'application/json',
    'Accept-Encoding':'gzip, deflate',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Cache-Control':'no-cache',
  }
#空的对象,body参数
data = {}
data = json.dumps(data)
page = 0
url = '网站地址,后面为参数?param1=1¶m1='+str(page)
response = requests.post(url = url,data=data ,headers =headers )
print(response.url)
print(response.text)

请求处理关键要素总结

关键步骤总结

  • 在现有工具中观察到的现象表明,处理此类请求需关注以下几个维度:
  • 首先确定请求方法,明确是Post、Get还是其他类型。
  • 其次识别参数类型,判断是form-data、raw还是其他格式。
  • 最后定位参数位置,若为Post请求,需确认参数是位于Query中、Body中,还是两者兼有。

补充说明:使用Python requests库发起HTTP POST请求的基本方法。

具体而言,使用python requests发起带有参数和请求头的HTTP POST请求,示例代码如下:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
url = 'http://official-account/app/messages/group'
body = {"type": "text", "content": "测试文本", "tag_id": "20717"}
headers = {'content-type': "application/json", 'Authorization': 'APP appid = 4abf1a,token = 9480295ab2e2eddb8'}
#print type(body)
#print type(json.dumps(body))
# 这里有个细节,如果body需要json形式的话,需要做处理
# 可以是data = json.dumps(body)
response = requests.post(url, data = json.dumps(body), headers = headers)
# 也可以直接将data字段换成json字段,2.4.3版本之后支持
# response = requests.post(url, json = body, headers = headers)
# 返回信息
print response.text
# 返回响应头
print response.status_code 

综合回顾

以上内容详细介绍了基于Python进行Post请求数据爬取的方法与细节,希望能为读者提供实质性的帮助。若有任何疑问,欢迎留言交流,小编将及时回复。在此衷心感谢大家对本站的支持!如果您觉得本文对您有所帮助,欢迎转载,但请注明出处,谢谢!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。