爬虫解析-jsonpath (六)

jsonpath只能解析本地文件

jsonpath的使用:

复制代码
    obj = json.load(open('.json文件','r',encoding='utf-8'))
    place_name = jsonpath.jsonpath(obj, 'json语法')

目录

1.安装jsonpath

2.Xpath和jsonpath的语法对比

练习:使用jsonpath解析JSON文件

3.使用jsonpath抓取淘票票中的城市名称

参考


应用场景

打开检查中的网络,当鼠标悬浮在"深圳"这个位置上时,就会出现一个下拉列表,我门点击左侧新出现的名称后,从预览中可以看到与上面对应的所有的城市名称,我们就可以用jsonpath把这些城市都爬下来。

1.安装jsonpath

pip install jsonpath

2.Xpath和jsonpath的语法对比

练习:使用jsonpath解析JSON文件

JSON文件

python 复制代码
{ "store": {
    "book": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "author": "me",
      "color": "red",
      "price": 19.95
    }
  }
}

练习代码:

python 复制代码
import json
import jsonpath

obj = json.load(open('_073.json', 'r', encoding='utf-8'))
# 所有的作者
book_author = jsonpath.jsonpath(obj, '$.store.book.*.author')
print(book_author)

# 所有的作者
# author = jsonpath.jsonpath(obj,'$.store..author')
author = jsonpath.jsonpath(obj,'$..author')
print(author)

# store下的所有元素
element= jsonpath.jsonpath(obj,'$.store.*')
print(element)

# store里面所有的钱
price = jsonpath.jsonpath(obj, '$.store..price')
# price = jsonpath.jsonpath(obj, '$..price')
print(price)

# 第三个书
book = jsonpath.jsonpath(obj, '$.store.book[2].title')
print(book)

# 最后一本书
last_book = jsonpath.jsonpath(obj, '$.store.book[(@.length-1)].title')
print(last_book)

# 前两本书
first_book = jsonpath.jsonpath(obj, '$.store.book[:2].title')
print(first_book)

# 过滤出所有包含编号的书
# 条件过滤需要在()的前面添加一个"?"
id_book = jsonpath.jsonpath(obj, '$..book[?(@.isbn)]')
print(id_book)

# 哪本书超过了十块钱
top_price = jsonpath.jsonpath(obj, '$..book[?(@.price>10)]')
print(top_price)

3.使用jsonpath抓取淘票票中的城市名称

获取我们所需要的JSON数据,并保存为JSON格式。

这里需要注意的就是header的问题,选择合适的请求头极为重要。

python 复制代码
# 获取网页的源码
url = 'https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1699438000391_108&jsoncallback=jsonp109&action=cityAction&n_s=new&event_submit_doGetAllRegion=true'
headers = {
        # 带 ":" 的请求头不好使
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
        "Cokkie":"cna=78fBGrbzhCMCAXjATRb+saw5; t=e7c798fa12372a57ee31f10dfd51cd4e; cookie2=1d03be736b566af7ea39001ed7fa3c8f; v=0; _tb_token_=e3b433bbbe03e; xlly_s=1; tfstk=dmCXbdYCzmmjr9JtgSaPVwh_85d_8iNUlVTO-NhqWIdv55sN4q7V7sWWWGSuSrAVWhs143b2Ql4mWTscJKS1SrY9XGI6btyzTZbDsCEFfWPFovp26kRTr2yhoCATY4lTLW_cYs2DvGBZP7NTiaZSwbGUKa3xooujl_T8jHQjTfTPNEgMAZK7jlXwdX-QYtDsPpc6PHz7PADGFn8r6; l=fBLfzOEPPRd-YECUBO5Bnurza77T5IRb41PzaNbMiIEGa6KCtFaihNCTsYuBSdtjgTCcBetrWDM-1dLHR3xg5c0c0KDtBa2K3xvtaQtJe; isg=BKamDko1_3qxi6vekFBO7lel9xwoh-pB-d4dQ5BPeUmkE0Yt-BaVUc7taw-fvOJZ",
        "Referer":"https://dianying.taobao.com/index.htm?n_s=new"
}
# 请求对象定制
request = urllib.request.Request(url, headers=headers)
# 模拟客户端向服务器发送请求
response = urllib.request.urlopen(request)
# 获取网页源码
content = response.read().decode('utf-8')
with open('_074.json','w',encoding='utf-8') as file:
    file.write(content)

然后我们就开始解析JSON文件

保存之后我们可以看到,前面有个json109()的头,我们把这一部分删除就可以了。

或者对保存JSON文件前对content进行操作

python 复制代码
content = content.split('(')[1].split(')')[0]

开始解析JSON文件。

python 复制代码
import json
import jsonpath
obj = json.load(open('_074.json','r',encoding='utf-8'))
place_name = jsonpath.jsonpath(obj, '$..regionName')
print(place_name)

用好了JSON解析数据真的太方便了。

对比一下使用字典的方式提取name,需要嵌套两层循环。

python 复制代码
import json
obj = json.load(open('_074.json','r',encoding='utf-8'))
name = []
for key, value in obj['returnValue'].items():
    temp = obj['returnValue'][key]
    for i in temp:
        name.append(i["regionName"])
print(name)

参考

尚硅谷Python爬虫教程小白零基础速通(含python基础+爬虫案例)

相关推荐
陈随易几秒前
MoonBit助力前端开发,加密&性能两不误,斐波那契测试提高3-4倍
前端·后端·程序员
wfsm1 分钟前
spring事件使用
java·后端·spring
小飞悟7 分钟前
你以为 React 的事件很简单?错了,它暗藏玄机!
前端·javascript·面试
中微子14 分钟前
JavaScript 事件机制:捕获、冒泡与事件委托详解
前端·javascript
微风粼粼19 分钟前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
缘来是庄23 分钟前
设计模式之中介者模式
java·设计模式·中介者模式
Whoisshutiao30 分钟前
网安-XSS-pikachu
前端·安全·网络安全
惊鸿28736 分钟前
Taro3+小程序Canvas动态生成海报和二维码分享到朋友圈
前端
做梦都在学习前端43 分钟前
发布一个monaco-editor 汉化包
前端·npm·vite
rebel1 小时前
若依框架整合 CXF 实现 WebService 改造流程(后端)
java·后端