Python爬虫JSON及JSONPath运行原理详解


Posted in Python onJune 04, 2020

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。

JsonPath 对于 JSON 来说,相当于 XPATH 对于 XML。

JsonPath与XPath语法对比:

Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

Python爬虫JSON及JSONPath运行原理详解

相关推荐:《Python相关教程》

利用JSONPath爬取拉勾网上所有的城市

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib2
# json解析库,对应到lxml
import json
# json的解析语法,对应到xpath
import jsonpath
url = "http://www.lagou.com/lbs/getAllCitySearchLabels.json"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
request = urllib2.Request(url, headers = headers)
response = urllib2.urlopen(request)
# 取出json文件里的内容,返回的格式是字符串
html = response.read()
# 把json形式的字符串转换成python形式的Unicode字符串
unicodestr = json.loads(html)
# Python形式的列表
city_list = jsonpath.jsonpath(unicodestr, "$..name")
#for item in city_list:
#  print item
# dumps()默认中文为ascii编码格式,ensure_ascii默认为Ture
# 禁用ascii编码格式,返回的Unicode字符串,方便使用
array = json.dumps(city_list, ensure_ascii=False)
#json.dumps(city_list)
#array = json.dumps(city_list)
with open("lagoucity.json", "w") as f:
  f.write(array.encode("utf-8"))

结果:

Python爬虫JSON及JSONPath运行原理详解

糗事百科爬取

利用XPATH的模糊查询

获取每个帖子里的内容

保存到 json 文件内

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import urllib2
import json
from lxml import etree
url = "http://www.qiushibaike.com/8hr/page/2/"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
request = urllib2.Request(url, headers = headers)
html = urllib2.urlopen(request).read()
# 响应返回的是字符串,解析为HTML DOM模式 text = etree.HTML(html)
text = etree.HTML(html)
# 返回所有段子的结点位置,contains()模糊查询方法,第一个参数是要匹配的标签,第二个参数是标签名部分内容
node_list = text.xpath('//div[contains(@id, "qiushi_tag")]')
items ={}
for node in node_list:
  # xpath返回的列表,这个列表就这一个参数,用索引方式取出来,用户名
  username = node.xpath('./div/a/@title')[0]
  # 取出标签下的内容,段子内容
  content = node.xpath('.//div[@class="content"]/span')[0].text
  # 取出标签里包含的内容,点赞
  zan = node.xpath('.//i')[0].text
  # 评论
  comments = node.xpath('.//i')[1].text
  items = {
    "username" : username,
    "content" : content,
    "zan" : zan,
    "comments" : comments
  }
  with open("qiushi.json", "a") as f:
    f.write(json.dumps(items, ensure_ascii=False).encode("utf-8") + "
")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python psutil模块简单使用实例
Apr 28 Python
利用Python获取操作系统信息实例
Sep 02 Python
玩转python selenium鼠标键盘操作(ActionChains)
Apr 12 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
浅谈Python爬虫基本套路
Mar 25 Python
详解python中的hashlib模块的使用
Apr 22 Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 Python
Python中如何处理常见报错
Jan 18 Python
python 实现图像快速替换某种颜色
Jun 04 #Python
python下对hsv颜色空间进行量化操作
Jun 04 #Python
Python-opencv实现红绿两色识别操作
Jun 04 #Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 #Python
Python使用plt.boxplot() 参数绘制箱线图
Jun 04 #Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 #Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 #Python
You might like
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
php发送邮件的问题详解
2015/06/22 PHP
PHP可变函数学习小结
2015/11/29 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
php微信支付接口开发程序
2016/08/02 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
select组合框option的捕捉实例代码
2008/09/30 Javascript
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
详细分析JavaScript函数定义
2015/07/16 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
python批量同步web服务器代码核心程序
2014/09/01 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
基于matplotlib xticks用法详解
2020/04/16 Python
北京申奥口号
2014/06/19 职场文书
个人借款协议书范本
2014/11/17 职场文书
酒店人事主管岗位职责
2015/04/11 职场文书
大队委员竞选稿
2015/11/20 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB