好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

26. 读写json数据

在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测试数据',?'timeout':?20,?'images':?0}?????????????#以京东为例,timeout指定渲染时间,images为0表示不渲染图片>>>?json_data?=?json.dumps(data)????????????????#将python字典转换为json数据,即序列化>>>?json_data'{"url":?"http://jd测试数据",?"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测试数据',?'timeout':?20,?'images':?0}>>>?f?=?open('demo.json',?'w')>>>?json.dump(data,?f)??????????????#将字典转化为json数据>>>?f.close()

#?cat?demo.json?{"url":?"http://jd测试数据",?"timeout":?20,?"images":?0}

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

查看更多关于26. 读写json数据的详细内容...

  阅读:33次