1、爬取数据通过数据库存储

来一篇使用数据库存储的教学案例吧

1、通过数据库的方式存储疫情数据

  • 一、准备阶段
    • 1、分析网页结构
    • 2、发送请求并获取Json数据
    • 3、创建并完善数据库
  • 二、完整代码实现
  • 三、保存成功


同时推荐前面作者另外两个系列文章:

  • 快速入门之Tableau系列:快速入门之Tableau
  • 快速入门之爬虫系列:快速入门之爬虫

一、准备阶段

1、分析网页结构

  • 我们准备要爬取的网站为:https://news.qq.com/zt2020/page/feiyan.htm#/global

2、发送请求并获取Json数据

通过分析url地址、请求方法、参数及响应格式,可以获取Json数据,注意url需要增加一个时间戳。

import time, json, requests
# 抓取腾讯疫情实时json数据
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery3410030722131703015076_1585221499806&_=1585221499807'
response = requests.get(url=url)
# 获得了返回的json串,其中 得到的数据不是正式的json数据,需要用切片切出我们需要的部分
data = json.loads(response.text[43:-1])
# data 中的目标数据,并非是一个字典,而是一个长得像字典的字符串---JSON串   相当于JSON中嵌套了一个JSON
data = json.loads(data['data'])
print(data)
# 获得国内累计所有数据

  • 下图为所获得的所有数据
    1、爬取数据通过数据库存储_第1张图片

3、创建并完善数据库

数据库我选用的是mysql+SQLyog
下图为所要创建的表以及基本参数:
我们总共需要创建四个表

1、爬取数据通过数据库存储_第2张图片
1、爬取数据通过数据库存储_第3张图片
1、爬取数据通过数据库存储_第4张图片
1、爬取数据通过数据库存储_第5张图片

  • 好了,以上即为我们需要提前准备的部分。

二、完整代码实现

# encoding: utf-8
# getOnsInfo?name=dease_h5:
# 国内累计数据  国内当日新增数据   各个省的当日信息和累计信息  各个市的当日信息和累计信息
import requests,json,pymysql
def get_database():
    conn = pymysql.connect(host='localhost',
                           user='root',
                           password='199712',
                           db='yiqing',
                           charset='utf8')
    # 创建游标
    cursor = conn.cursor()
    return conn,cursor

def close(conn,cursor):
    cursor.close()
    conn.close()

# 国内累计数据
def china_total_data():
    #发送请求:
    url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery3410030722131703015076_1585221499806&_=1585221499807'
    response=requests.get(url=url)
    # 获得了返回的json串,其中 得到的数据不是正式的json数据,需要用切片切出我们需要的部分
    data=json.loads(response.text[43:-1])
    # data 中的目标数据,并非是一个字典,而是一个长得像字典的字符串---JSON串   相当于JSON中嵌套了一个JSON
    data = json.loads(data['data'])
    # print(data)
    # 获得国内累计所有数据
    total_data=data['chinaTotal']
    # 获得确诊数量
    confirm=total_data['confirm']
    # 获得治愈数量
    heal=total_data['heal']
    # 获得死亡数量
    dead=total_data['dead']
    # 获得疑似数量
    suspect=total_data['suspect']
    # ============================================数据处理完毕
    # 数据入库: ---在使用数据库之前,一定要先创建好库表
    conn,cursor=get_database()
    # 准备sql
    sql='insert into china_total(confirm,heal,dead,suspect) values(%s,%s,%s,%s)'
    # 执行sql
    cursor.execute(sql,args=[confirm,heal,dead,suspect])
    conn.commit()
    close(conn,cursor)

# 各个省累计数据
def provinces_total_data():
    # 发送请求:
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery3410030722131703015076_1585221499806&_=1585221499807'
    response = requests.get(url=url)
    # 获得了返回的json串,其中 得到的数据不是正式的json数据,需要用切片切出我们需要的部分
    data = json.loads(response.text[43:-1])
    # data 中的目标数据,并非是一个字典,而是一个长得像字典的字符串---JSON串   相当于JSON中嵌套了一个JSON
    data = json.loads(data['data'])
    # print(data)
    # 获得所有的省累计所有数据
    privinces_data = data['areaTree'][0]['children']
    for privince in privinces_data:
        privince_name=privince['name']
        total_data=privince['total']
        # 获得确诊数量
        confirm = total_data['confirm']
        # 获得治愈数量
        heal = total_data['heal']
        # 获得死亡数量
        dead = total_data['dead']
        # 获得疑似数量
        suspect = total_data['suspect']
        # ============================================数据处理完毕
        # 数据入库: ---在使用数据库之前,一定要先创建好库表
        conn, cursor = get_database()
        # 准备sql
        sql = 'insert into provinces_total(province_name,confirm,heal,dead,suspect) values(%s,%s,%s,%s,%s)'
        # 执行sql
        cursor.execute(sql, args=[privince_name,confirm, heal, dead, suspect])
        conn.commit()
    close(conn, cursor)

# 各个市累计数据
def cities_total_data():
    # 发送请求:
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=jQuery3410030722131703015076_1585221499806&_=1585221499807'
    response = requests.get(url=url)
    # 获得了返回的json串,其中 得到的数据不是正式的json数据,需要用切片切出我们需要的部分
    data = json.loads(response.text[43:-1])
    # data 中的目标数据,并非是一个字典,而是一个长得像字典的字符串---JSON串   相当于JSON中嵌套了一个JSON
    data = json.loads(data['data'])
    # print(data)
    # 获得所有的省累计所有数据
    p_total_data = data['areaTree'][0]['children']
    for province in p_total_data:
        # 获得省的名字
        province_name = province['name']
        for city in province['children']:
            #获得市的名字
            city_name=city['name']
            # 获得总数据
            total_data = city['total']
            # 获得确诊数量
            confirm = total_data['confirm']
            # 获得治愈数量
            heal = total_data['heal']
            # 获得死亡数量
            dead = total_data['dead']
            # 获得疑似数量
            suspect = total_data['suspect']
            # ============================================数据处理完毕
            # 数据入库: ---在使用数据库之前,一定要先创建好库表
            conn, cursor = get_database()
            # 准备sql
            sql = 'insert into cities_total(privince_name,city_name,confirm,heal,dead,suspect) values(%s,%s,%s,%s,%s,%s)'
            # 执行sql
            cursor.execute(sql, args=[province_name,city_name, confirm, heal, dead, suspect])
            conn.commit()
    close(conn, cursor)

# 国内历史日增数据
def china_history_daily_data():
    # 发送请求:
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_other&callback=jQuery34106126228069621358_1585225505936&_=1585225505937'
    response = requests.get(url=url)
    # print(response.text)
    # 获得了返回的json串,其中 得到的数据不是正式的json数据,需要用切片切出我们需要的部分
    data = json.loads(response.text[41:-1])
    # data 中的目标数据,并非是一个字典,而是一个长得像字典的字符串---JSON串   相当于JSON中嵌套了一个JSON
    data=json.loads(data['data'])
    # print(data)
    for daily_data in data['chinaDayList']:
        confirm=daily_data['confirm']
        suspect=daily_data['suspect']
        heal=daily_data['heal']
        dead=daily_data['dead']
        day_time=daily_data['date']
        # print(confirm,suspect,heal,dead,day_time)
        # 入库
        conn,cursor=get_database()
        sql='insert into china_history_add(confirm,suspect,heal,dead,day_time) values(%s,%s,%s,%s,%s)'
        cursor.execute(sql,args=[confirm,suspect,heal,dead,day_time])
        conn.commit()
    close(conn,cursor)


# 一键更新
def update():
    conn,cursor=get_database()
    l=['china_total','china_history_add','cities_total','provinces_total']
    for table in l:
        # 清空数据库
        sql='TRUNCATE table %s'%table
        cursor.execute(sql)
    conn.commit()
    close(conn, cursor)
    # 重新获取新数据
    china_total_data()
    china_history_daily_data()
    provinces_total_data()
    cities_total_data()

if __name__ == '__main__':
    china_total_data()
    provinces_total_data()
    cities_total_data()
    china_history_daily_data()
    update()

三、保存成功

1、爬取数据通过数据库存储_第6张图片

  本次的分享就到这里了,


11

   看 完 就 赞 , 养 成 习 惯 ! ! ! \color{#FF0000}{看完就赞,养成习惯!!!} ^ _ ^ ❤️ ❤️ ❤️
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

你可能感兴趣的:(COVID-19分析)