Scrapy发送POST请求携带Request Payload参数

首先我们来看看我的辛酸历程,各种报错

报错1:服务器居然回个500来骗我说服务器故障,不得不说开发人员真的是太坏了,不过我就喜欢这样的。

报错2:没有足够的值解包,需要的是2个,结果只有1个,难道问题在这?我们再往下看

 报错3:说无法解压缩,不可编辑的int对象,这是啥,莫非是我传的参数有问题?反复检查,怀疑人生中......

 报错4:返回405,并且是一个GET请求,???,FormRequest不是POST请求吗,怎么变成了GET请求?又是一顿检查,各种修改,然后怀疑人生......

 报错5:接收unicode、str或字节对象got dict,咦,怎么感觉好像有点思路了,请往下继续观看

 经过尝试,我写了如下几种请求方法,从scrapy.FormRequest,到scrapy.http.FormRequest,以及什么formdata,body,各种参数,期间还怀疑是不是url的问题,是不是其他参数的问题,也不知道对不对,反正都测试了,结果就是一堆错误,并没有什么卵用。

yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse)
yield scrapy.FormRequest(url=url, formdata=json.dumps(data), callback=self.parse)
yield scrapy.FormRequest(url=url, formdata=json.dumps(data).encode('utf-8'), callback=self.parse)
yield scrapy.FormRequest(url=url, body=data, callback=self.parse)
yield scrapy.FormRequest(url=url, body=json.dumps(data), callback=self.parse)
yield scrapy.FormRequest(url=url, body=json.dumps(data).encode('utf-8'), callback=self.parse)
yield scrapy.http.FormRequest(url=url, formdata=data, callback=self.parse)
yield scrapy.http.FormRequest(url=url, formdata=json.dumps(data), callback=self.parse)
yield scrapy.http.FormRequest(url=url, formdata=json.dumps(data).encode('utf-8'), callback=self.parse)
yield scrapy.http.FormRequest(url=url, body=data, callback=self.parse)
yield scrapy.http.FormRequest(url=url, body=json.dumps(data), callback=self.parse)
yield scrapy.http.FormRequest(url=url, body=json.dumps(data).encode('utf-8'), callback=self.parse)
yield scrapy.http.FormRequest(url=url, formdata=data, callback=self.parse)

最后,我放弃了FormRequet,换成了Request,手动指定请求方法为POST,才重要成功请求到数据。

yield scrapy.Request(url=url, body=json.dumps(data).encode('utf-8'), method="POST", callback=self.parse)

我是木子,关注我,让我们一起成长!

### 使用Scrapy发送带有参数POST请求 为了通过Scrapy框架发送带参数的`POST`请求,可以利用`scrapy.FormRequest`类或自定义`scrapy.Request`对象并指定HTTP方法为`POST`以及设置适当的内容类型头文件和消息体。下面展示了两种实现方式。 #### 方法一:使用 `FormRequest` 当目标网页表单提交采用默认编码(`application/x-www-form-urlencoded`)时,推荐使用`FormRequest.from_response()`静态方法来构建请求实例[^1]: ```python import scrapy def parse(self, response): yield scrapy.FormRequest( "http://example.com/post", formdata={ 'field1': 'value1', 'field2': 'value2' }, callback=self.after_post ) ``` 此代码片段创建了一个新的`FormRequest`对象,并指定了要访问的目标URL、待发送的数据字典及回调函数用于处理响应结果。 #### 方法二:手动构造 `Request` 对于更复杂的场景,比如需要以JSON格式传递数据,则应该直接初始化`scrapy.Request`对象,并显式提供必要的配置项,如HTTP动词、主体内容及其MIME类型等属性[^2]: ```python import json import scrapy def start_requests(self): payload = { 'field1': 'value1', 'field2': 'value2' } yield scrapy.Request( url="http://example.com/api", method='POST', body=json.dumps(payload), headers={'Content-Type': 'application/json'}, callback=self.parse_api_response ) ``` 上述例子中,先将Python字典转换成字符串形式作为请求体的一部分;同时设置了正确的头部信息告知服务器客户端正在发送的是JSON序列化后的实体。 值得注意的是,在某些情况下可能还需要考虑额外的因素,例如CSRF令牌验证等问题,这取决于具体的应用逻辑和服务端的安全机制设计[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemuzhi_零度

作者幸苦,犒劳一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值