Scrapy 如何正确 Post 发送 JSON 数据 转载:https://mp.weixin.qq.com/s/sy8pi9CdIRNEgCMgdJH87Q
我们知道,HTTP请求的 POST 方式,提交上去的数据有很多种格式。例如JSON
/form-data
/x-www-form-urlencoded
等等。我们在 Postman 的 POST 请求里面,可以看到这些数据格式,如下图所示:
虽然同样都是 POST 方式,但是有些网站只能使用特定的格式才能正常返回数据。我们来看一个例子,现在向网址:http://exercise.kingname.info/ajax_1_postbackend
POST 提交一个 JSON 字符串:{“name”:”xx”,”age”:24}
可以正常得到返回:
但如果提交的数据格式不是 JSON,而是form-data
,那么就会报错,如下图所示:
这也就是为什么在使用 requests 的时候,post 方法的第二个参数有data=
和json=
的区别,如下图所示:
在使用 Scrapy 的时候,很多人都知道怎么提交 GET 请求,但却不太清楚怎么提交 POST 请求。如果你在网上搜索,那么,你会看到有两种回答:
第一种回答,会建议你使用scrapy.FormRequest
。但这个方法提交的数据是form-data
格式,如果网站需要接收 JSON 格式的数据,那么提交就会失败。
第二种回答,会建议你使用scrapy.Request(url, method='POST', body=json.dumps(xxx))
。这种方式确实可以成功提交 JSON 数据,但写起来比较麻烦。
但如果你看过 Scrapy 的官方文档Requests and Responses[1],你就会知道,实际上 Scrapy 原本就提供了一个专门用来POST 提交 JSON 数据的方式——JsonRequest
。它的位置在scrapy.http.JsonRequest
。并且使用起来跟 scrapy.Request
一样简单:
import scrapy
from scrapy.http import JsonRequest
class ExampleSpider(scrapy.Spider):
name = 'example'
allowed_domains = ['xxx.com']
# start_urls = ['http://xxx.com/']
def start_requests(self):
body = {
'name': 'kingname',
'age': 28
}
url = 'http://exercise.kingname.info/ajax_1_postbackend'
yield JsonRequest(url, data=body, callback=self.parse)
def parse(self, response, *args, **kwargs):
print(response.body.decode())
运行效果如下图所示:
JsonRequest
本来就是scrapy.Request
的一个子类,所以所有能在scrapy.Request
使用的参数,都可以直接在JsonRequest
中使用。同时,它额外支持两个参数,分别是data
和dumps_kwargs
。其中data
参数的值就是一个可以被json.dumps
序列化的对象,例如字典或者列表。而dumps_kwargs
里面的参数,就是 json.dumps
支持的那些参数,例如ensure_ascii=False
、sort_keys=True
等等。
大家遇到问题多看官方文档,少在网上搜索些杂七杂八装逼货的烂博客。官方文档是你最好的朋友。
参考资料
[1]
Requests and Responses: https://doc.scrapy.org/en/latest/topics/request-response.html#jsonrequest
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2020-05-26 Kubernetes 学习笔记 权威指南第七章
2017-05-26 可以在找工作的网站上看到当前行业大家常用的框架,工具,技能