scrapy中关于POST请求的问题

首先谈一下常规情况,常规方法:

#手动提交post
class LoginSpider(scrapy.Spider):
	name = 'login'
    #allowed_domains = ['www.xxx.com']
    start_urls = ['https://user.qzone.qq.com/137*****0']
    def start_requests(self):
        #手动发送post请求
        yield scrapy.FormRequest(url=self.start_urls,formdata={ '':'','':''},method='POST',callback=self.parse)

主要就是最后一行的提交代码,method= “post”,必须加上

如果post的提交字段(请求体)不是formdata,而是Request Payload,则必须要注意,需要将Request Payload转为json格式:
(关于payload和formData有什么不同可以参考这位大佬的文章:【请求之密】payload和formData有什么不同?)

#如请求体是payload,则原先的formdata=data要改成 body=data,
#并将字典形式的请求体data = json.dumps(data)
yield scrapy.FormRequest(url=url,
                    body=json.dumps(Request_Payload),
                    callback=self.parse,
                    method='POST',
                    dont_filter=True,
                    headers=headers,
                    errback=self.errback)

其中scrapy.FormRequest还可以写成,scrapy.http.Request或者scrapy.Request,区别和原因不详

如果不用scrapy框架:

#请求体为formData
response = requests.post(url=url, params=param, headers=headers)
#请求体为Request Payload
response = requests.post(url=url,json=Request_Payload,headers = headers)

记录问题一:

在不用scrapy框架,这个post请求是成功,而把headers和Request Payload拿到框架里面来的时候,却请求不到数据,在查了一些文章之后,将headers当中的***‘content-length’: ‘346’***注释了,测试可行。链接在这:关于payload参数_scrapy第一次发送POST请求

我确实没想到,按楼主的思路,应该尝试着注释掉影响不是很大的参数

  • 注释掉headers里面的 Content-Length 这一栏 原因如下:

  • 建议不要使用通用HTTP库中的几个标头。大多数库会自己生成这些:

     host
     content-length
    
  • 具体来说,HTTP RFC非常清楚地指定,每当一次Content-Length发送标头不止一次(Scrapy可能会这样做),则响应必须为400。请求(可能未设置其自己的Content-Length标头)并顺应您的要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值