json和dict
python中的dict定制开发类型要转换为json定制开发格式的数据需要用到:
- import json
-
- <json> = json.dumps(<dict>)
-
- <dict> = json.loads(<json>)
定制开发需要注意的是:
python中并没有json定制开发类型这一说法,通过json.dumps(<dict>)定制开发转换的字典对象,定制开发最后得到的是一个字符串对象,在python中json定制开发格式的数据实际上就是一个字符串。
- >>> j = json.dumps(<dict>)
-
- >>> type(j)
-
- <class 'str'>
虽说json格式的数据在python中是以字符串的类型存在的,但是通过str(<dict>)工厂函数所得到的结果同json.dumps(<dict>)方法所得到的结果是不相同的
- >>> d = {'a': 1, 'b': 2}
-
- >>> d_d = {"a": 1, "b": 2}
-
- >>> string = str(d)
-
- >>> string_d = str(d_d)
-
- >>> js = json.dumps(d)
-
- >>> js_d = json.dumps(d_d)
-
- >>> string == string_d
-
- True
-
- >>> js = js_d
-
- True
-
- >>> string == js
-
- False
-
- >>> string
-
- "{'a': 1, 'b': 2}"
-
- >>> js
-
- '{"a": 1, "b": 2}'
可以看出string和js的区别在于引号
对于可以作为json.loads(<str>)参数对象的字符串,除了要满足字典类型的格式外,所有的字符串对象必须是双引号。
requests.post()
在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json
常见的form表单可以直接使用data参数进行报文提交,而data的对象则是python中的字典类型;
在爬虫的过程中遇到了一种报文,是一种json格式的报文,因此传入的报文对象也应该是格式的;
这里有两种方法进行报文提交:
- import requests
-
- import json
-
- url = "http://example.com"
-
- data = {
-
- 'a': 1,
-
- 'b': 2,
-
- }
-
- # 1
-
- requests.post(url, data=json.dumps(data))
-
- # 2-json参数会自动将字典类型的对象转换为json格式
-
- requests.post(url, json=data)
其它
在requests.get()方法,中可以使用params参数来构建url
请求得到的结果可能呈现乱码的状态,可以通过resp.encoding属性查看网页编码方式,同时可以在获取resp.text之前对resp.encoding='utf-8'赋值,这样再次获取的resp.text则会使用我们要求的编码方式。
post请求中json和data的区别
post请求中,可以使用data传递参数,也可以使用json传递参数
两种方式有什么区别?
如果参数为JSON数据,可以直接传入json参数,它将自动编码并将Content-Type的置为application/json
- payload = {'key1': 'value1', 'key2': 'value2'}
-
- r = requests.post("https://httpbin.org/post", json=payload)
-
- print(r.text)
如果data传递的参数为字符串,如:json.dumps(payload),则request对参数进行url编码,Content-Type的值为None,所以data传字符串时,一定要在header中指定Content-Type
- payload = {'key1': 'value1', 'key2': 'value2'}
-
- headers={"Content-Type": "application/json"}
-
- r = requests.post("https://httpbin.org/post", headers=headers,data=json.dumps(payload))
-
- print(r.text)
如果data传递的是字典、元组组成的列表或列表作为值的字典,则request对参数进行url编码,Content-Type的值为application/x-www-form-urlencoded
- # 字典
-
- payload1 = {'key1': 'value1', 'key2': 'value2'}
-
- r = requests.post("https://httpbin.org/post", data=payload1)
-
- # 元组组成的列表
-
- payload2 = [('key1', 'value1'), ('key1', 'value2')]
-
- r = requests.post("https://httpbin.org/post", data=payload2)
-
- # 列表作为值的字典
-
- payload3 = {'key1': ['value1', 'value2']}
-
- r = requests.post("https://httpbin.org/post", data=payload3)