6

一日一技:Scrapy 如何正确 Post 发送 JSON 数据

 3 years ago
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.
neoserver,ios ssh client

一日一技:Scrapy 如何正确 Post 发送 JSON 数据

发表于

2021-05-20

| 分类于 爬虫

| 评论数: 0

我们知道,HTTP请求的 POST 方式,提交上去的数据有很多种格式。例如JSON/form-data/x-www-form-urlencoded等等。我们在 Postman 的 POST 请求里面,可以看到这些数据格式,如下图所示:

2021-05-20-20-31-18.png

虽然同样都是 POST 方式,但是有些网站只能使用特定的格式才能正常返回数据。我们来看一个例子,现在向网址:http://exercise.kingname.info/ajax_1_postbackend POST 提交一个 JSON 字符串:{“name”:”xx”,”age”:24}可以正常得到返回:

2021-05-20-20-33-58.png

但如果提交的数据格式不是 JSON,而是form-data,那么就会报错,如下图所示:

2021-05-20-20-35-50.png

这也就是为什么在使用 requests 的时候,post 方法的第二个参数有data=json=的区别,如下图所示:

2021-05-20-20-37-58.png

在使用 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())

运行效果如下图所示:

2021-05-20-20-48-43.png

JsonRequest本来就是scrapy.Request的一个子类,所以所有能在scrapy.Request使用的参数,都可以直接在JsonRequest中使用。同时,它额外支持两个参数,分别是datadumps_kwargs。其中data参数的值就是一个可以被json.dumps序列化的对象,例如字典或者列表。而dumps_kwargs里面的参数,就是 json.dumps支持的那些参数,例如ensure_ascii=Falsesort_keys=True等等。

大家遇到问题多看官方文档,少在网上搜索些杂七杂八装逼货的烂博客。官方文档是你最好的朋友。


未闻 Code 技术交流群开放啦!群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请添加我的微信“mekingname”,备注“粉丝群”(谢绝广告党,非诚勿扰!)~

谢乾坤 | Kingname wechat
第一时间获取最新文章更新,请订阅我的微信公众号:未闻Code

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK