基于公共卫生事件背景下的数据采集-阿里云开发者社区

开发者社区> waj清风> 正文

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

简介: 通过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()

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
AI大事件 | 高校AI科学家流失严重,关于整个地球的数据集登录AWS
新闻 大学正在失去他们最好的人工智能科学家 来源:WWW.THEGUARDIAN.COM 链接: https://www.theguardian.com/science/2017/nov/01/cant-compete-universities-losing-best-ai-scientists?utm_campaign=Revue%20newsletter&utm_medium=Newsletter&utm_source=The%20Wild%20Week%20in%20AI 一些公司正在不断地从高校中挖走顶尖的AI研究人员,对于这一现象很多学者称之为”杀死产金蛋的鹅“。
1377 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8666 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10501 0
DataV实战#2 - 无交互事件组件数据源查询时间变量传递技巧
对于类似翻牌器这样的带交互事件组件数据源查询时间变量传递,可以通过时间轴配置交互事件进行传递配置。但对于类似仪表盘、水位图、轮播饼图这样的无交互事件组件,该配置方式无法传入时间变量。 查询DataV官方文档无果,请教DataV专家@子墨, 找到了一个解决方式,记录如下,以供需要的同学参考。 该方案的使用数字翻牌器组件作为传递时间变量。 ## 配置数字翻牌器 第一步,配置数字翻牌
1502 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12310 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11439 0
+关注
waj清风
北京青苔数据科技有限公司研发经理。6年以上大数据和人工智能开发经验,熟悉Hadoop、Spark、TensorFlow、阿里云离线计算平台MaxCompute,阿里云集成平台DataWorks,阿里云BI工具QuickBI和阿里云机器学习工具PAI等。
23
文章
7
问答
来源圈子
更多
阿里云最有价值专家,简称 MVP(Most Valuable Professional),是专注于帮助他人充分了解和使用阿里云技术的意见领袖阿里云 MVP 奖项为我们提供了这样一个机会,向杰出的意见领袖表示感谢,更希望通过 MVP 将开发者的声音反映到我们的技术路线图上。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载