news 2026/4/20 17:38:15

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:35:32

scrapy基础知识之发送GET请求

你想掌握 Scrapy 框架中发送 GET 请求的核心知识,这是 Scrapy 爬虫最基础、最常用的操作 ——GET 请求主要用于爬取静态页面、带 URL 参数的列表页 / 搜索页等场景,也是新手入门 Scrapy 的第一个核心技能。我会从基础用法、灵活配置、避坑要点三个维度详…

作者头像 李华
网站建设 2026/4/18 18:32:44

【挖洞干货】震惊!某学生1天轻松挖100洞!

正文 目录 快速挖洞前的准备工作 工具的准备: 工具的用法 权重开始撒网 漏洞: first:弱口令 second:XSS third:SQL fourth:文件上传开始下手最后震惊!某学生1天轻松挖100洞&#xff0…

作者头像 李华
网站建设 2026/4/17 17:20:04

西门子A5E45508683002

一、产品定位与核心功能该型号属于西门子 SIMATIC S7-300/400 系列 的通信处理器(CP模块),主要用于工业控制系统的串行通信接口扩展。其核心功能包括:协议支持:提供 RS232/RS422/RS485 物理接口,支持以下工…

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

安卓Framework 层详解

Framework 架构概览Android Framework 实际上分为两个主要部分:┌─────────────────────────────────────────────┐ │ 应用层 (Application) │ │ Java/Kotlin 应用代码 …

作者头像 李华
网站建设 2026/4/16 23:48:48

通信协议仿真:5G NR协议仿真_(17).5G NR仿真中的大规模MIMO技术

5G NR仿真中的大规模MIMO技术 引言 大规模MIMO(Multiple-Input Multiple-Output)技术是5G NR(New Radio)通信系统中的关键技术之一。通过在基站和用户设备上使用大量天线阵列,大规模MIMO可以显著提高系统的频谱效率、覆…

作者头像 李华