首先看一下图一常见的Form Data类型的请求
下面图二是Request payload 类型的请求
重点看打红框框的两个地方,分析一下两种类型的请求头中的参数Content-Type
Form Data 的 Content-Type: application/x-www-form-urlencoded 请求的数据格式为 key1=value1&key2=value2
Request payload的 Content-Type: application/json 请求的数据格式为json格式
scrapy的post请求处理FormRequest 默认的请求头参数是Content-Type: application/x-www-form-urlencoded
看一下源码,如下图中,第二个红框框中设置的默认Content-Type
再看一下第一个红框框中的源码,理解一下 “items = formdata.items() if isinstance(formdata, dict) else formdata”
这个是python中 if-esle的一种简洁写法,表示 “一行表达式, 为真时放if前”
从源码中可以看出FormRequest传输的formdata必须要为dict类型,如果formdata中的value值有int类型的必须转为str类型,否则会报错,如下图所示:
看一下scrapy Request源码,如下图所示:
传入body时,是传入一个字符串类型,所以需要调用json.dumps() 方法将dict转为str。
否则会报错,如下图所示:
总结:所以两个类型的scrapy处理方式是不一样的
Form Data的处理方式:
yield scrapy.FormRequest(url=self.url, formdata=self.form_data, headers=self.header, callback=self.parse_list})
Request payload的处理方式:
yield scrapy.Request(url=self.url, body=json.dumps(self.data), method=‘POST’, headers=self.header, callback=self.parse_list)