不能再簡單了|手把手教你爬取美國疫情實時數據


==========

歡迎關注我的公眾號:早起python

有問題可以后台給我留言

============

大家好,最近一直有讀者在后台留言說早起能不能寫一下怎么獲取國外的疫情數據、美國疫情數據怎么爬之類的。為了滿足各位,今天就說一下如何爬取美國疫情數據。

 

廢話不多說,直接開始,只需一台電腦,按照下面的順序一步一步執行,爬不下來數據你打我,文末不提供源碼,源碼一字不少全在文中。首先感謝讀者@荷月十九提供的目標網站(不然我肯定直接找個API😂)

https://coronavirus.1point3acres.com/?code=001XKpTM0fAHk92cYwUM0iSrTM0XKpTF

打開這個網站,會吧

長這樣👆但是我們需要拿的數據是👇

現在目標很明確,把上面這一堆數據取下來,下面有請Python出場

打開Notebook,導入以下包

import requests
import json
import re
import pandas as pd
from bs4 import BeautifulSoup

如果有人留言怎么打開,怎么導入我會直接當場去世,接着設置下URL和headers,不用F12,URL就是上面的URL

url = 'https://coronavirus.1point3acres.com/?code=001XKpTM0fAHk92cYwUM0iSrTM0XKpTF'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}

這兩句復制粘貼執行謝謝,我們繼續,下一步直接請求數據

res = requests.get(url,headers=headers)

這一句就是使用Requests使用get方法向服務器請求數據,我們來看一下返回的值

哦豁,報錯了,從報錯代碼來看說明返回的並不能解析為json數據,沒事不慌,bs4登場,我們用美麗的湯試試

soup = BeautifulSoup(res.text)
soup

搞定👆,接下來干嘛?我們想要的數據都在這湯(soup)里了,取出來不就完事了,這時候F12就不得不登場了,回到瀏覽器剛剛的頁面按下F12

為了再照顧一下不熟悉的讀者,我已經標注了你F12之后要干嘛,先點擊位置1處的小箭頭,它就變成了藍色,再點擊頁面中美國確診的總人數的數字,你戳它一下,右邊的頁面就會自動定位到前端頁面中該數字的位置,從標注3中可以看到這個數字被存儲在一個名為strong的標簽中,並且class屬性為jsx-1831266853,OK請執行下面代碼

t = soup.find_all('strong', class_="jsx-1831266853")

這段代碼具體是什么意思呢?就是從soup中找標簽為'strong',class為"jsx-1831266853"的內容👇

返回了一個list,我們要的數據都在里面,拿總確診人數來說,怎么取出來👇

total_confirmed = int(t[0].text)

上面這行代碼不難看懂吧,首先取出t的第0個位置元素,.text函數取出中間的數字,再將這個數字轉換為int,這不就把美國確診總人數取出來了嗎。不過話說這有啥用啊,自己百度也能得到啊,別急,我們再把各個州的數據拿下

讓我們故技重施👆,回到瀏覽器頁面中,F12定位到各個州的位置,戳一下看看數據存儲在哪些標簽中,看不懂的話回去看上一張圖,結果我們發現好多div啊,點開一個就是一行數據,再觀察觀察發現每一行的數據都被一個屬性是class="jsx-742282485 stat row"的標簽包住👇

下面就好辦了,使用soup故技重施👇

s = soup.find_all('div', class_="jsx-742282485 stat row")

不難理解吧,將所有含屬性是class="jsx-742282485 stat row"的div標簽取出來,來看下結果

有點亂,但是不用慌我們通過len(s)可以發現返回的list長度為57,而上面剛好有57行(不用數了,我已經數過了),所以這57行的數據都在里面了,不用慌,一行一行取唄。

我們先嘗試取出第一行的數據,看看套路是什么,搞定了寫一個循環不就完事了。所以再回去瀏覽器看看第一行的數據怎么存儲的👇

可以看到,我們剛剛取出了57個div標簽,一個div標簽里面有5個span,而前4個span中分別存儲了州名、確診、死亡、致死率,所以我們的思路就對每一個div取出這4個span中的內容,先取第一行👇

name = s[0].find_all('span')[0].text
k = s[0].find_all('span')[1].text
confirmed = (int(re.findall(r"\d+\.?\d*",k)[0])*1000 + int(re.findall(r"\d+\.?\d*",k)[1])) if ',' in k else int(k)
deaths = int(s[0].find_all('span')[2].text)
rate = s[0].find_all('span')[3].text

等等,4個數據為什么要5行,有沒有注意到,確診數據由於比較大,比如紐約確診人數是46093,但是網頁里面是46,093,多了一個,這個,會導致我們之后可視化不方便。所以使用兩行代碼來解決這個問題👇

k = s[0].find_all('span')[1].text
confirmed = (int(re.findall(r"\d+\.?\d*",k)[0])*1000 + int(re.findall(r"\d+\.?\d*",k)[1])) if ',' in k else int(k)

我稍微解釋下,第一行把數字取出來是這樣46,093,第二行先用正則表達式取出數字再拼接成正常的格式,如果看不懂也沒關系,這不是本期重點,總之這兩行就是把數字整理下

好了,到這里基本就算結束了,接下來我們創建一個空dataframe

df = pd.DataFrame(columns= ['Location','Confirmed','Deaths','Fatality rate'])

最后寫一個循環重復執行剛剛的操作就搞定

for i in range(len(s)):
    name = s[i].find_all('span')[0].text
    k = s[i].find_all('span')[1].text
    confirmed = (int(re.findall(r"\d+\.?\d*",k)[0])*1000 + int(re.findall(r"\d+\.?\d*",k)[1])) if ',' in k else int(k)
    deaths = int(s[i].find_all('span')[2].text)
    rate = s[i].find_all('span')[3].text
    
    data = [name,confirmed,deaths,rate]
    df.loc[i] = data

上面這個也不難看懂把,對每一行取出數據並存到dataframe中,如果看不懂那你一定沒做過Pandas120題系列,我們來看下最終取到的數據

登登登登,美國各個州的疫情數據就成功取下來了,最后可以使用df.to_excel('filename.xlsx')存儲到本地。

以上就是爬取美國疫情數據的全部過程,也不難吧!如果需要這個頁面中更多的數據完全可以重復上述步驟,並且這個網站實時更新數據,如果定時執行就能獲得時間序列數據,這些就不再多說了。拿到數據之后就能做一些分析可視化👇

由於篇幅原因,如果還想看同款手把手講解可視化相關教程👆,歡迎關注早起python。注意寫爬蟲時請注意請求頻率不要影響對方網站的服務哦,拜拜,周末愉快~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM