news 2026/5/8 5:20:19

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/5/5 17:30:34

【课程设计/毕业设计】基于java教材征订管理系统基于微服务教材征订系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/1 7:58:50

2025国内评价高的宠物项圈权威榜单重磅发布

行业痛点分析当前宠物项圈领域面临着诸多技术挑战。一方面,定位精度不足是一大难题。在复杂城市环境中,宠物活动范围广,传统项圈的定位误差较大,难以准确追踪宠物位置。测试显示,部分项圈在高楼林立区域的定位误差可达…

作者头像 李华
网站建设 2026/5/4 5:02:05

为了过知网检测,我自费测了十大降AI平台,最好用的都在这了

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

作者头像 李华
网站建设 2026/5/2 20:07:28

【在Ubuntu22.04下,微星z790主板装机后无wifi模块】

在Ubuntu22.04下,微星z790主板装机后无wifi模块因为微星最新一批的支持wifi7的主板全都是高通的wifi模块,所以装机后没有网卡驱动,不显示wifi,解决方法为找一跟数据线把手机连接到电脑主机上,开启usb网络共享&#xff…

作者头像 李华
网站建设 2026/5/3 6:25:50

Django Cookie/Session:深入理解与实践

Django Cookie/Session:深入理解与实践 引言 在Web开发中,Cookie和Session是两种常见的用户数据存储方式。它们在保持用户状态、实现个性化体验等方面发挥着重要作用。本文将深入探讨Django框架中的Cookie/Session机制,包括其原理、配置、使用方法以及注意事项。 Cookie/…

作者头像 李华
网站建设 2026/5/1 17:04:16

WebForms Controls:深入理解与高效应用

WebForms Controls:深入理解与高效应用 引言 随着互联网技术的飞速发展,WebForms作为ASP.NET框架的核心技术之一,已经广泛应用于各种企业级应用开发中。WebForms Controls是WebForms的重要组成部分,它们为开发者提供了丰富的UI组件,极大地简化了Web应用程序的开发过程。…

作者头像 李华