news 2026/4/17 19:39:14

scrapy基础知识之发送POST请求

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
scrapy基础知识之发送POST请求

想掌握 Scrapy 框架中发送 POST 请求的核心知识,这是处理需要提交数据(如登录验证、表单提交、API 接口调用)的爬虫场景必备技能。POST 请求与 GET 请求的核心区别是参数放在请求体而非 URL 中,Scrapy 提供了专门的方法来便捷实现这一操作。

一、Scrapy 发送 POST 请求的核心方式

Scrapy 中发送 POST 请求主要有两种核心方法,适配不同的 POST 数据格式:

方法适用场景数据格式
scrapy.FormRequest表单提交(如登录、搜索表单)application/x-www-form-urlencoded(表单编码)
scrapy.RequestJSON / 自定义格式的 POST 请求(如 API 接口)application/json等自定义格式

二、基础语法与关键参数

1. 核心参数说明

无论哪种方法,以下参数最常用:

  • url:必选,POST 请求的目标 URL;
  • method:请求方法,FormRequest默认POSTRequest需手动指定;
  • callback:必选,处理响应的回调函数;
  • formdataFormRequest专属,表单数据(字典格式);
  • bodyRequest专属,请求体(需手动序列化为字符串,如 JSON);
  • headers:可选,请求头(如指定Content-TypeUser-Agent);
  • cookies:可选,请求携带的 Cookies(如登录态)。
2. 示例 1:FormRequest 提交表单(最常用)

适用于模拟登录、表单搜索等场景,自动处理表单数据编码:

python

import scrapy class PostFormSpider(scrapy.Spider): name = "post_form" # 禁用默认的USER_AGENT,避免被识别为爬虫 custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } def start_requests(self): # 目标URL(示例:模拟表单搜索) url = "https://example.com/search" # 表单数据(键为表单字段名,值为提交内容) form_data = { "keyword": "python教程", "page": "1", "sort": "hot" } # 发送POST表单请求 yield scrapy.FormRequest( url=url, formdata=form_data, # 表单数据,自动编码 callback=self.parse_response ) def parse_response(self, response): # 处理响应(示例:提取搜索结果标题) # 注意:需根据目标网站的HTML结构调整XPath/CSS选择器 titles = response.xpath('//div[@class="result-item"]/h3/text()').extract() for title in titles: yield {"title": title.strip()}
3. 示例 2:Request 发送 JSON 格式 POST(API 接口)

适用于调用需要 JSON 请求体的接口(如大部分后端 API),需手动序列化数据并指定请求头:

python

import scrapy import json class PostJsonSpider(scrapy.Spider): name = "post_json" custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } def start_requests(self): # API接口地址 url = "https://example.com/api/v1/data" # JSON请求体数据 json_data = { "category": "book", "limit": 10, "offset": 0 } # 发送JSON格式的POST请求 yield scrapy.Request( url=url, method='POST', # 手动指定POST方法 # 序列化JSON数据为字符串,作为请求体 body=json.dumps(json_data, ensure_ascii=False), # 必须指定Content-Type为application/json headers={ "Content-Type": "application/json; charset=utf-8", "Referer": "https://example.com" # 可选,模拟来源 }, callback=self.parse_api_response ) def parse_api_response(self, response): # 解析JSON响应 try: result = json.loads(response.text) # 提取数据(示例:提取列表数据) for item in result.get("data", []): yield { "id": item.get("id"), "name": item.get("name"), "price": item.get("price") } except json.JSONDecodeError: self.logger.error("JSON解析失败,响应内容:%s", response.text)
4. 进阶:自动提取表单字段(FormRequest.from_response)

如果目标表单包含隐藏字段(如csrf_tokensession_id),手动构造formdata容易遗漏,可使用FormRequest.from_response自动提取页面中的表单字段并补充自定义数据(最常用于模拟登录):

python

import scrapy class LoginSpider(scrapy.Spider): name = "login" start_urls = ["https://example.com/login"] # 先访问登录页 def parse(self, response): # 自动提取登录表单的所有字段(包括csrf_token等隐藏字段) yield scrapy.FormRequest.from_response( response=response, # 登录页的响应对象 # 补充登录账号密码(字段名需匹配页面表单的name属性) formdata={ "username": "your_username", "password": "your_password" }, callback=self.check_login ) def check_login(self, response): # 验证是否登录成功(示例:检查响应中是否包含用户名) if "欢迎您,xxx" in response.text: self.logger.info("登录成功!") # 登录成功后继续爬取需要权限的页面 yield scrapy.Request("https://example.com/user/center", callback=self.parse_user_center) else: self.logger.error("登录失败,请检查账号密码!") def parse_user_center(self, response): # 爬取用户中心数据 pass

三、常见注意事项

  1. 请求头匹配
    • 表单 POST 默认Content-Typeapplication/x-www-form-urlencoded,无需手动设置;
    • JSON POST 必须设置Content-Type: application/json,否则后端无法解析;
    • 务必添加USER_AGENT,避免被目标网站拦截。
  2. 编码问题
    • formdata中的中文会自动编码为 UTF-8,无需手动处理;
    • json.dumps时添加ensure_ascii=False,避免中文被转义为 Unicode 编码。
  3. 异常处理
    • 解析 JSON 响应时需捕获JSONDecodeError
    • 登录场景需验证响应内容,确认登录状态是否有效。
  4. 反爬应对
    • 部分网站会校验RefererCookie等字段,需模拟浏览器请求头;
    • 避免高频请求,可在settings.py中设置DOWNLOAD_DELAY = 2(延迟 2 秒)。

总结

  1. Scrapy 发送 POST 请求优先用FormRequest处理表单,用Request(指定 method=POST)处理 JSON 等自定义格式;
  2. JSON POST 需手动序列化body并设置Content-Type: application/json,表单 POST 无需额外处理编码;
  3. 登录场景推荐用FormRequest.from_response自动提取隐藏字段,避免遗漏关键参数。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:04:04

回溯+位运算|前缀和优化背包

汉字写一遍代码思路 可以提升和人沟通 和加深理解所以不可以只写完代码就去去丸了 还是要复习lc756class Solution { public:bool pyramidTransition(string bottom, vector<string>& allowed) {vector<int> groups[7][7];for (auto& s : allowed) {// A~F…

作者头像 李华
网站建设 2026/4/18 2:02:26

PostgreSQL 时间/日期处理指南

PostgreSQL 时间/日期处理指南 引言 PostgreSQL 是一款功能强大的开源关系型数据库系统,它提供了丰富的数据类型和功能,其中包括对时间/日期数据的支持。本文将详细介绍 PostgreSQL 中时间/日期类型的使用方法,包括数据类型、常用函数、操作和注意事项。 PostgreSQL 时间…

作者头像 李华
网站建设 2026/4/18 2:04:46

Doris资源组管理:精细化资源分配策略

Doris资源组管理:精细化资源分配的"食堂排队秘诀" 关键词:Doris资源组、精细化资源分配、查询优化、资源隔离、队列调度、Cgroup、多租户管理 摘要:当Doris作为大规模数据查询的"餐厅"时,如何让"食客"(查询)快速吃到"饭"(结果)…

作者头像 李华
网站建设 2026/4/17 8:38:54

毕业生都在用的十大降ai工具,建议收藏

家人们&#xff0c;现在学校查得是真严&#xff0c;不仅重复率&#xff0c;还得降ai率&#xff0c;学校规定必须得20%以下... 折腾了半个月&#xff0c;终于把市面上各类方法试了个遍&#xff0c;坑踩了不少&#xff0c;智商税也交了。今天这就把这份十大降AI工具合集掏心窝子…

作者头像 李华
网站建设 2026/4/18 1:59:16

fwrite与fflush作用

简单说&#xff1a; fwrite 负责“写数据”&#xff0c; fflush 负责“把缓冲里的内容真的推到文件/设备”。一、 fwrite 做什么&#xff1f;fwrite 是标准 C 里的带缓冲的文件写入函数&#xff0c;原型&#xff1a;csize_t fwrite(const void *ptr, size_t size, size_t nme…

作者头像 李华
网站建设 2026/4/18 1:57:14

《告别跨端运算偏差:游戏确定浮点数学库的核心搭建指南》

早期涉足游戏开发时,曾执着于浮点精度的极致提升,认为更高的精度就能消除所有差异,直到在一款多人协作游戏的测试中,见证过同一技能在PC端与移动端的伤害结算偏差、主机玩家与手机玩家看到的角色跳跃轨迹分歧—明明是相同的触发条件,却出现技能命中判定失效、物理道具飞行…

作者头像 李华