当前位置: 首页 > news >正文

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自动提取隐藏字段,避免遗漏关键参数。
http://www.jsqmd.com/news/145229/

相关文章:

  • scrapy基础知识之发送GET请求
  • Python返回数组/List长度的方法
  • 纯干货无广:基于真实体验的十大好用降AI工具红黑榜
  • 2025最新!研究生必备9个AI论文平台测评与推荐
  • 为了过知网检测,我自费测了十大降AI平台,最好用的都在这了
  • 如何开启第一次开源贡献之路?
  • 2025年儿童鞋服品牌前十名盘点:专业、舒适、潮流怎么选? - 品牌测评鉴赏家
  • 2026微信公众号服务号、订阅号、小程序、企业微信、微信开放平台、微信开发者平台区别
  • CSS定位的特殊应用
  • MySQL 创建数据库
  • IT监控:多场景探测+可视化诊断,实现网络故障快速排查
  • 国货之光!这10+国产儿童鞋服品牌闭眼入,宝妈收藏这篇就够了 - 品牌测评鉴赏家
  • DBeaver设置不断开连接
  • 国产三维设计软件 ZWPD vs 国外主流平台:协同效率与成本优势分析
  • 2025年国内儿童鞋服品牌前十名 综合排行榜(性价比 品质优选) - 品牌测评鉴赏家
  • Mozz TCAD丨晶体-器件坐标系的精准映射:MOZZ 各向异性模型的坐标配准方法
  • WebForms Controls:深入理解与高效应用
  • 学长血泪复盘:试错半个月,终于找到这十大靠谱降AI方法
  • AI Agent在心理健康领域的应用:情绪支持与干预
  • 2025年宝妈必看!中国十大童装品牌实力测评,从新生儿到学龄童全覆盖 - 品牌测评鉴赏家
  • 学长亲荐8个AI论文软件,专科生轻松搞定毕业论文!
  • PostgreSQL 时间/日期处理指南
  • 【社交APP上线记】小夏、老周、小林的讨论组
  • 年末财税稳控,让发票与收入成本“零隐患”
  • 为什么fastlio的frame_id是carmera_init
  • Doris资源组管理:精细化资源分配策略
  • 宝妈宝爸闭眼入!0 - 16岁儿童鞋服优质品牌大盘点 - 品牌测评鉴赏家
  • AI搜索重构流量格局,品牌如何制定下一代可见度战略?
  • 深入剖析CopyOnWriteArrayList:写时复制魔法让并发读取飞起来!
  • 别再交智商税了!盘点十大良心降AI工具,拒绝论文延毕