如何用Python追蹤全球各地新冠肺炎數據?

Alt

Alt

隨着大規模疫情的爆發,相關的各類信息的傳播速度甚至超過了冠狀病毒(COVID-19)自己,這裏面咱們很難去篩選哪些信息是真的有益於咱們的。但有一點很明確的是,咱們必須瞭解影響咱們居住地區的實際統計數據。python

今天,咱們將用一種有趣的方式——Python,來教你們如何得到全球冠狀病毒相關數字的信息。web

我將向你展現如何在你的郵件中得到天天有多少受冠狀病毒影響的人以及相似的信息。chrome

我將使用一種方法,叫作Web抓取,使用到的工具是SeleniumPython瀏覽器

Alt

來吧~直接進入正題服務器

準備工做

首先,咱們必須找到數據源,也就是數據究竟從哪兒來?我決定用Worldometers來作這個,由於這裏面的數據相對比較準確,同時網站的頁面也作得很是直觀、簡潔。網絡

Alt

這是一個表,顯示了受影響的每一個國家的數據,在許多列中有不一樣的數據內容。dom

咱們想作的是從表格中獲取你想要得到的對應國家的數據,而後它會自動給你發送電子郵件。編輯器

Alt

設置環境

首先,你須要安裝一個ChromeDriver(https://chromedriver.chromium...),它將使咱們可以操做瀏覽器,並向它發送命令以供測試和使用。工具

打開連接並下載操做系統的文件,而後解壓縮該文件。我建議進入文件,經過右鍵點擊手動操做,而後點擊「解壓縮這裏」。測試

Alt

在這個文件夾裏,有一個叫作「chromedriver」的文件,咱們必須把它移到你電腦上的一個特定文件夾裏。

打開終端,輸入如下命令:

1sudo su #enter the root mode
2cd      #go back to base from the current location
3mv /home/*your_pc_name*/Downloads/chromedriver /usr/local/bin 
4#move the file to the right location

接下來,只須要插入計算機的實際名稱,而不是 your_pc_name

完成以後,打開編輯器。我我的的選擇是Visual Studio代碼。它易於使用、可定製,而且能夠減輕你設備的負擔。

在任何你喜歡的地方打開一個新項目並建立兩個新文件。這是個人文件打開後的樣子:

Alt

在VS代碼中,有一個「Terminal」選項卡,你可使用它打開VS代碼中的內部終端,這對於將全部東西放在一個地方很是有用。

當你打開它時,其實須要安裝的東西不多,這就是web驅動程序的虛擬環境和selenium。

將一下命令輸入終端:

1pip3 install virtualenv
2source venv/bin/activate
3pip3 install selenium

激活虛擬環境以後,咱們就徹底準備好了。

Alt

編碼

既然咱們已經肯定了咱們想要什麼(What),咱們將從哪裏獲得它(Where),咱們就必須作「如何獲得」(How)的部分。

建立你的工具,並啓動Chrome的驅動程序。

1class Coronavirus():
2  def __init__(self):
3    self.driver = webdriver.Chrome()

這就是咱們須要開始開發的所有內容。如今去你的終端並輸入:

1python -i coronavirus.py

這個命令讓咱們能夠將文件做爲一個交互式遊樂場。瀏覽器的新標籤將被打開,咱們能夠開始向它發出命令。

若是你想進行試驗,可使用命令行,而不是直接將其輸入到源文件中。(不是自用機器人。)

終端:

1bot = Coronavirus()
2bot.driver.get('https://www.worldometers.info/coronavirus/')

源代碼:

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

當咱們訪問網站時:
將該表做爲Web元素,並將其保存在table下。爲了在網頁上找到這個元素,咱們使用find_element_by_xpath()並使用它定義的id來過濾它。

1table = self.driver.find_element_by_xpath('//*[@id="main_table_countries"]/tbody[1]')

Alt

在這張表中,咱們須要獲取國家,以確保它是咱們最初想要查找的國家。

1country_element = table.find_element_by_xpath("//td[contains(text(), 'China')]")

咱們再次使用XPath,以「中國」爲例。

由於咱們須要‘China’旁邊的數據,因此咱們必須確保它屬於那一行,這就是爲何咱們要從country_element中獲取父元素。

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

在這一行中,咱們獲得了全部須要的數據咱們將把這個字符串分紅每一列並保存到變量中。

1data = row.text.split(" ")
2total_cases = data[1]
3new_cases = data[2]
4total_deaths = data[3]
5new_deaths = data[4]
6active_cases = data[5]
7total_recovered = data[6]
8serious_critical = data[7]

基本上‘data’是一個列表,它來自於字符串的分割,而後咱們把它分散到不一樣的變量中,以便之後使用。

發送郵件

咱們必須設置電子郵件發送服務器,進入谷歌帳戶服務,進入「應用程序的密碼」,在那裏你應該生成一個新的密碼,並在這個小腳本中使用它。

咱們也爲咱們將收到的電子郵件製做模板:

1def send_mail(country_element, total_cases, new_cases, total_deaths, new_deaths, active_cases, total_recovered, serious_critical):
 2server = smtplib.SMTP('smtp.gmail.com', 587)
 3server.ehlo()
 4server.starttls()
 5server.ehlo()
 6server.login('email', 'password')
 7subject = 'Coronavirus stats in your country today!'
 8body = 'Today in ' + country_element + '\
 9\nThere is new data on coronavirus:\
10\nTotal cases: ' + total_cases +'\
11\nNew cases: ' + new_cases + '\
12\nTotal deaths: ' + total_deaths + '\
13\nNew deaths: ' + new_deaths + '\
14\nActive cases: ' + active_cases + '\
15\nTotal recovered: ' + total_recovered + '\
16\nSerious, critical cases: ' + serious_critical  + '\
17\nCheck the link: https://www.worldometers.info/coronavirus/'
18msg = f"Subject: {subject}\n\n{body}"
19server.sendmail(
20'Coronavirus',
21'email',
22msg
23)
24print('Hey Email has been sent!')
25server.quit()

若是你想讓這個腳本天天重複,看看這個連接:https://stackoverflow.com/questions/15088037/python-script-to-do-something-at-the-same-time-every-day

Alt

Alt

原文連接:https://towardsdatascience.com/how-to-track-coronavirus-with-python-a5320b778c8e

歡迎點擊「京東智聯雲」瞭解更多精彩內容!

Alt

以上信息來源於網絡,由「京東智聯雲開發者」公衆號編輯整理,不表明京東智聯雲立場。

Alt

相關文章
相關標籤/搜索