在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}
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did126728