Python 爬虫学习笔记(七(2))JsonPath解析+实战

一、jsonpath

在PyCharm pip install jsonpath库

jsonpath只能解析本地文件,和xpath不同

基本语法如下图,和xpath对应记忆
在这里插入图片描述

以解析下面的json文件为例,存着一些书还有一辆自行车

{ "store": {
  "book": [
    {
      "category": "修真",
      "author": "六道",
      "title": "坏蛋是怎样炼成的",
      "price": 8.95
    },
    {
      "category": "修真",
      "author": "天蚕土豆",
      "title": "斗破苍穹",
      "price": 12.99
    },
    {
      "category": "修真",
      "author": "唐家三少",
      "title": "斗罗大陆",
      "isbn": "0-553-21311-3",
      "price": 18.99
    },
    {
      "category": "修真",
      "author": "南派三叔",
      "title": "星辰变",
      "isbn": "0-395-19395-8",
      "price": 22.99
    }
  ],
  "bicycle": 
    {
      "color": "黑色",
      "price": 19.95
    }
  }
}

先打开json文件,将其反序列化

import json

obj = json.load(open('json_path_解析.json', 'r', encoding='utf-8'))
  1. 书店所有书的作者
# 书店所有书的作者
author_list = jsonpath.jsonpath(obj, '$.store.book[*].author')
  1. 所有的作者
# 所有的作者
author_list = jsonpath.jsonpath(obj, '$..author')
  1. store的所有元素,所有的books和bicycle
# store的所有元素,所有的books和bicycle
store_list = jsonpath.jsonpath(obj, '$.store.')
  1. store里面所有东西的price
# store里面所有东西的price
price_list = jsonpath.jsonpath(obj, '$.store..price')
  1. 第n本书,第n-m本书
# 第三本书
book = jsonpath.jsonpath(obj, '$.store..book[2]')

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

# 前面的两本书(两个方法)
book_list = jsonpath.jsonpath(obj, '$.store..book[0,1]')
book_list = jsonpath.jsonpath(obj, '$.store..book[:2]')
  1. 条件过滤:所有的包含isbn的书 / 价格低于10的书
# 所有的包含isbn的书
book_list = jsonpath.jsonpath(obj, '$.store..book[?(@.isbn)]')

# 价格低于10的书
book_list = jsonpath.jsonpath(obj, '$.store..book[?(@.price<10)]')

总结如下图,参考博客JSONPath-简单入门
在这里插入图片描述

二、jsonpath实战

解析淘票票网站,获取地区名单
在这里插入图片描述
直接访问url获取不到内容,说明做了反爬

定制请求头后,打印数据发现结果前面有一个jsonp108,我们需要的是里面的内容,所以过程中还需要做一个简单的切割。
在这里插入图片描述
完整代码:

import urllib.request
import jsonpath
import json

url = 'https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1647574620570_107&jsoncallback=jsonp108&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/98.0.4758.102 Safari/537.36 ",
    'referer': 'https://dianying.taobao.com/'
}

request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')
content = content.split('(')[1].split(')')[0]

# jsonpath只能解析本地文件,所以先存入文件
with open('taopiaopiao.json', 'w', encoding='utf-8') as f:
    f.write(content)

# json.load参数必须是一个文件
obj = json.load(open('taopiaopiao.json', 'r', encoding='utf-8'))

result = jsonpath.jsonpath(obj, '$.returnValue..regionName')

print(result)

总结

  1. jsonpath只能解析本地文件
  2. 条件过滤要用?(),例如book[?(@.price<10)]
  3. [@.length-1]代表最后一个元素 [*]代表所有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫兮如风i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值