当前位置: 首页 > 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.zskr.cn/news/159725.html

相关文章:

  • 如何开启第一次开源贡献之路?
  • Python返回数组/List长度的方法
  • 论文AI率卡在20%?试试这十佳降AI软件,专治各种检测不过
  • 微店商品详情API使用指南
  • 2025年儿童鞋服品牌前十名盘点:专业、舒适、潮流怎么选? - 品牌测评鉴赏家
  • 国货之光!这10+国产儿童鞋服品牌闭眼入,宝妈收藏这篇就够了 - 品牌测评鉴赏家
  • DBeaver设置不断开连接
  • 1.磁盘阵列
  • 【社交APP上线记】小夏、老周、小林的讨论组
  • 宝妈宝爸闭眼入!0 - 16岁儿童鞋服优质品牌大盘点 - 品牌测评鉴赏家
  • 城市仿真软件:CityEngine_(18).性能优化与渲染技术
  • CSS3 字体
  • 通信协议仿真:5G NR协议仿真_(13).5G NR仿真中的资源管理
  • 《告别跨端运算偏差:游戏确定浮点数学库的核心搭建指南》
  • Comsol软件下的弯曲波导模式分析及有效折射率与损耗精确计算
  • JavaScript 字符串模板
  • 学长血泪复盘:试错半个月,终于找到这十大靠谱降AI方法
  • 九尾狐AI:传统企业AI转型实战白皮书
  • 西电复试面试、笔试时间汇总!最强上岸攻略!
  • Python3 基本数据类型
  • fwrite与fflush作用
  • 【有搜必应】HarmonyOS 热搜技术问题解析第五期
  • django《Python程序设计》课程智能问答系统 智能AI客服问答系统_88mj5719
  • 分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析
  • 福特汽车主观评价规范:性能开发的宝藏指南
  • 年末财税稳控,让发票与收入成本“零隐患”
  • django基于Django的在线课程学习平台1_w494xm97
  • 2025专科生必看!10个AI论文工具测评:开题报告文献综述全攻略
  • CS50 week 4 Problems
  • 程序员越往上走,拼的从来不是技术,而是「会说话」的能力