如何用Python追踪全球各地新冠肺炎数据?

Alt

Alt
随着大规模疫情的爆发,相关的各种信息的传播速度甚至超过了冠状病毒(COVID-19)本身,这里面我们很难去筛选哪些信息是真的有益于我们的。但有一点很明确的是,我们必须了解影响我们居住地区的实际统计数据。

今天,我们将用一种有趣的方式——Python,来教大家如何获得全球冠状病毒相关数字的信息。

我将向你展示如何在你的邮件中获得每天有多少受冠状病毒影响的人以及类似的信息。

我将使用一种方法,叫做Web抓取,使用到的工具是SeleniumPython

Alt
来吧~直接进入正题

准备工作

首先,我们必须找到数据源,也就是数据究竟从哪儿来?我决定用Worldometers来做这个,因为这里面的数据相对比较准确,同时网站的页面也做得非常直观、简洁。

Alt
这是一个表,显示了受影响的每个国家的数据,在许多列中有不同的数据内容。

我们想做的是从表格中获取你想要获得的对应国家的数据,然后它会自动给你发送电子邮件。

Alt

设置环境

首先,你需要安装一个ChromeDriver(https://chromedriver.chromium.org/),它将使我们能够操作浏览器,并向它发送命令以供测试和使用。

打开链接并下载操作系统的文件,然后解压缩该文件。我建议进入文件,通过右键点击手动操作,然后点击“解压缩这里”。

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

posted @ 2020-03-22 20:38  京东科技开发者  阅读(461)  评论(0编辑  收藏  举报