爬取疫情动态并进行简单的可视化展示

一、要求

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连接数据库,去学了一下语句跟连接方面

猜你喜欢

转载自www.cnblogs.com/xp-thebest/p/12483807.html