Python爬虫病例信息

必须安装的第三方库

pip install urllib

pip install pypingin

# -*- coding:utf-8 -*-
import re
import urllib.request
import urllib
import xlwt
import time

import pypinyin
import requests
from requests.exceptions import ReadTimeout,HTTPError,RequestException
# 网址
buwei_url1 = "https://jbk.99.com.cn/"
buwei_url2 = ".html"

# 爬取部位信息https://jbk.99.com.cn/部位/
buwei_url = buwei_url1 + 'buwei/'
try:
    buwei_urlop = urllib.request.urlopen(buwei_url, timeout=100)
    # buwei_urlop = requests.get(buwei_url)
    # print(buwei_urlop)
except Exception as e:

    print("超时")
# HTTP异常
except HTTPError:
    print('httperror')
# 请求异常
except RequestException:
    print('reqerror')
data_buwei = buwei_urlop.read().decode('GBK')  # !!!!!原网页编码方式为GBK
# 得到部位名称,保存在列表ls_buwei中
link_buwei = "<div class=\"part-txt\">\\s*<h3>\\s*<span>\\s*(.*?)</span>"
ls_buwei = []
patten = re.compile(link_buwei)
ls_buwei = patten.findall(data_buwei)
print(ls_buwei)

# 新建表格文本
book = xlwt.Workbook(encoding='utf-8')
heads = [u'疾病名称', u'链接', u'发病部位', u'就诊科室', u'体状特征', u'症状']


def hp(word):
    s = ''
    for i in pypinyin.pinyin(word, style=pypinyin.NORMAL):
        s += ''.join(i)
    return s

# 得到各部位疾病名称
for i, bw in enumerate(ls_buwei):
    catch = 1  # 更换部位开关
    ii = 31
    # 同一部位疾病放置在一个sheet中
    sheet = book.add_sheet(bw, cell_overwrite_ok=True)
    for j, head in enumerate(heads):
        sheet.write(0, j, head)

    while catch == 1:
        ii += 1

        if ii >60:
            break
        # 具体部位网址
        buwei_url_s = buwei_url + hp(bw) + '-' + str(ii) + buwei_url2
        # print(buwei_url_s)
        try:
            # 抓网页
            buwei_urlop_s = urllib.request.urlopen(buwei_url_s, timeout=100)
        except Exception:
            print('超时')
            continue
        try:
            data_buwei = buwei_urlop_s.read().decode('GBK')
            # 网页源代码抓取
        except:
            continue
        # 判断是否是最后一页,对比最后一页源代码可得
        link_is_msg = "<div class=\"part-cont3\">\\s*(.*?)<div class=\"digg\">"
        patten_is_msg = re.compile(link_is_msg)
        is_msg = patten_is_msg.findall(data_buwei)
        # 如果是最后一页切换到下一个部位
        if is_msg == ['']:
            catch = 0
            continue

        # 获取本页所有疾病名称及链接,结果保存在列表ls_des中
        link_buwei = "<dd>\\s*<h3>\\s*<span>\\s*</span>\\s*<a href=\"(.*?)\"\\s*title=\".+\" target=\"_blank\">(.*?)</a></h3>"
        patten_buwei = re.compile(link_buwei)
        ls_des = patten_buwei.findall(data_buwei)
        # 抓取ls_des中各疾病的具体信息
        iii = 1
        for x in ls_des:
            t1 = time.clock()

            row = (ii - 1) * 10 + iii
            print(row)
            # 将疾病名称和链接写入表格
            sheet.write(row, 0, x[1])
            sheet.write(row, 1, x[0])
            # 疾病链接
            jibing_url = 'https:' + x[0] + 'zhengzhuang.html'
            print(jibing_url)
            try:
                jibing_urlop = urllib.request.urlopen(jibing_url, timeout=100)
            except Exception:
                print('超时')
                continue
            try:
                # 源代码获取
                data_jibing = jibing_urlop.read().decode('GBK')
            except:
                continue
            # 发病部位信息
            link_fbbw = "<li><font>发病部位:(.*?)</a></li>"
            patten_fbbw = re.compile(link_fbbw)
            st_abbw = patten_fbbw.findall(data_jibing)
            if st_abbw == []:
                hz_fbbw = re.findall('[\u4e00-\u9fa5]+','')
            else:
                hz_fbbw = re.findall('[\u4e00-\u9fa5]+', st_abbw[0])  # 中文提取

            fbbw = ','.join(ff for ff in hz_fbbw)
            sheet.write(row, 2, fbbw)
            # 抓写就诊科室信息
            link_jzks = "<li><font>就诊科室:(.*?)</a></li>"
            patten_jzks = re.compile(link_jzks)
            st_jzks = patten_jzks.findall(data_jibing)
            if st_jzks == []:
                jzks = ','.join(ff for ff in re.findall('[\u4e00-\u9fa5]+',''))  # 中文提取
            else:
                jzks = ','.join(ff for ff in re.findall('[\u4e00-\u9fa5]+', st_jzks[0]))  # 中文提取

            sheet.write(row, 3, jzks)
            # 抓写体状特征
            link_tztz = "<dt><a>症状体征:</a></dt>\\s*<dd>\\s*<ul>(.*?)</a></li></ul>"
            patten_tztz = re.compile(link_tztz)
            st_tztz = patten_tztz.findall(data_jibing)
            if st_tztz == []:
                tztz = ','.join(ff for ff in re.findall('[\u4e00-\u9fa5]+','')) if st_tztz != [] else 0
            else:
                tztz = ','.join(ff for ff in re.findall('[\u4e00-\u9fa5]+', st_tztz[0])) if st_tztz != [] else 0

            sheet.write(row, 4, tztz)
            iii += 1
            t2 = time.clock()
            print(t2 - t1)
            book.save("F:/li结果/jibing11.xls")  # 保存表格

本文将介绍如何使用Python爬虫对新型冠状病毒相关数据进行整理和可视化分析。主要包括以下步骤: 1. 获取疫情数据 2. 整理数据 3. 可视化数据 ## 1. 获取疫情数据 我们可以从丁香园、百度、腾讯等网站获取新型冠状病毒疫情数据。这里以丁香园为例,使用requests库进行网页爬取,代码如下: ```python import requests url = 'https://ncov.dxy.cn/ncovh5/view/pneumonia' r = requests.get(url) r.encoding = 'utf-8' print(r.text) ``` 这里获取到的是网页的HTML代码,需要使用BeautifulSoup库进行解析。代码如下: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(r.text, 'html.parser') script = soup.find('script', attrs={'id': 'getListByCountryTypeService2true'}) text = script.string print(text) ``` 这里我们找到了HTML中id为`getListByCountryTypeService2true`的script标签,通过`script.string`获取到其中的字符串。这个字符串就是包含疫情数据的JSON格式数据。我们可以使用json库将其转换为Python字典格式。代码如下: ```python import json data_str = text.replace('try{window.getListByCountryTypeService2true = ','')[:-1] data_dict = json.loads(data_str) print(data_dict) ``` 这里先将字符串中的`try{window.getListByCountryTypeService2true = `和最后的分号去掉,然后使用json.loads()将其转换为Python字典格式。这个字典中包含了全国和各省市的疫情数据。 ## 2. 整理数据 我们可以将获取到的字典数据整理成DataFrame格式,方便后续的分析和可视化。代码如下: ```python import pandas as pd df = pd.DataFrame(data_dict['getAreaStat']) df = df[['provinceName', 'confirmed', 'suspected', 'cured', 'dead']] df['confirmed'] = df['confirmed'].astype(int) df['suspected'] = df['suspected'].astype(int) df['cured'] = df['cured'].astype(int) df['dead'] = df['dead'].astype(int) print(df.head()) ``` 这里我们只保留了省份、确诊人数、疑似病例、治愈人数和死亡人数,然后将这些数据转换为整数类型。 ## 3. 可视化数据 接下来我们可以使用matplotlib和seaborn库对数据进行可视化分析。这里我们分别绘制各省份的确诊人数和治愈人数的柱状图。代码如下: ```python import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(16, 8)) sns.barplot(x='provinceName', y='confirmed', data=df) plt.xticks(rotation=90) plt.title('Confirmed Cases in China') plt.show() plt.figure(figsize=(16, 8)) sns.barplot(x='provinceName', y='cured', data=df) plt.xticks(rotation=90) plt.title('Cured Cases in China') plt.show() ``` 这里使用了sns.barplot()函数绘制柱状图,并使用plt.xticks(rotation=90)将x轴标签旋转90度,避免重叠。结果如下图所示。 ![Confirmed Cases in China](https://i.loli.net/2021/07/14/og7VnJS32i5xHwz.png) ![Cured Cases in China](https://i.loli.net/2021/07/14/U8Kx4Hj7GwVIvag.png) 可以看到,湖北省的确诊人数和治愈人数都远高于其他省份,这是因为新型冠状病毒最初在湖北省爆发。此外,各省份的确诊人数和治愈人数都有所上升,但是随着时间的推移,治愈人数逐渐增加,确诊人数逐渐减少,这是一个积极的信号。 至此,我们使用Python爬虫对新型冠状病毒疫情数据进行了整理和可视化分析。通过这些分析,我们可以更好地了解疫情的发展趋势和各省份的疫情状况,这对疫情的防控和治疗具有重要意义。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值