前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1、爬取数据通过数据库存储

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

作者头像
不温卜火
发布2020-10-28 16:35:30
6280
发布2020-10-28 16:35:30
举报
文章被收录于专栏:不温卜火不温卜火

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

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

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

一、准备阶段

1、分析网页结构

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

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

代码语言:javascript
复制
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)
# 获得国内累计所有数据
  • 下图为所获得的所有数据
3
3

3、创建并完善数据库

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

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

二、完整代码实现

代码语言:javascript
复制
# 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()

三、保存成功

8
8

  本次的分享就到这里了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、通过数据库的方式存储疫情数据
  • 一、准备阶段
    • 1、分析网页结构
      • 2、发送请求并获取Json数据
        • 3、创建并完善数据库
        • 二、完整代码实现
        • 三、保存成功
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档