Python:爬取疫情每日資料
前言
有部分同學留言說為什麼412,這是因為我程式碼裡全國的cookies需要你自己開啟瀏覽器更新好後替換,而且這個cookies大概只能持續20秒左右!
另外全國衛健委的資料格式一直在變,也有可能會導致爬取失敗!
我現在已根據2月14日最新通報稿的格式修正了!
目前每天各大平臺,如騰訊、今日頭條都會更新疫情每日資料,他們的資料來源都是一樣的,主要都是通過各地的衛健委官網通報。
為什麼已經有大量平臺做了每日跟蹤了,我還要爬資料呢?
這是因為各大平臺為了統一各省市資料的格式,會有意無意地忽略一些不是特別關鍵的資料,同時即使是衛健委官網的資料裡,也隱含了一些不容易發現的資料。
1、以上海衛健委的資料為例,缺少了“當日新增疑似數”,只有“當前累計疑似數”,這就需要我們根據“累計排除疑似數”、“累計確診數”和“當前累計疑似數”三者相加後,與前一天三者之和相減來獲得。
2、又比如在一開始,國家衛健委的資料裡是沒有湖北當日新增數的(後來加進去了),這也使得我們只有把2個衛健委的資料都獲得後簡單計算才能獲得。
3、再比如我最後有張表格,是四率:重症率、死亡率、治癒率和確診率,這些都是比較有用的資料。
以全國、湖北和上海為例,分別為以下三個網站:
國家衛健委官網:http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml
湖北衛健委官網:http://wjw.hubei.gov.cn/bmdt/ztzl/fkxxgzbdgrfyyq/xxfb/
上海衛健委官網:http://wsjkw.sh.gov.cn/xwfb/index.html
其中上海的衛健委官網資料比較好爬,雖然需要使用cookies,但是用chrome登入後即可自動獲取。
國家衛健委使用的反爬技術比較高,首先網站是shtml,cookies一直在變,我實測基本在20秒不到就會變化一次;另外做了selenium檢測,所以selenium爬蟲是無用的。
網上有反反爬的技術,只是暫時我還沒有時間研究,等以後再看吧。
另:今天早上在測試程式碼的時候,上海的資料經常會出現無響應的情況,原因不知。
程式碼
import requests
from bs4 import BeautifulSoup
import datetime
import re
from selenium import webdriver
import time
import xlwings as xw
def get_sh_data(url):
'''獲得上海衛健委的資料'''
r = requests.get(url=url, headers=sh_headers)
sh_dict = {}
soup = BeautifulSoup(r.text, 'lxml')
# print(soup)
ivs_content = soup.find(name='div', attrs={'id':'ivs_content', 'class':'Article_content'})
new_text = ivs_content.get_text()
# print(new_text)
sh_dict['累計排除疑似'] = re.search('已累計排除疑似病例(\d+)例', new_text).group(1)
sh_dict['累計確診'] = re.search('發現確診病例(\d+)例', new_text).group(1)
style2 = '(\d+)例病情危重,(\d+)例重症,(\d+)例治癒出院,(\d+)例死亡'
sh_dict['累計重症'] = int(re.search(style2, new_text).group(1)) + int(re.search(style2, new_text).group(2))
sh_dict['累計治癒'] = re.search(style2, new_text).group(3)
sh_dict['累計死亡'] = re.search(style2, new_text).group(4)
sh_dict['累計疑似'] = re.search('尚有(\d+)例疑似病例正在排查中', new_text).group(1)
return sh_dict
def get_sh_today_news():
'''獲得上海衛健委的新聞'''
url = r'http://wsjkw.sh.gov.cn/xwfb/index.html'
r = requests.get(url=url, headers=sh_headers)
soup = BeautifulSoup(r.text, 'lxml')
# print(soup)
today_format = datetime.datetime.today().strftime('%Y-%m-%d')
today_sh_news = soup.find_all(name='span', text=today_format)
today_counts = len(today_sh_news)
for i in range(today_counts-1, -1, -1):
title = today_sh_news[i].find_previous_sibling(name='a').attrs['title'] # 標題
href = 'http://wsjkw.sh.gov.cn' + today_sh_news[i].find_previous_sibling(name='a').attrs['href'] #網址
if title.startswith('上海新增'):
# print(title)
return get_sh_data(href)
def get_all_today_news():
'''獲得國家衛健委的新聞'''
url = 'http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml'
r = requests.get(url, headers=quanguo_headers)
soup = BeautifulSoup(r.text, 'lxml')
# print(soup)
today_format = datetime.datetime.today().strftime('%Y-%m-%d')
latest_news_title = soup.find(name='span', text=today_format).find_previous_sibling(name='a').attrs['title']
latest_news_href = 'http://www.nhc.gov.cn' + soup.find(name='span', text=today_format).find_previous_sibling(name='a').attrs['href']
# print(latest_news_href)
return get_all_today_data(latest_news_href)
def get_all_today_data(url):
'''獲得國家衛健委的資料'''
r = requests.get(url, headers=quanguo_headers)
all_dict = {}
hubei_dict = {}
soup = BeautifulSoup(r.text, 'lxml')
news = soup.find(name='p').get_text()
# print(news)
all_dict['新增疑似'] = re.search('新增疑似病例(\d+)例', news).group(1)
all_dict['累計疑似'] = re.search('現有疑似病例(\d+)例', news).group(1)
all_dict['累計確診'] = re.search('累計報告確診病例(\d+)例', news).group(1)
all_dict['累計重症'] = re.search('其中重症病例(\d+)例', news).group(1)
all_dict['累計死亡'] = re.search('累計死亡病例(\d+)例', news).group(1)
all_dict['累計治癒'] = re.search('累計治癒出院病例(\d+)例', news).group(1)
hubei_dict['新增疑似'] = re.search('新增疑似病例(\d+)例.*?(武漢(\d+)例', news).group(1)
hubei_dict['新增確診'] = re.search('湖北新增確診病例(\d+)例.*?(武漢(\d+)例', news).group(1)
hubei_dict['新增死亡'] = re.search('新增死亡病例(\d+)例.*?(武漢(\d+)例', news).group(1)
hubei_dict['新增治癒'] = re.search('新增治癒出院病例(\d+)例(武漢(\d+)例)', news).group(1)
hubei_dict['累計重症'] = re.search('其中重症病例(\d+)例.*?(武漢(\d+)例', news).group(1)
# print(all_dict, hubei_dict)
return all_dict, hubei_dict
def get_cookie(url):
driver = webdriver.Chrome()
driver.get(url)
time.sleep(3)
cookies = driver.get_cookies()
driver.quit()
items = []
for i in range(len(cookies)):
cookie_value = cookies[i]
item = cookie_value['name'] + '=' + cookie_value['value']
items.append(item)
cookiestr = '; '.join(a for a in items)
return cookiestr
def get_into_excel():
'''把資料貼到excel裡'''
app = xw.App(visible=True, add_book=False)
app.display_alerts = False
app.screen_updating = False
wb = app.books.open('新型冠狀病毒每日資料.xlsx')
ws = wb.sheets['all']
max_row = ws.api.UsedRange.Rows.count
ws.range('C' + str(max_row)).value = hubei_data['新增確診']
ws.range('K' + str(max_row)).value = hubei_data['新增死亡']
ws.range('O' + str(max_row)).value = hubei_data['新增治癒']
ws.range('S' + str(max_row)).value = hubei_data['新增疑似']
ws.range('AA' + str(max_row)).value = hubei_data['累計重症']
ws.range('R' + str(max_row)).value = all_data['新增疑似']
ws.range('AL' + str(max_row)).value = all_data['累計疑似']
ws.range('V' + str(max_row)).value = all_data['累計確診']
ws.range('Z' + str(max_row)).value = all_data['累計重症']
ws.range('AD' + str(max_row)).value = all_data['累計死亡']
ws.range('AH' + str(max_row)).value = all_data['累計治癒']
ws.range('AN' + str(max_row)).value = sh_data['累計排除疑似']
ws.range('Y' + str(max_row)).value = sh_data['累計確診']
ws.range('AC' + str(max_row)).value = sh_data['累計重症']
ws.range('AK' + str(max_row)).value = sh_data['累計治癒']
ws.range('AG' + str(max_row)).value = sh_data['累計死亡']
ws.range('AM' + str(max_row)).value = sh_data['累計疑似']
wb.save()
wb.close()
app.quit()
if __name__ == "__main__":
sh_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Cookie': get_cookie('http://wsjkw.sh.gov.cn/xwfb/index.html'),
# 'Cookie': 'zh_choose=s; zh_choose=s; _gscu_2010802395=80620430ie0po683; yd_cookie=12f170fc-e368-4a662db5220af2d434160e259b2e31585efb; _ydclearance=2cd0a8873fd311efcda1c1aa-05fc-4001-a108-0e86b80b3fee-1580700296; _gscbrs_2010802395=1; _pk_ref.30.0806=%5B%22%22%2C%22%22%2C1580693101%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DDVUbOETLyMZLC5c_V7RJRbAYPvyqaU3f2PCBi2-E6KC2QEFltdrKWGmhgA5NbC3c%26wd%3D%26eqid%3Df38b30250015e1c5000000045e365a8d%22%5D; _pk_ses.30.0806=*; _pk_id.30.0806=35b481da38abb562.1580620431.6.1580694952.1580693101.; _gscs_2010802395=80693100qds57e17|pv:6; AlteonP=ALa1BGHbHKyWUqcNUGRETw$$',
'Host': 'wsjkw.sh.gov.cn'
}
quanguo_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'Cookie': 'oHAcoULcWCQb80S=pxzexGFCvyGV4xDkaMHSyjBmzwXn5O4vfCbxFCgMDfcBaKqsFU9FHstqjFY6wJt9; yfx_c_g_u_id_10006654=_ck20020209283417867964364567575; _gscu_2059686908=81579037nbf5xc58; insert_cookie=67313298; yfx_f_l_v_t_10006654=f_t_1580606914774__r_t_1581643181169__v_t_1581678949269__r_c_14; security_session_verify=a2efd6893c3ad08675db9b0f5c365ecf; oHAcoULcWCQb80T=4Ywh2qE8IiJP44ThdpW0fs7Yqi1Hwlh9RhJHrW2WVl536y4eCIgXxGh9M8IuYUqGUCCtBO5kBc2DB6Kewd3naLK_O2bK5W3w3pcqT.uX3asTXxC2SGBqy9eV2DoGB0ZXb4uTPzPGbXebmT6xIYxbAmGbm_kZVX_nUvBL4nkAuFAVvcGLBmXr8nsdEToXztqZUlYnTjn9niwHMcg3th7XhJvFS_tckqRq5bLpvS_IKPuYn2JLraIIejlErBhA5IQhyHXFekNynv5PYgpzu2PguGccrP3c_bcg1MFViQjKVhgs_B22Nv4NxdHdiIk9GdZDZBjQ',
'Host': 'www.nhc.gov.cn'
}
#一、全國和湖北的資料
all_data, hubei_data, sh_data = {}, {}, {}
try:
all_data, hubei_data = get_all_today_news()
print('全國資料:{}\n'
'湖北資料:{}'.format(all_data, hubei_data))
except:
print('全國資料未更新')
#二、上海的資料
try:
sh_data = get_sh_today_news()
print('上海資料:{}'.format(sh_data))
except:
print('上海資料未更新')
#三、匯出到excel裡
if sh_data != {} and all_data != {}:
get_into_excel()
print('Excel重新整理成功!')
成果
獲得資料後就可以做很多事情了,比如放到excel裡,比如直接matplotlib作圖,又或者做arima預測。
比如我做了個簡單的excel,如下圖所示(紅色部分是爬取到的資料):
相關文章
- 【python】爬取疫情資料並進行視覺化Python視覺化
- 房產資料爬取、智慧財產權資料爬取、企業工商資料爬取、抖音直播間資料python爬蟲爬取Python爬蟲
- 利用Python爬取新冠肺炎疫情實時資料,Pyecharts畫2019-nCoV疫情地圖PythonEcharts地圖
- 使用 Python 爬取網站資料Python網站
- Python爬取噹噹網APP資料PythonAPP
- Python 爬取 baidu 股票市值資料PythonAI
- Python爬取CSDN部落格資料Python
- python爬取股票資料並存到資料庫Python資料庫
- python爬取58同城一頁資料Python
- 輕鬆利用Python爬蟲爬取你想要的資料Python爬蟲
- Python爬蟲框架:scrapy爬取高考派大學資料Python爬蟲框架
- Python爬蟲入門【3】:美空網資料爬取Python爬蟲
- python爬蟲 爬取豆瓣電影 1-10 ajax 資料Python爬蟲
- Python爬蟲訓練:爬取酷燃網視訊資料Python爬蟲
- python網路爬蟲(7)爬取靜態資料詳解Python爬蟲
- Python 爬取網頁資料的兩種方法Python網頁
- 利用python爬取某殼的房產資料Python
- python更換代理爬取豆瓣電影資料Python
- 使用Python進行Web爬取和資料提取PythonWeb
- Python新型冠狀病毒疫情資料自動爬取+統計+傳送報告+資料螢幕(三)傳送篇Python
- Python資料爬蟲學習筆記(11)爬取千圖網圖片資料Python爬蟲筆記
- 利用python編寫爬蟲爬取淘寶奶粉部分資料.1Python爬蟲
- Python爬蟲之小說資訊爬取與資料視覺化分析Python爬蟲視覺化
- python爬取北京租房資訊Python
- python爬蟲——爬取大學排名資訊Python爬蟲
- python爬蟲--爬取鏈家租房資訊Python爬蟲
- python爬蟲獲取天氣網實時資料Python爬蟲
- python爬取qq音樂歌手排行熱度資料Python
- Python爬蟲精簡步驟1 獲取資料Python爬蟲
- python爬取不到資料的可能原因之一Python
- Python如何爬取實時變化的WebSocket資料PythonWeb
- 【python爬蟲案例】利用python爬取豆瓣電影TOP250評分排行資料!Python爬蟲
- Python爬取股票資訊,並實現視覺化資料Python視覺化
- 小白學 Python 爬蟲(25):爬取股票資訊Python爬蟲
- 如何使用python多執行緒有效爬取大量資料?Python執行緒
- Python 超簡單爬取微博熱搜榜資料Python
- Python爬取房產資料,在地圖上展現!Python地圖
- 用xpath、bs4、re爬取B站python資料Python