You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

43 lines
2.5 KiB

import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] # 指定画图的时候可以显示中文
plt.rcParams['axes.unicode_minus']=False # 指定画图的时候可以有负号
url = 'https://www.bitpush.news/covid19/' # 链接
response = requests.get(url) # 发送get请求 拿到请求体
response = response.content # 拿到返回的文本内容
soup = BeautifulSoup(response, 'html.parser') # 使用BeautifulSoup库来解析html文件
allinfo = soup.find_all('div', class_='card-inner-wrapper') # 找到美国疫情数据相关的坐标 拿到信息
mymap = {} # 声明一个哈希表 记录前15确诊人数有关的信息
for info in allinfo:
findh1 = info.find('h1', string='美国境内统计数据') # 判断 如果是美国疫情数据才做信息处理
if findh1 is not None: # 如果找到了 也就是findh1不为空
allstate = info.find_all("tr") # 找到所有的行信息 也就是确诊信息
for state in allstate: # 遍历所有的行信息 拿到州名字以及确诊信息
statename = state.find('td', class_='table_card_cell_col_0 table_card_cell_stringwithicon_type')
if statename is not None: # 如果州信息不为空才能拿到
statename = statename.text
diagnose = state.find('td', class_='table_card_cell_col_1 table_card_cell_int_type')
if diagnose is not None: # 如果确诊信息不为空才能拿到
diagnose = diagnose.text
diagnose = int(''.join(diagnose.split(','))) # 这是因为国外的人数会有, 比如1000是1,000所以要特殊处理一下转成1000
die = state.find('td', class_='table_card_cell_col_2 table_card_cell_float_type')
if die is not None:
die = die.text
die = int(''.join(die.split(','))) # 同上
if diagnose is not None:
mymap[statename] = diagnose # 如果不为空的话 将 [州、确诊信息] 放在里面
X, Y = [], [] # X轴 Y轴
for k, v in sorted(mymap.items(), key=lambda x: -x[1])[:15]: # 选取确诊信息的前15条
X.append(k)
Y.append(v) # 添加信息
plt.bar(X, Y, color="blue") # 画柱状图 指定颜色为蓝色
plt.xticks(rotation=45) # 为了避免X轴过于挤看不清 将它旋转45度
plt.xlabel("")
plt.ylabel("确诊人数")
plt.title("确诊人数前15")
plt.savefig('bar.jpg')
plt.show()