基于公共卫生事件背景下的数据采集

简介: 通过Python爬取中国某省份新冠肺炎疫情数据,存入关系型数据库,对此数据分析并进行可视化,制作查询中国某省份疫情情况的GUI界面。

系统实现流程如下:
此次项目数据采集部分使用的Python库有:requests,xlwt,json,matplotlib,tkinter,os,re,time
import datetime
import time
import socket
import pymysql
import re
import urllib.parse
from urllib import error
from bs4 import BeautifulSoup # 导入urllib库的request模块
import lxml # 文档解析器
import os # os模块就是对操作系统进行操作
import numpy as np # 列表、字典、字符串等中计算元素重复的次数

数据爬取:
def get_html_text(index_url,page_url):

for i in range(1,80):
    url = index_url + str(i) + '&showtj=&showhot=&author=&key=&code='
    response = urllib.request.Request(url, headers=headers)
    try:
        res = urllib.request.urlopen(response)  # 调用urlopen()从服务器获取网页响应(respone),其返回的响应是一个实例
        html = res.read().decode('utf-8')  # 调用返回响应示例中的read(),可以读取html
        soup = BeautifulSoup(html, 'lxml')
        result = soup.find_all('ul', class_="cpquery")  # 和上面的不同,这里要闻在'ul,class = news-txtd'中,所以要修改一下。
        download_soup = BeautifulSoup(str(result), 'lxml')
        url_all = download_soup.find_all('a')
        hours=download_soup.find_all('span', class_="newslist-time")
        hours = re.findall('\d{4}-\d{1,2}-\d{1,2}', str(result))
        for a_url in url_all:
            a_title = a_url.get_text()
            titles.append(a_title)
            a_url = a_url.get('href')
            a_url = urllib.parse.urljoin(page_url, a_url)
            urls.append(a_url)
        for hour in hours:
            hour = datetime.datetime.strptime(hour, '%Y-%m-%d')
            times.append(hour)
            # time.sleep(2)  # 暂停下载页面2秒
            # socket.setdefaulttimeout(15)  # 控制现在内容的时间
    except urllib.error.URLError as e:
        if hasattr(e, 'reason'):
            print("连接失败!", e.reason)
    for i in range(len(urls)):
        try:
            data = urllib.request.Request(urls[i], headers=headers)
            res = urllib.request.urlopen(data)
            page_info = res.read().decode('utf-8')
            soup = BeautifulSoup(page_info, 'lxml')
            text = ""
            now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            for p in soup.select('p'):
                text += p.get_text()
                text += "\n"
            txt(urls[i], titles[i], text, times[i], now)
            print(i)
            print("success!")
        except OSError:
            print("解析错误!")
            pass  # 如果报错就不管,继续读取下一个url
        continue
# else:
#     url = 'http://wjw.liaocheng.gov.cn/xwzx_12609/gzdt/index.html'
#     response = urllib.request.Request(url, headers=headers)
#     try:
#         res = urllib.request.urlopen(response)  # 调用urlopen()从服务器获取网页响应(respone),其返回的响应是一个实例
#         html = res.read().decode('utf-8')  # 调用返回响应示例中的read(),可以读取html
#         soup = BeautifulSoup(html, 'lxml')
#         result = soup.find_all('ul', class_='news-list news-list9')  # 和上面的不同,这里要闻在'ul,class = news-txtd'中,所以要修改一下。
#         download_soup = BeautifulSoup(str(result), 'lxml')
#         url_all = download_soup.find_all('a')
#         hours = re.findall('\d{4}-\d{1,2}-\d{1,2}', str(result))
#         for a_url in url_all:
#             a_title = a_url.get_text()
#             titles.append(a_title)
#             a_url = a_url.get('href')
#             a_url = urllib.parse.urljoin(page_url, a_url)
#             urls.append(a_url)
#         for hour in hours:
#             hour = datetime.datetime.strptime(hour, '%Y-%m-%d')
#             times.append(hour)
#             # time.sleep(2)  # 暂停下载页面2秒
#             # socket.setdefaulttimeout(15)  # 控制现在内容的时间
#     except urllib.error.URLError as e:
#         if hasattr(e, 'reason'):
#             print("连接失败!", e.reason)

删除数据库

def delete_data():

# 连接数据库
db = pymysql.connect(
    host='XXXX.XXXX.XXXX.XXXX',  # 数据库地址
    port=3306,  # 数据库端口号
    user='XXXX',  # 数据库账号
    password='XXXXXXXXXX',  # 数据库密码
    db='python',
    use_unicode=True,
    charset="utf8")  # 数据库表名
# 创建数据库对象
conn = db.cursor()
try:
    conn.execute("DELETE from filedata_bak where city='滨州市(新闻)' and datakinds=0")
    db.commit()
except Exception as e:
    print(e)
    db.rollback()

保存数据到数据库

def txt(urls,title, content, hour,now): # 定义函数名

# 连接数据库
db = pymysql.connect(
    host='XXXX.XXXX.XXXX.XXXX',  # 数据库地址
    port=3306,  # 数据库端口号
    user='XXXX',  # 数据库账号
    password='XXXXXXXXXX',  # 数据库密码
    db='python',
    use_unicode=True,
    charset="utf8")  # 数据库表名
# 创建数据库对象
conn = db.cursor()
try:
    # 执行sql语句,插入数据

    conn.execute(
        "insert ignore into filedata_bak(websitename,datalink,title,content,datatype,city,province,datakinds,pubdate,createtime) values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')" % (
        "滨州市卫生健康委员会", urls, title, content, "文本", "滨州市(新闻)", "山东省", 0, hour, now))

    # 提交到数据库执行
    db.commit()
    print('恭喜您,导入数据成功!')
except:
    # 发生错误时回滚
    db.rollback()
    print('sorry,导入数据失败!')
db.commit()  # 关闭数据库连接
conn.close()  # 关闭指针对象
db.close()  # 关闭连接对象

def main():

page_url = 'http://wjw.binzhou.gov.cn/'
index_url = 'http://wjw.binzhou.gov.cn/xinwen/class/?2.html&page='
get_html_text(index_url, page_url)

if name == '__main__':

delete_data()
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'
}
urls = []
times = []
titles = []
main()
目录
相关文章
|
25天前
|
数据采集 人工智能 JSON
生成式引擎优化(GEO)技术解析:原理、架构与落地实践
AI搜索兴起,用户直取生成答案而非点击链接。GEO(生成式引擎优化)应运而生——通过结构化内容、提升事实密度、统一全网信息等策略,让品牌更易被大模型理解、引用与信任。它非SEO替代,而是面向AI时代的增强层。
|
2月前
|
人工智能 安全 Linux
零门槛搭建云端 AI 编程环境:Linux 服务器 Docker 部署 OpenCode 保姆级教程
在云原生与AI编程深度融合的当下,OpenCode凭借轻量化、浏览器访问、AI辅助编程的特性,成为开发者打造云端开发环境的优选方案。通过Docker容器化部署OpenCode,可在Linux云服务器上快速搭建跨平台、可随时访问的AI编程环境,无需本地安装复杂IDE,随时随地通过浏览器编写、调试代码,结合AI能力大幅提升开发效率。本文将从环境准备、Docker安装、OpenCode部署、配置优化到安全加固,提供保姆级全流程教程,确保零基础用户也能顺利完成部署,打造专属云端AI编程工作台。
340 0
零门槛搭建云端 AI 编程环境:Linux 服务器 Docker 部署 OpenCode 保姆级教程
|
4月前
|
人工智能 搜索推荐 安全
企业如何搭建AI智能体工作流?从需求输入到人工审核的六层设计
企业落地AI智能体,难点不在调用大模型,而在构建稳定、可复用、可审核的业务流程。本文提出六层工作流模型:需求输入→信息整理→AI处理→人工审核→标准输出→数据复盘,覆盖内容运营、客服、销售等场景,助力个人与企业从“工具使用者”升级为“流程设计者”。(239字)
|
Java API 数据安全/隐私保护
POI 导出 Excel:字体颜色、行列自适应、锁住、合并单元格……
POI 导出 Excel:字体颜色、行列自适应、锁住、合并单元格……
1395 0
POI 导出 Excel:字体颜色、行列自适应、锁住、合并单元格……
|
SQL 运维 NoSQL
【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(一)
在学习完 若依环境搭建 和 若依二次开发案例 后,我们将基于若依脚手架完成一个关于智能货柜的项目实战——帝可得!帝可得是一个基于物联网概念下的智能售货机运营管理系统。本文将带领大家使用若依框架从0到1进行项目开发与测试。
4397 1
【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(一)
|
数据挖掘
置信区间与预测区间:数据科学中的不确定性量化技术深度解读
本文深入探讨了统计学中两个常见但容易混淆的不确定性量化工具:置信区间和预测区间。
2084 1
置信区间与预测区间:数据科学中的不确定性量化技术深度解读
|
机器学习/深度学习 人工智能 自然语言处理
【每日算法Day 100】字节跳动 AI Lab 面试编程题(三道)
我当时太紧张了,真是脑抽了,还想着弄个优先队列,划分最大的,然后丢进去,再划分最大的,但是是错的。 正确解法小姐姐走了我才想起来,二分答案 m ,然后扫描一遍判断将每一段划分成小于等于 m 的一共需要多少次。如果次数大于 k ,说明 m 太短了,否则说明 m 太长了。
793 0
【每日算法Day 100】字节跳动 AI Lab 面试编程题(三道)
|
数据库
MyBatis-Plus如何自动填充数据表的创建时间和更新时间
MyBatis-Plus如何自动填充数据表的创建时间和更新时间
1231 1
|
人工智能 自然语言处理 BI
从数据积累到大模型的智能飞跃,你准备好了吗?
在数据驱动的时代,人工智能(AI)正重塑世界。蚂蚁集团的师文汇在「DATA+AI」论坛上发表演讲,阐述了《数据驱动的AI原生应用与开放框架》。他指出,AI应用经历了从数据积累到大模型的智能飞跃,数据已成为智能应用成功的关键。师文汇强调,构建智能应用需结合优质大模型与行业数据。演讲还介绍了AI原生应用的研发变革与挑战,包括编程模型转变、研发范式的不确定性及与现有系统的交互等问题。此外,他还分享了AI原生应用框架的思考与探索,提出了泛ETL、实验反馈机制及应对不确定性等解决方案,并展示了DB-GPT在政企、金融等多个领域的应用案例。
|
弹性计算 关系型数据库 PolarDB
[PolarDB实操课] 03.使用PXD部署PolarDB企业版和标准版
本课程详细介绍了如何使用PXD工具部署PolarDB-X企业版和标准版。主要内容包括: 1. **PolarDB-X企业版与标准版的区别**:讲解了两者的架构特点、性能差异及适用场景。 2. **集群机器上安装Docker环境**:指导用户在阿里云ECS实例上安装Docker,确保后续部署顺利进行。 3. **部署机上安装PXD**:介绍如何配置密钥连接、安装Python3并激活虚拟环境,最后安装PXD工具。 4. **创建并部署PolarDB-X**:通过编写拓扑文件(YAML格式),一键拉起PolarDB-X集群,并验证部署状态。
516 0

热门文章

最新文章