随着大规模疫情的爆发,相关的各类信息的传播速度甚至超过了冠状病毒(COVID-19)自己,这里面咱们很难去筛选哪些信息是真的有益于咱们的。但有一点很明确的是,咱们必须了解影响咱们居住地区的实际统计数据。python
今天,咱们将用一种有趣的方式——Python,来教你们如何得到全球冠状病毒相关数字的信息。web
我将向你展现如何在你的邮件中得到天天有多少受冠状病毒影响的人以及相似的信息。chrome
我将使用一种方法,叫作Web抓取,使用到的工具是Selenium和Python。浏览器
来吧~直接进入正题服务器
首先,咱们必须找到数据源,也就是数据究竟从哪儿来?我决定用Worldometers来作这个,由于这里面的数据相对比较准确,同时网站的页面也作得很是直观、简洁。网络
这是一个表,显示了受影响的每一个国家的数据,在许多列中有不一样的数据内容。dom
咱们想作的是从表格中获取你想要得到的对应国家的数据,而后它会自动给你发送电子邮件。编辑器
首先,你须要安装一个ChromeDriver(https://chromedriver.chromium...),它将使咱们可以操做浏览器,并向它发送命令以供测试和使用。工具
打开连接并下载操做系统的文件,而后解压缩该文件。我建议进入文件,经过右键点击手动操做,而后点击“解压缩这里”。测试
在这个文件夹里,有一个叫作“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代码。它易于使用、可定制,而且能够减轻你设备的负担。
在任何你喜欢的地方打开一个新项目并建立两个新文件。这是个人文件打开后的样子:
在VS代码中,有一个“Terminal”选项卡,你可使用它打开VS代码中的内部终端,这对于将全部东西放在一个地方很是有用。
当你打开它时,其实须要安装的东西不多,这就是web驱动程序的虚拟环境和selenium。
将一下命令输入终端:
1pip3 install virtualenv 2source venv/bin/activate 3pip3 install selenium
激活虚拟环境以后,咱们就彻底准备好了。
既然咱们已经肯定了咱们想要什么(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]')
在这张表中,咱们须要获取国家,以确保它是咱们最初想要查找的国家。
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
原文连接:https://towardsdatascience.com/how-to-track-coronavirus-with-python-a5320b778c8e
欢迎点击“京东智联云”了解更多精彩内容!
以上信息来源于网络,由“京东智联云开发者”公众号编辑整理,不表明京东智联云立场。