irpas技术客

scrapy中关于POST请求的问题_Lemon_guess

未知 851

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

#手动提交post class LoginSpider(scrapy.Spider): name = 'login' #allowed_domains = ['·'] 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标头)并顺应您的要求。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #login