马上就加载好了...

[转载]动手制作工具实时追踪世界疫情分布

by on Apr 10 , 2020 , under 公益, 移动互联 , 335 views , Leave a Comment

全球冠状病毒疫情持续爆发,有国外网友分享了一篇利用 Python 获得专属个人的疫情信息的文章(原文见此),今天转载给大家。

Web 爬虫计划

我们将使⽤Web 爬虫的⽅法,以及 Selenium(Web 爬虫的一个库)和 Python⼯具来完成这一计划。

首先,我们需要找到要从中获取数据的网站,在本次教程中,使⽤到的是 Worldometers(详见上一篇博文)。我们要做的,就是将各个详细数据,通过一系列方法的转化,使其能够自动发到我们的电子邮箱中。

搭建环境

首先,我们需要安装 ChromeDriver,并进行环境搭建。ChromeDriver 将帮助我们能够控制浏览器并向其发送命令,从而进⾏测试和之后的其它操作。

下载之后,接下来将需要解压所下载的文件,建议右键单击「文件」,然后选择「Extract Here」,手动进行解压操作。

之后你会发现在该⽂件夹内,有⼀个名为「chromedriver」的⽂件,我们需要按照下面的步骤将其移⾄计算机上的特定⽂件夹。

第一步,打开终端并输⼊以下命令:

sudo su#进⼊root 模式 cd

#从当前位置返回到基础 mv / home / *your_pc_name * / Downloads / chromedriver / usr / local / bin

#将⽂件移动到正确的位置

注意:其中的「*your_pc_name *」部分,需要替换为所用计算机的实际名称。

第二步,打开编辑器,比如 Visual Studio Code。

第三步,新建一个项⽬,并创建两个新⽂件。并且可以发现,在 VS Code 中有⼀个「Terminal」选项,可以⽤它在 VS Code 中打开内部终端。

第四步,安装虚拟环境和⽤于 Web 爬虫驱动程序的 selenium 工具,并在终端中键⼊下面这些命令:

pip3 install virtualenv

source venv / bin / activate

pip3 install selenium

最后激活虚拟环境,我们的准备工作就完成了。

开始编码

现在,我们完成对环境的搭建以及掌握所需信息获取地址后,就要开始做「编码实现」部分了。

我们将为其创建为⼀个类以及函数,使⽤任何名称创建即可,然后启动 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]

其中,「data」是⼀个来⾃字符串拆分的列表,然后我们将其分散到不同的变量中以备后⽤。

发送电⼦邮件

在完成编码部分之后,我们就要进入电子邮件发送部分了。

首先,需要设置电⼦邮件发送服务器。然后进⼊「应⽤程序密码」,在那⾥⽣成⼀个新密码并在所写脚本程序中使⽤它。

然后,我们将通过以下代码,为我们将收到的电⼦邮件制作模板:

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!’)

这样,就能够实现单次的最新疫情信息获取了。

完整开源代码 Github 地址:

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

 

沙发竟然还没被抢!


赶快说点什么吧! ^_^