数据导入与预处理实验二---json格式文件转换

一、实验概述:
【实验目的】

  1. 初步掌握数据采集的方法;
  2. 初步掌握利用爬虫爬取网络数据的方法
  3. 掌握不同数据格式之间的转换方法;

【实施环境】(使用的材料、设备、软件) Linux或Windows操作系统环境,MySql数据库,Python或其他高级语言

二、实验内容
第1题 爬取网络数据
【实验要求】

  1. 爬取酷狗音乐网站(https://www.kugou.com/)上榜单前500名的歌曲名称,演唱者,歌名和歌曲时长
  2. 将爬取的数据以JSon格式文件保存。
  3. 读取JSON格式任意数据,检验文件格式是否正确。

【实验过程】(步骤、记录、数据、程序等)
请提供操作步骤及界面截图证明。

from bs4 import BeautifulSoup
import requests
import time
import re
import json
import demjson
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}

nameList = []
singerList = []
timeList = []
song = []
total = []
keys = ['songName','singer','time']

def get_info(url, file):
    res = requests.get(url, headers=headers)
    res.encoding = file.encoding  # 同样读取和写入的编码格式
    soup = BeautifulSoup(res.text, 'lxml')
    ranks = soup.select('span.pc_temp_num')
    titles = soup.select('a.pc_temp_songname')
    times = soup.select('span.pc_temp_time')
    #jsonData = []
    for rank, title, time in zip(ranks, titles, times):
        data = {
            #'rank': rank.get_text().strip(),
            'title': title.get_text().strip(),
            'time': time.get_text().strip()
        }
        #print(data)

        singer, songName = data['title'].split(' - ')
        nameList.append(songName)
        singerList.append(singer)
        timeList.append(data['time'])
        #print(nameList)
        #print(singerList)
        #print(data['time'])
        #print(timeList)
        #print(singer, songName)
        #print(jsonData)

def output(url, file):
    songInfo = []
    for i in range(0,len(nameList)):
        #print(nameList[i])
        #print(singerList[i])
        #print(timeList[i])
        songInfo.append(nameList[i])
        songInfo.append(singerList[i])
        songInfo.append(timeList[i])
    #print(songInfo)
    for i in range(0, len(songInfo), 3):
        temp = songInfo[i:i + 3]
        song.append(temp)
    #print(len(song))
    file.write('{\n"songInfo":[\n')
    for i in range(0,len(song)):
        d = dict(zip(keys, song[i]))
        #print(d)
        file.write(json.dumps(d,ensure_ascii=False,indent=4,separators=(',', ': ')))
        if i != len(song)-1:
            file.write(',')
    file.write('\n]\n}')
def get_website_encoding(url):  # 一般每个网站自己的网页编码都是一致的,所以只需要搜索一次主页确定
    res = requests.get(url, headers=headers)
    charset = re.search("charset=(.*?)>", res.text)
    if charset is not None:
        blocked = ['\'', ' ', '\"', '/']
        filter = [c for c in charset.group(1) if c not in blocked]
        return ''.join(filter)  # 修改res编码格式为源网页的格式,防止出现乱码
    else:
        return res.encoding  # 没有找到编码格式,返回res的默认编码

if __name__ == '__main__':
    encoding = get_website_encoding('http://www.kugou.com')
    #print(encoding)
    urls = ['http://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range(1, 23)]
with open(r'.\kugou_500.json', 'w+', encoding=encoding) as f:
    #f.write("歌手         歌名          长度\n")
    for url in urls:
        get_info(url, f)
        time.sleep(1) #缓冲一秒,防止请求频率过快
    output(url,f)

得到的json文件
在这里插入图片描述
打开使用json.load打开文件,成功输出后代表文件格式正确

import json

with open("kugou_500.json",'r',encoding='UTF-8') as f:
    new_dict = json.load(f)
    print(new_dict)

在这里插入图片描述

第2题 编程生成CSV文件并转换成JSon格式
【实验要求】

  1. 编程生成CSV格式文件。文件内容如下: 姓名,性别,籍贯,系别 张迪,男,重庆,计算机系 兰博,男,江苏,通信工程系 黄飞,男,四川,物联网系 邓玉春,女,陕西,计算机系 周丽,女,天津,艺术系 李云,女,上海,外语系
  2. 将上述CSV格式文件转换成JSon格式,并查询文件中所有女生的信息。

【实验过程】(步骤、记录、数据、程序等)
请提供操作步骤及界面截图证明。

import csv
#创建文件对象
f = open("question02.csv","w",encoding="utf-8")
#构建csv写入对象
csv_writer = csv.writer(f)
#构建列表头
csv_writer.writerow(["姓名","性别","籍贯","系别"])
#写入csv文件内容
csv_writer.writerow(["张迪","男","重庆","计算机系"])
csv_writer.writerow(["兰博","男","江苏","通信工程系"])
csv_writer.writerow(["黄飞","男","四川","物联网系"])
csv_writer.writerow(["周丽","女","天津","艺术系"])
csv_writer.writerow(["李芸","女","上海","外语系"])

在这里插入图片描述
转换为json格式

import csv
import json
csvFile = open("question02.csv","r",encoding="utf-8")
jsonFile = open("question02.json","w",encoding="utf-8")

fieldNames = {"姓名","性别","籍贯","系别"}
reader = csv.DictReader(csvFile)
i = 1
jsonFile.write('{\n"personInfo":[\n')
for row in reader:
    print(row)
    jsonFile.write(json.dumps(row,ensure_ascii=False,indent=4))
    if i != 5:
        jsonFile.write(',')
        i = i+1
jsonFile.write('\n]\n}')

在这里插入图片描述

import json
with open("question02.json","r",encoding="utf-8") as f:
    data = json.load(f)
    #print(data['personInfo'][1]['性别'])
    #print(type(data))
    for i in range(0,5):
        if data['personInfo'][i]['性别'] == '女':
            print(data['personInfo'][i])

在这里插入图片描述

第3题. XML格式文件与JSon的转换
【实验内容集要求】
(1) 读取以下XML格式的文件,内容如下: <?xml
version=”1.0” encoding=”gb2312”> <图书> <书名>红楼梦</书名> <作者>曹雪芹</作者><主要内容>描述贾宝玉和林黛玉的爱情故事</主要内容> <出版社>人民文学出版社</出版社> </图书>
(2) 将以上XML格式文件转换成JSon格式。

【实验过程】(步骤、记录、数据、程序等)
请提供相应代码及程序运行界面截图。

新建xml文件
在这里插入图片描述

import xml.dom.minidom
import xmltodict
import json
#打开xml文档
#dom = xml.dom.minidom.parse('question_03.xml')
#得到文档元素对象
#root = dom.documentElement
#bb = root.getElementsByTagName('书名')
#print(bb[0].firstChild.data)

#获取xml文件
file = open("question_03.xml","r",encoding="utf-8")
#读取文件内容
xmlStr = file.read()
#print(xmlStr)
jsonStr = xmltodict.parse(xmlStr)
#print(jsonStr)
with open("question03JSON.json","w",encoding="utf-8") as f:
    f.write(str(json.dumps(jsonStr,ensure_ascii=False,indent=4,separators=(',', ': '))))

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值