一日一技:Scrapy 如何正确 Post 发送 JSON 数据
source link: https://www.kingname.info/2021/05/20/use-scrapy-jsonrequest/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
一日一技:Scrapy 如何正确 Post 发送 JSON 数据
我们知道,HTTP请求的 POST 方式,提交上去的数据有很多种格式。例如JSON
/form-data
/x-www-form-urlencoded
等等。我们在 Postman 的 POST 请求里面,可以看到这些数据格式,如下图所示:
虽然同样都是 POST 方式,但是有些网站只能使用特定的格式才能正常返回数据。我们来看一个例子,现在向网址:http://exercise.kingname.info/ajax_1_postbackend
POST 提交一个 JSON 字符串:{“name”:”xx”,”age”:24}
可以正常得到返回:
但如果提交的数据格式不是 JSON,而是form-data
,那么就会报错,如下图所示:
这也就是为什么在使用 requests 的时候,post 方法的第二个参数有data=
和json=
的区别,如下图所示:
在使用 Scrapy 的时候,很多人都知道怎么提交 GET 请求,但却不太清楚怎么提交 POST 请求。如果你在网上搜索,那么,你会看到有两种回答:
第一种回答,会建议你使用scrapy.FormRequest
。但这个方法提交的数据是form-data
格式,如果网站需要接收 JSON 格式的数据,那么提交就会失败。
第二种回答,会建议你使用scrapy.Request(url, method='POST', body=json.dumps(xxx))
。这种方式确实可以成功提交 JSON 数据,但写起来比较麻烦。
但如果你看过 Scrapy 的官方文档Requests and Responses,你就会知道,实际上 Scrapy 原本就提供了一个专门用来POST 提交 JSON 数据的方式——JsonRequest
。它的位置在scrapy.http.JsonRequest
。并且使用起来跟 scrapy.Request
一样简单:
import scrapy
from scrapy.http import JsonRequest
class ExampleSpider(scrapy.Spider):
name = 'example'
allowed_domains = ['xxx.com']
# start_urls = ['http://xxx.com/']
def start_requests(self):
body = {
'name': 'kingname',
'age': 28
}
url = 'http://exercise.kingname.info/ajax_1_postbackend'
yield JsonRequest(url, data=body, callback=self.parse)
def parse(self, response, *args, **kwargs):
print(response.body.decode())
运行效果如下图所示:
JsonRequest
本来就是scrapy.Request
的一个子类,所以所有能在scrapy.Request
使用的参数,都可以直接在JsonRequest
中使用。同时,它额外支持两个参数,分别是data
和dumps_kwargs
。其中data
参数的值就是一个可以被json.dumps
序列化的对象,例如字典或者列表。而dumps_kwargs
里面的参数,就是 json.dumps
支持的那些参数,例如ensure_ascii=False
、sort_keys=True
等等。
大家遇到问题多看官方文档,少在网上搜索些杂七杂八装逼货的烂博客。官方文档是你最好的朋友。
未闻 Code 技术交流群开放啦!群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请添加我的微信“mekingname”,备注“粉丝群”(谢绝广告党,非诚勿扰!)~
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK