只需一臺電腦,人人都可用 Python 實現新冠病毒分佈實時追蹤

雷鋒網 AI 源創評論: 目前,隨着新型冠狀病毒(COVID-19)的全球範圍內蔓延,海外地區現有確診已經上升至 293683 (數據更新至 2020.03.25 16:54) 。爲了更好了保證自身健康,我們必須瞭解正在影響⽣活所在地區的實際統計數據。

如何利用現有工具來事實追蹤病情分佈呢?近日,一個有趣的開源項目正好解決了這一問題。只需一臺電腦,誰都可按照步驟利用 Python 獲得專屬個人的疫情信息。作者發佈了文章介紹該操作過程,雷鋒網 AI 源創評論將其編譯如下。

圖片來源:Sebastian Herrmann on Unsplash

Web 爬蟲計劃

我們將使⽤Web 爬蟲的⽅法,以及 Selenium(Web 爬蟲的一個庫)和 Python⼯具來完成這一計劃。

首先,我們需要找到要從中獲取數據的網站,在本次教程中,使⽤到的是 Worldometers,因爲作者覺得這上面的數據⾮常準確,並且⽹站看起來不錯~

下面開始進入計劃:

在 Worldometers 上的表格中,顯示了每個受影響國家/地區的相關數據,包括:累計確診病例、新增病例、累計死亡人數、累計治癒人數,以及病危程度的人數統計等。

我們要做的,就是將以上的各個詳細數據,通過一系列方法的轉化,使其能夠自動發到我們的電子郵箱中。當然,選擇其它包含這些數據的網站,也不是不可以。

搭建環境

首先,我們需要安裝 ChromeDriver,並進行環境搭建。

ChromeDriver 將幫助我們能夠控制瀏覽器並向其發送命令,從而進⾏測試和之後的其它操作,可以通過鏈接( https://chromedriver.chromium.org/ )下載與你電腦系統相匹配的安裝包。

Ps:如果你不是很熟悉 ChromeDriver,建議儘可能使用最新穩定版本。

下載之後,接下來將需要解壓所下載的文件,建議右鍵單擊「文件」,然後選擇「Extract Here」,手動進行解壓操作。

之後你會發現在該⽂件夾內,有⼀個名爲「chromedriver」的⽂件,我們需要按照下面的步驟將其移⾄計算機上的特定⽂件夾。

  • 第一步,打開終端並輸⼊以下命令:

sudo su#進⼊root 模式 cd  

#從當前位置返回到基礎 mv / home / *your_pc_name * / Downloads / chromedriver / usr / local / bin  

#將⽂件移動到正確的位置

注意:其中的「*your_pc_name *」部分,需要替換爲所用計算機的實際名稱。

  • 第二步,打開編輯器,作者選擇的是 Visual Studio Code( https://code.visualstudio.com/ )。

  • 第三步,新建一個項⽬,並創建兩個新⽂件。可參考下面作者的設置:

Visual Studio Code—項目設置

並且可以發現,在 VS Code 中有⼀個「Terminal」選項,可以⽤它在 VS Code 中打開內部終端。

第四步,安裝虛擬環境和⽤於 Web 爬蟲驅動程序的 selenium 工具,並在終端中鍵⼊下面這些命令:

pip3 install virtualenv 

source venv / bin / activate  

pip3 install selenium
關注公衆號:編程學習營,送Python入門學習資料+源碼+思維導圖

最後激活虛擬環境,我們的準備工作就完成了。

開始編碼

現在,我們完成對環境的搭建以及掌握所需信息獲取地址後,就要開始做「編碼實現」部分了。

我們將爲其創建爲⼀個類以及函數,使⽤任何名稱創建即可,然後啓動 Chrome 驅動程序:

class Coronaviru():  

def __init __(self):  

self.driver = webdriver.Chrome()

然後,轉到 VS Code 內部終端並輸⼊下面的代碼,此命令使我們可以將⽂件作爲交互式場所:

python -i coronavirus.py

之後,將瀏覽器的新標籤頁打開,我們開始向其發出命令。(如果想進⾏實驗,可以使⽤命令⾏代替在源⽂件中鍵⼊命令⾏)

對於終端,命令爲:

bot = Coronavirus()  

bot.driver.get('https://www.worldometers.info/coronavirus/')

現在,使其獲取源代碼:

self.driver.get('https://www.worldometers.info/coronavirus/')

當我們進⼊⽹站時,我們需要提取所選網頁中的表格。因此,我們將以這種⽅式進⾏操作,將表格作爲 Web 元素並將其保存在「表」下。

爲了在⽹頁上找到該元素,我們使⽤ find_element_by_xpath()並使⽤其定義的 ID 對其進⾏過濾。

table = self.driver.find_element_by_xpath('//*  

[@id="main_table_countries"]/tbody[1]')

在該表中,通過對應的名稱,確保要找到我們最初需要獲取國家或地區。

country_element = table.find_element_by_xpath(「// td  

[contains(text(),'China')]」))

再次使⽤XPath,我們嘗試使用「China」的數據。由於我們需要「China」旁邊的數據,因此我們必須確保它屬於該⾏,這就是爲什麼要從 country_element 中獲取父節點:

row = country_element.find_element_by_xpath("./..")

在該⾏內,我們獲取了所需的所有數據,我們將該字符串拆分爲每⼀列,並將其保存爲變量:

data = row.text.split(" ")  

total_cases = data[1]  

new_cases = data[2]  

total_deaths = data[3]  

new_deaths = data[4] 

active_cases = data[5]  

total_recovered = data[6]  

serious_critical = data[7]
關注公衆號:編程學習營,送Python入門學習資料+源碼+思維導圖

其中,「data」是⼀個來⾃字符串拆分的列表,然後我們將其分散到不同的變量中以備後⽤。

發送電⼦郵件

在完成編碼部分之後,我們就要進入電子郵件發送部分了。

首先,需要設置電⼦郵件發送服務器。作者用到了 Google 帳戶服務,然後進⼊「應⽤程序密碼」,在那⾥⽣成⼀個新密碼並在所寫腳本程序中使⽤它。

然後,我們將通過以下代碼,爲我們將收到的電⼦郵件製作模板:

def send_mail(country_element, total_cases, new_cases, total_deaths, new_deaths, active_cases, total_recovered, serious_critical): 

server = smtplib.SMTP('smtp.gmail.com', 587) 

server.ehlo() 

server.starttls() 

server.ehlo() 

server.login('email', 'password') 

subject = 'Coronavirus stats in your country today!' 

body = 'Today in ' + country_element + '\ 

\nTotal cases: ' + total_cases +'\ 

\nNew cases: ' + new_cases + '\ 

\nTotal deaths: ' + total_deaths + '\ 

\nNew deaths: ' + new_deaths + '\ 

\nActive cases: ' + active_cases + '\ 

\nTotal recovered: ' + total_recovered + '\ 

\nSerious, critical cases: ' + serious_critical + '\ 

\nCheck the link: https://www.worldometers.info/coronavirus/'  

msg = f"Subject: {subject}\n\n{body}" 

server.sendmail( 

'Coronavirus', 

'email', 

msg 

) 

print('Hey Email has been sent!') 

server.quit()
關注公衆號:編程學習營,送Python入門學習資料+源碼+思維導圖

這樣,就能夠實現單次的最新疫情信息獲取了。如果你希望每天重複執⾏此腳本,可以通過下面鏈接中的編碼實現:

https://stackoverflow.com/questions/15088037/python-script-to-do-something-at-the-same-time-every-day

成功訂閱!

最後,我們就得到了自制的郵件訂閱啦~(如下所示)

電子郵件形式成功

當然,除了可以將我們所在地區的新冠病毒最新情況發到個人郵箱外,通過這樣的方法,舉一反三,你想訂閱的其它資訊也可以自定義發送,而且還沒有任何廣告~

而在此,也再次提醒所有朋友,在目前疫情持續情況下,一定要勤洗手、戴口罩;同時,儘可能避免與他⼈進⾏過多的⾝體接觸。

原文地址:

https://towardsdatascience.com/how-to-track-coronavirus-with-python-a5320b778c8e

完整開源代碼 Github 地址:

https://github.com/lazargugleta/coronavirusStats/blob/master/coronavirus.py

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章