大部分情况下,我们可以通过网页跳转链接或JavaScript函数动态加载直接获取HTML网页内容。但是,个别网站会返回JSON结构数据,这时我们需要对JSON结构数据进行处理,从中解析和提取内容。
在大规模分布式爬虫程序中,我们可能会同时处理上万个网站。因此,找到一种便捷高效的JSON结构数据处理方式是十分必要的。
JsonPath是一种用于在JSON结构中定位和提取特定内容的查询语言,类似于XPath对XML文档的定位和提取功能。它让我们可以通过表达式配置的方式,从JSON数据中找到需要的内容。
JsonPath语法与XPath语法类似,因此,如果我们已经有了XPath表达式的编写经验,那么很快就可以掌握JsonPath表达式的语法规则。JsonPath的基础描述符如表2-5所示。
表2-5 JsonPath的基础描述符
接下来,我们通过一个简单的例子来演示如何使用JsonPath表达式从JSON结构数据中提取所需的内容。
假设网站接口请求返回的JSON结构数据如下:
{ "accessPath": null, "actionErrors": [], "actionMessages": [], "dataList": null, "dataMap": { "id": "20240312000000014551", "title": "文章标题", "tag": null, "content": "文章内容", "image": null, "url": null, "writeTime": "2024-03-12", "showcount": 851, "origin": null }, "errorMessages": [], "errors": {}, "fieldErrors": {}, "locale": "zh_CN", "maid": null, "maidentify": null, "message": null, "oldPath": null, "page": "1", "pmaid": null, "state": null, "texts": null, "total": "0", "totalpage": "1" }
我们需要编写程序来获取文章的标题和内容信息。
针对这个需求,我们可以通过JsonPath表达式来实现。具体实现思路如下:
import com.jayway.jsonpath.JsonPath; public class JsonPathExample { public static void main(String[] args) { // 利用JsonPath从上面的JSON结构数据中提取title和content String title = JsonPath.read(json, "$.dataMap.title"); Double content = JsonPath.read(json, "$.dataMap.content"); // 打印文章标题和内容 System.out.println("Title: " + title); System.out.println("Content: " + content); } }