zoukankan      html  css  js  c++  java
  • 爬取疫情动态并进行简单的可视化展示

    一、要求

    1.编程爬取每日最新的疫情统计数据

    2.将爬取结果导入数据库中

    3.将可视化结果与统计数据结合,实时显示当前最新数据

    二、思路

    1.利用python伪装成浏览器爬取数据(爬取地址:丁香园·丁香医生)

    2.将得到的代码块进行拆分,得到自己想要的数据值

    3.导入数据库(有了数据insert就行)

    三、遇到的问题

    1.一开始是想试着看Java可不可以实现,但是找了很久没有一个合适的demo

    2.python连接数据库方面

    3.怎么拆分数据块来得到自己想要的数据

    四、源代码

    from os import path
    import requests
    from bs4 import BeautifulSoup
    import json
    import pymysql
    import numpy as np
    import time
    #请求地址
    url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0'
    #为了避免反爬,伪装成浏览器:
    #创建头部信息
    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
    response =  requests.get(url,headers = headers)  #发送网络请求
    #print(response.content.decode('utf-8'))#以字节流形式打印网页源码
    content = response.content.decode('utf-8')
    #print(content)
    soup = BeautifulSoup(content, 'html.parser')#指定Beautiful的解析器为“html.parser”
    '''*find()
    返回的是第一个匹配的标签结果
    *find_all()
    返回的是所有匹配结果的列表'''
    listA = soup.find_all(name='script',attrs={"id":"getAreaStat"})
    #世界确诊
    listB = soup.find_all(name='script',attrs={"id":"getListByCountryTypeService2"})
    account = str(listA)#转化成字符串
    print(account)
    messages = account[52:-21]#截取从52到后边倒数21个
    print(messages)
    messages_json = json.loads(messages)#json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
    valuesList = []
    cityList = []
    con=len(messages_json)#Python len() 方法返回对象(字符、列表、元组等)长度或项目个数
    k=0
    for i in range(len(messages_json)):#从0到len
        k=k+1#time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))格式化当前时间
        value = (k,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),messages_json[i].get('provinceShortName'),None,messages_json[i].get('confirmedCount'),messages_json[i].get('suspectedCount'),messages_json[i].get('curedCount'),messages_json[i].get('deadCount'),messages_json[i].get('locationId'))
        valuesList.append(value)#进行添加到list中
        cityValue = messages_json[i].get('cities')
        for j in range(len(cityValue)):
            con=con+1
            cityValueList = (con,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),messages_json[i].get('provinceShortName'),cityValue[j].get('cityName'),cityValue[j].get('confirmedCount'),cityValue[j].get('suspectedCount'),cityValue[j].get('curedCount'),cityValue[j].get('deadCount'),cityValue[j].get('locationId'))
            cityList.append(cityValueList)
    #数据库的写入
    #打开数据库连接
    db = pymysql.connect("localhost", "root", "xp20010307..", "yiqing", charset='utf8')
    #使用此方法获取操作游标
    cursor = db.cursor()
    
    array = np.asarray(valuesList[0])
    sql_clean_province = "TRUNCATE TABLE info2"
    sql = "INSERT INTO info2 values (%s,%s,%s,%s,%s,%s,%s,%s,%s) "
    
    value_tuple = tuple(valuesList)
    cityTuple = tuple(cityList)
    
    try:
        cursor.execute(sql_clean_province)
        db.commit()
    except:
        '''    connection.rollback()
    该方法回滚自上一次调用 commit() 以来对数据库所做的更改'''
        print('执行失败,进入回调1')
        db.rollback()
    
    try:
        cursor.executemany(sql, value_tuple)
        db.commit()
    except:
        print('执行失败,进入回调3')
        db.rollback()
    
    try:
        cursor.executemany(sql,cityTuple)
        db.commit()
    except:
        print('执行失败,进入回调4')
        db.rollback()
    db.close()
    View Code
    日期 开始时间  结束时间 中断时间 净时间 活动 备注
    3.10 15:40 17:20 10 80 在网上学习使用Java做爬取  
    3.10 17:45 18.20 0 35 安装pycharm,找demo  
    3.10 18:30 18:55 0 25 学习一些关于数据库的知识  
    3.10 19:00 19:30 0 30 数据拆分,实现入库  
     日期  编号  类型  引入阶段  排除阶段  修复时间  修复缺陷
     3.10   1  思路问题  从开始  无方向    转化了思路
        描述 :一开始打算用Java实现,但始终没有一个明确方向,且没有完整的demo借鉴学习
     3.10   2  知识欠缺  编码  网上学习  20min  得到了自己想到的数据集合
          描述:读取的数据存了起来但不会拆分获取到自己想要的数据部分
     3.10  3  知识欠缺  编码  网上学习  20min  数据库实现数据的录入
            描述:没有接触过python连接数据库,去学了一下语句跟连接方面
    © 版权声明
    文章版权归作者所有,未经允许请勿转载。
    THE END
  • 相关阅读:
    TestNG
    K近邻算法
    Python解决乱码问题
    Log4J 配置
    多线程死锁
    hadooplzo安装出错的解决方法
    B树
    设计模式
    整数序列化
    Maven
  • 原文地址:https://www.cnblogs.com/xp-thebest/p/12483807.html
Copyright © 2011-2022 走看看