爬虫第二章:jsonjsonpathcsv写入

发布时间:2026/10/12 5:29:50
爬虫第二章:jsonjsonpathcsv写入 1. json模块1.1、什么是jsonJSON(Java Script Object NotationJS对象简谱采用完全独立于编程语言的文本格式来存储和表示数据。具有简洁和清晰的层次结构易于阅读和编写同时易于机器解析和生成并有效地提升网络传输效率。json1{key1:value1}json2{key1:[{key2:value2},{key3:value3}]}#这两种都是json格式其中的引号必须为双引号。1.2、json模块的使用json模块是python的内置模块需要使用直接import json即可。常用的json模块方法有json.dumps()、json.dump()、json.loads()、json.load()四种。1.2.1、json.dumps()与json.dump()功能将python对象转换为json字符串。但是json.dump()是操作文件对象的importjson#定义一个字典dict1{test1:value1,test2:{key1:[测试,测试2,测试3]}}#将内容写入到文件中。但是字典不能直接写入文件就需要用到json.dumps()将其转换为一个json字符串withopen(test1.json,w,encodingutf-8)asf:#ensure_asciiFalse:禁止编码#indent:缩进f.write(json.dumps(dict1,ensure_asciiFalse,indent4))#json.dumps()写法json.dump(dict1,f,ensure_asciiFalse,indent4)#json.dump()写法。json.dump()第一个参数为数据保存的对象第二个参数为文件对象f.close()1.2.2、json.loads()与json.load()功能与json.dumps()和json.dump()相反将json字符串解码为python的数据类型的数据。其中json.load()是操作文件对象的。importjsonwithopen(test1.json,r,encodingutf-8)asf:linef.read()print(type(json.loads(line)))print(json.loads(line))#json.loads()将line作为操作对象withopen(test1.json,r,encodingutf-8)asf:print(json.load(f))#json.load()将f直接作为操作对象2、jsonpath模块2.1、jsonpath模块的介绍与安装jsonpath模块是一种用于解析json结构的数据解析模块可以从json中抽取指定的信息。需要通过pip install -i 镜像源 jsonpath命令来安装。2.2、jsonpath基本语法与使用方法2.2.1、基本语法语法描述$根节点(每个规则的第一个字符都是$)当前节点.node或[node]访问下级节点[index]数组下标访问支持从0开始*通配符匹配所有下级节点..递归通配符匹配所有子节点(expr)动态表达式?(boolean expr)过滤条件2.2.2、基础使用方法importjsonpath#准备数据dic{name:张三,多余:{多余1:1}}#通过字典取值#print(dic[多余][多余1])#数据解析模块 jsonpath.jsonpath(参数1,参数2)#第一个jsonpath为模块名第二个jsonpath()为库里的方法。#参数1对谁进行数据解析#参数2jsonpath取值语法#返回的数据类型为列表namejsonpath.jsonpath(dic,$..多余1)print(name)2.3、jsonpath使用方法示例2.3.1、示例数据{store:{book:[{category:classics,author:施耐庵,title:水浒传,price:58.00},{category:classics,author:罗贯中,title:三国演义,price:68.00},{category:classics,author:吴承恩,title:西游记,isbn:978-7-5327-6543-2,price:78.00},{category:classics,author:曹雪芹,title:红楼梦,isbn:978-7-5302-1843-4,price:88.00}],bicycle:{color:red,price:19.95}}}2.3.2、数据提取提取所有书籍的作者# $.store 从store开始 .book[*] 匹配book下所有的子节点 .author 作者authorsjsonpath.jsonpath(data,$.store.book[*].author)print(authors)提取第二本书的书名# .book[1] 索引从0开始second_book_namejsonpath.jsonpath(data,$.store.book[1].title)print(second_book_name)提取所有作者# $..author 从根节点开始匹配所有的author节点的内容all_authorsjsonpath.jsonpath(data,$..author)print(all_authors)提取store下的所有子节点# $.store 匹配.store节点 .*匹配所有子节点all_store_childrenjsonpath.jsonpath(data,$.store.*)print(all_store_children)提取所有价格字段# $.store 匹配.store节点 ..price 递归匹配store下的所有节点中的priceall_pricejsonpath.jsonpath(data,$.store..price)print(all_price)提取第三本书# $.store.book[2] 匹配第三本书内的所有节点third_bookjsonpath.jsonpath(data,$.store.book[2])print(third_book)提取最后一本书# $..book 递归匹配到book节点 [?(.length-1)] 过滤条件为当前节点下符合length-1的节点last_bookjsonpath.jsonpath(data,$..book[?(.length-1)])print(last_book)提取含isbn的书#[?(.isbn)] 过滤条件为当前节点下包含isbn的子节点book_with_isbnjsonpath.jsonpath(data,$..book[?(.isbn)])print(book_with_isbn)企图价格小于60的书# [?(.price60)] 过滤条件为价格低于60price_less_than_60jsonpath.jsonpath(data,$..book[?(.price60)])print(price_less_than_60)递归匹配所有子节点# $..* 从根节点开始递归匹配所有的子节点all_nodesjsonpath.jsonpath(data,$..*)print(all_nodes)2.4、jsonpath案例目标http://220.168.30.70:7004/page/notice/more.jsp首先确定明确目标URL根据你访问页面时看到的公告中随便选择一个内容来搜索选择对应的数据包并请求数据importjsonpathimportrequests# 获取明确URLurlhttp://220.168.30.70:7004/mvc/getNoticeList4Web.do# 伪造浏览器身份headers{user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/154.0.0.0 Safari/537.36}# 载荷参数data{pType:,prcmPrjName:,prcmItemCode:,prcmOrgName:,startDate:2026-01-01,endDate:2026-10-11,prcmPlanNo:,page:1,pageSize:18,}# 发起请求并将请求到的数据赋值给变量responserequests.post(url,headersheaders,datadata)# 将响应内容转换为json数据dataresponse.json()# 使用jsonpath模块获取需要的数据NOTICE_TITLEjsonpath.jsonpath(data,$..NOTICE_TITLE)ORG_NAMEjsonpath.jsonpath(data,$..ORG_NAME)# zip整合将分开的数据整合到一起# 前置条件数据量必须保持一致lis[]# 赋值一个空列表用来保存整合后的数据foriinzip(NOTICE_TITLE,ORG_NAME):dic{合同公告:i[0],对应学院:i[1],}lis.append(dic)# 将数据保存到文件中withopen(采购网.json,w,encodingutf-8)asf:f.write(json.dumps(lis,ensure_asciiFalse,indent4))3、CSV3.1、什么是CSV文件CSV文件是一种简单的文件格式全名叫“逗号分隔值”。用逗号来吧文件中的数据隔开。每一行代表一条数据每一列用逗号隔开。3.2、CSV写入数据3.2.1、csv.writer 写入数据# 导入模块csv模块为内置模块不需要单独下载importcsv# 准备数据data[[姓名,年龄,城市],# 表头[小明,10,北京],# 第一行数据[小红,12,上海]# 第二行数据]# 打开文件写入内容 newline 消除空行withopen(学生.csv,w,encodingutf-8,newline)asfile:writercsv.writer(file)#创建一个写入器writer.writerows(data)#写入多行数据3.2.2、csv.DictWriter写入数据# 导入csv内置模块importcsv# 定义表头fieldnames[姓名,年龄,性别]# 定义要写入的数据 使用csv.DictWriter方法定义的表头必须与字典的键名对应data[{姓名:张三,年龄:25,性别:男},{姓名:李四,年龄:30,性别:女}]# 打开csv文件进行写入withopen(学生.csv,w,encodingutf-8,newline)asfile:#创建CSV字典写入器对象csv_dict_writercsv.DictWriter(file,fieldnamesfieldnames)#写入表头数据csv_dict_writer.writeheader()#写入数据csv_dict_writer.writerows(data)3.3、csv读取数据3.3.1、csv.reader读取# 导入csv模块importcsv# 打开文件进行读取withopen(学生.csv,r,encodingutf-8)asf:#创建读取器对象csv_readercsv.reader(f,delimiter,)#读取表头 next()函数读取文件第一行即表头headernext(csv_reader)print(f表头:{header})# 逐行读取数据forrowincsv_reader:print(row)3.3.2、csv.DictReader读取将每一行数据转换为字典并且将表头作为字典的键。# 导入csv文件importcsv# 打开文件读取内容withopen(学生.csv,r,encodingutf-8)asf:#创建csv读取器使用csv.DictReader方法csv_dict_readercsv.DictReader(f)#循环读取内容forrowincsv_dict_reader:print(row)

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询