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

   日期:2020-09-28     浏览:103    评论:0    
核心提示:一、实验概述:【实验目的】初步掌握数据采集的方法;初步掌握利用爬虫爬取网络数据的方法掌握不同数据格式之间的转换方法;【实施环境】(使用的材料、设备、软件) Linux或Windows操作系统环境,MySql数据库,Python或其他高级语言二、实验内容第1题 爬取网络数据【实验要求】爬取酷狗音乐网站(https://www.kugou.com/)上榜单前500名的歌曲名称,演唱者,歌名和歌曲时长将爬取的数据以JSon格式文件保存。读取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=(',', ': '))))

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服