爬取疫情动态并进行简单的可视化展示
一、要求
1.编程爬取每日最新的疫情统计数据
2.将爬取结果导入数据库中
3.将可视化结果与统计数据结合,实时显示当前最新数据
二、思路
1.利用python伪装成浏览器爬取数据(爬取地址:丁香园·丁香医生)
2.将得到的代码块进行拆分,得到自己想要的数据值
3.导入数据库(有了数据insert就行)
三、遇到的问题
1.一开始是想试着看Java可不可以实现,但是找了很久没有一个合适的demo
2.python连接数据库方面
3.怎么拆分数据块来得到自己想要的数据
四、源代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步