在web应用中常用JSON(JavaScript Object Notation)格式传输数据,例如:

  1. 利用http://httpbin.org/API对发送的http请求进行观测。

  2. 爬虫程序利用Spalsh渲染引擎渲染页面。

要求:在Python中读取json数据。

解决方案:

标准库中的json模块,使用其中loads()、dumps()方法完成json数据的读写。


  • 对于requests模块:
>>> import requests>>> r = requests.get('http://httpbin.org/headers')>>> r<Response [200]>>>> r.content
b'{\n  "headers": {\n    "Accept": "*/*", \n    "Accept-Encoding": "gzip, deflate", \n    "Host": "httpbin.org", \n    "User-Agent": "python-requests/2.22.0"\n  }\n}\n'>>> r.text'{\n  "headers": {\n    "Accept": "*/*", \n    "Accept-Encoding": "gzip, deflate", \n    "Host": "httpbin.org", \n    "User-Agent": "python-requests/2.22.0"\n  }\n}\n'

  • 对于json模块:

json数据解析(反序列化):json.loads()

>>> import json>>> d = json.loads(r.text)              #python解析为字典>>> d{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}}>>> d['headers']{'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}>>> d['headers']['Host']'httpbin.org'


  • 方案示例:

Spider(Json) → Splash → Web

创建splash容器

$ sudo docker pull scrapinghub/splash

$ sudo docker run -itd -p 8050:8050 scrapinghub/splash

数据序列化为json数据:json.dumps()

>>> import requests>>> import json>>> requests.post<function post at 0x7fad7195c378>>>> url = 'http://localhost:8050/render.html'>>> headers = {'content-type': 'application/json'}>>> data = {'url': 'http://jd.com', 'timeout': 20, 'images': 0}             #以京东为例,timeout指定渲染时间,images为0表示不渲染图片>>> json_data = json.dumps(data)                #将python字典转换为json数据,即序列化>>> json_data'{"url": "http://jd.com", "timeout": 20, "images": 0}'>>> r2 = requests.post(url, headers=headers, data=json_data)>>> r2<Response [200]>>>> r2.text'\n\n京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!\n\n\n   #中间省略  M11.4,0.9C11.4,0.9,11.4,0.9,11.4,0.9L11.4,0.9z">京东秒杀特色优选频道广场为你推荐客服反馈\ue606顶部

\n

\n\n\n\n\n

\n\n

\n\n

\n'

json.loads()json.dumps()外,json模块还有json.load()json.dump()

dumps()和dump()是序列化方法。dumps()只完成了序列化为str;dump()必须传文件描述符,将序列化的str保存到文件中。

loads()和load()是反序列化方法。loads()只完成了反序列化;load()只接收文件描述符,完成了读取文件和反序列化。

>>> data{'url': 'http://jd.com', 'timeout': 20, 'images': 0}>>> f = open('demo.json', 'w')>>> json.dump(data, f)              #将字典转化为json数据>>> f.close()

# cat demo.json {"url": "http://jd.com", "timeout": 20, "images": 0}

>>> f2 = open('demo.json')>>> json.load(f2)               #将json数据转化为字典{'url': 'http://jd.com', 'timeout': 20, 'images': 0}