在web应用中常用JSON(JavaScript Object Notation)格式传输数据,例如:
利用http://httpbin.org/API对发送的http请求进行观测。
爬虫程序利用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}