3.2月23日 项目:北京菜品市场数据存储(json形式)
上节课程中,通过程序爬取了“新发地”市场数据。
本课解决存储问题。
- 代码不够优化
- 获取到的数据没存储
- 数据不利于查看
数据存储
数据不存储,后续没法用。
较为常见的形式
-
json形式
-
excel形式
-
mysql数据库形式
-
hadoop分布式存储
以上各有特点。
json形式
简单,适用于数据量小的情况。34万这个体量的数据是存不进去的(效率极低)。同时也不能直接分析。
excel形式
不难,适用于数据量小的情况。34万这个体量的数据是存不进去的。能直接分析,但数据量大的话,基本卡死。
mysql数据库形式
一般,适用于数据量大的情况。34万这个体量的数据是能存的,但是后续“取用”效率不能令人满意。同时也不能直接分析。
hadoop分布式存储
难,适用于数据量极大的情况。配合其他能做到分析。
json介绍
极为常用,极为重要
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于将结构化数据从一个程序传输到另一个程序。JSON数据以键/值对的形式组织,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象或者null。JSON格式的数据易于阅读和编写,并且易于解析和生成。
JSON格式的案例
键/值
key vlaue
- 简单对象:
{
"name": "Alice",
"age": 25,
"city": "London"
}
-
用python取其中city的值
import json # JSON字符串 json_str = ''' { "name": "Alice", "age": 25, "city": "London" } ''' # 解析JSON字符串 data = json.loads(json_str) # 取出city的值 city_value = data["city"] print(city_value)
- 嵌套对象:
{
"name": "Bob",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York",
"zipcode": "10001"
}
}
-
用python取其中city的值
import json # JSON字符串 json_str = ''' { "name": "Bob", "age": 30, "address": { "street": "123 Main St", "city": "New York", "zipcode": "10001" } } ''' # 解析JSON字符串 data = json.loads(json_str) # 取出address中的city的值 city_value = data["address"]["city"] print(city_value)
- 对象+数组:
[
{
"name": "John",
"age": 35
},
{
"name": "Emily",
"age": 28
},
{
"name": "Michael",
"age": 40
}
]
-
用python取第二个元素的age的值
import json # JSON字符串 json_str = ''' [ { "name": "John", "age": 35 }, { "name": "Emily", "age": 28 }, { "name": "Michael", "age": 40 } ] ''' # 解析JSON字符串 data = json.loads(json_str) # 取出第二个元素的age second_person_age = data[1]["age"] print(second_person_age)
- 复杂嵌套结构:
{
"name": "David",
"age": 45,
"contacts": [
{
"type": "email",
"value": "david@example.com"
},
{
"type": "phone",
"value": "123-456-7890"
}
]
}
python对json文件的处理
读取文件
假设有一个名为 data.json 的JSON文件,内容如下:
{
"name": "Alice",
"age": 25,
"city": "London"
}
用python读取文件并获取其中city的值
import json
# 打开JSON文件
with open('data.json', 'r') as file:
# 读取文件内容并解析JSON
data = json.load(file)
# 打印解析后的JSON数据
city_value = data["city"]
print(city_value)
保存文件
现在,使用Python代码将内容保存为名为 output.json 的JSON文件:
import json
# 要保存的数据
data = {
"name": "Alice",
"age": 25,
"city": "London"
}
# 打开文件并将数据写入
with open('output.json', 'w',encoding='utf-8') as file:
json.dump(data, file,ensure_ascii=False, indent=4)
项目:北京菜品市场数据存储
项目需求
考虑到实际情况,只获取前1000条数据,并存储到多个json文件中
过程
最终代码:
import requests
import time
import json
url = "http://www.xinfadi.com.cn/getPriceData.html"
headers = {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"x-requested-with": "XMLHttpRequest",
}
# 循环进行请求并保存结果
for i in range(1, 400):
data = {
"limit": "300",
"current": str(i),
"pubDateStartTime": "",
"pubDateEndTime": "",
"prodPcatid": "",
"prodCatid": "",
"prodName": "",
}
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
json_data = response.json()
if len(json_data['list']) != 0:
filename = "./2.2 json文件/" + str(i) + ".数据.json"
# 将JSON数据写入文件
with open(filename, 'w', encoding='utf-8') as file:
file.write(json.dumps(json_data, ensure_ascii=False, indent=4))
print(f"数据已保存到文件: {filename}")
time.sleep(1)
else:
break
else:
print("出现错误啦!错误代码:", response.status_code)
break
print("所有数据请求完毕。")
将结果存为excel文件
import json
from openpyxl import Workbook
file_list=[]
for i in range(1,400):
file_list.append("./2.2 json文件/"+str(i)+".数据.json")
print(file_list)
# 创建一个工作簿对象
wb = Workbook()
# 激活工作表
ws = wb.active
header = ['菜名', '类别', '均价', '规格信息', '单位信息', '更新时间']
ws.append(header)
for filename in file_list:
with open(filename, 'r',encoding='utf-8') as json_file:
data = json.load(json_file)
for i in range(0,len(data['list'])):
prod_item = []
#菜名
prodName=data['list'][i]['prodName']
prod_item.append(prodName)
#类别
prodCat=data['list'][i]['prodCat']
prod_item.append(prodCat)
#均价
price=data['list'][i]['avgPrice']
prod_item.append(price)
#规格信息
specInfo=data['list'][i]['specInfo']
prod_item.append(specInfo)
#单位信息
unitInfo=data['list'][i]['unitInfo']
prod_item.append(unitInfo)
#更新时间
pubDate=data['list'][i]['pubDate']
prod_item.append(pubDate)
print(prod_item)
ws.append(prod_item)
wb.save('./2.2 json文件/data.xlsx')
不足之处:
存成了多个json文件,并不理想
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 现代职校董良
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果