上节课程中,通过程序爬取了“新发地”市场数据。
本课解决存储问题。

  1. 代码不够优化
  2. 获取到的数据没存储
  3. 数据不利于查看

数据存储

数据不存储,后续没法用。

较为常见的形式

  • json形式

  • excel形式

  • mysql数据库形式

  • hadoop分布式存储

以上各有特点。

json形式

简单,适用于数据量小的情况。34万这个体量的数据是存不进去的(效率极低)。同时也不能直接分析。

excel形式

不难,适用于数据量小的情况。34万这个体量的数据是存不进去的。能直接分析,但数据量大的话,基本卡死。

mysql数据库形式

一般,适用于数据量大的情况。34万这个体量的数据是能存的,但是后续“取用”效率不能令人满意。同时也不能直接分析。

hadoop分布式存储

难,适用于数据量极大的情况。配合其他能做到分析。

json介绍

极为常用,极为重要

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于将结构化数据从一个程序传输到另一个程序。JSON数据以键/值对的形式组织,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象或者null。JSON格式的数据易于阅读和编写,并且易于解析和生成。

JSON格式的案例

键/值

key vlaue

  1. 简单对象:
{
  "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)
    
    
  1. 嵌套对象:
{
  "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)
    
    
  1. 对象+数组:
[
  {
    "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)
    
    
  1. 复杂嵌套结构:
{
  "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文件,并不理想