关于 scrapy post 提交一直有疑惑,不知道选用那种姿势。
scrapy Post 发送数据是我们通常会用
yield scrapy.FormRequest(
url = url,
formdata = {"aaa" : "xxx", "bbb" : "xxxxx"},
callback = self.parse
)
这个请求默认的header:
'Content-Type': 'application/x-www-form-urlencoded
这个传递方式表示,模拟HTML表单提交数据
关于formata 还需要说明的是:如果报错to_bytes must receive a unicode, str or bytes object, got int
那就检查是不是字典里出现了整型数字,字典里所有类型的数据都应该转换成string类型
如果上面拿不到数据,这样来改
yield scrapy.FormRequest(
url,
method='POST',
body=json.dumps(payload),
headers={'Content-Type':'application/json'}
callback=self.parse)
但这是发送header为
'Content-Type': "application/json"
实际上,现在越来越多的人把application/json 这个 Content-Type 作为请求头,
用来告诉服务端消息主体是序列化后的 JSON字符串。
由于 JSON规范的流行,除了低版本 IE之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON的函数,使用 JSON不会遇上什么麻烦。
当然改成这样也可以
my_data = {'field1': 'value1', 'field2': 'value2'}
request = scrapy.Request( url, method='POST',
body=json.dumps(my_data),
headers={'Content-Type':'application/json'} )
这个跟上面没什么区别
但是我翻看了一下,规律好像也不都这样,如果都不行,尝试交换 Content-Type 和 formata/body 的匹配关系,我就看到有这样的提交
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
my_data = {'field1': 'value1', 'field2': 'value2'}
yield scrapy.Request(
url,
method='POST',
body=json.dumps(my_data),
headers=self.headers, dont_filter=True)