Отслеживаем развитие коронавируса в своей стране при помощи Python

С учетом массовых вспышек и новостей, распространяющихся быстрее чем сам Коронавирус (COVID-19), мы должны знать о фактической статистике, которая затрагивает области, в которых мы живем.

В этой статье мы рассмотрим один очень интересный способ отслеживания развития коронавируса. И сделаем это исходя из тематики нашего сайта, а именно напишем скрипт на Python.

Мы покажем вам, как вы можете собирать данные и получать по электронной почте каждый день информацию о том, сколько людей находится под наблюдением, и всякую подобную информацию.

Мы собираемся использовать метод, который называется Web Scraping и возьмем в руки такие инструменты, как Selenium и Python.

Давайте просто разберемся с этим!

Этап планирования

Во-первых, мы должны выяснить, откуда мы собираемся получать наши данные. Мы приняли решения, что будем использовать Worldometer для этого, просто потому, что мы находим данные довольно точными, да сайт выглядит весьма неплохо.

Вот таблица, которая показывает нам данные по каждой затронутой стране и с различными данными во куче столбцов.

Поэтому мы хотим взять эти данные из таблицы в зависимости от страны, из которой вы хотите получить данные, для того, чтобы получить электронное письмо.

Настраиваем окружение

Вам нужно будет установить ChromeDriver, который позволит нам манипулировать браузером и отправлять ему команды для выполнения.

Откройте ссылку и загрузите файл для вашей операционной системы. Мы рекомендуем последнюю стабильную версию, если вы не знаете, что делаете.

Затем вам нужно распаковать этот файл. Я бы порекомендовал зайти в проводник и сделать это вручную, щелкнув правой кнопкой мыши и затем «Извлечь здесь».

Extract compressed folder on computer

Внутри папки есть файл с именем «chromedriver», который мы должны переместить в определенную под программу папку на вашем компьютере.

Покажем на примере Linux. Откроем терминал и напишем эти команды:

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

Просто вместо *your_pc_name* введите свое имя компьютера.

Как только мы закончим с этим, мы откроем редактор. Наш личный выбор — Visual Studio Code. Это простой в использовании, настраиваемый и легкий редактор кода для вашего компьютера.

В VS Code есть вкладка «Терминал», с помощью которой вы можете открыть внутренний терминал внутри VS Code, что очень полезно, чтобы все было в одном месте.

Когда мы все это открыли, нам нужно установить еще несколько вещей — это виртуальная среда и selenium for web driver. Введите эти команды в свой терминал.

pip3 install virtualenv
source venv/bin/activate
pip3 install selenium

После активации виртуальной среды мы полностью готовы к работе.

Программируем!

Теперь, когда мы убедились, что знаем, чего хотим и откуда мы это получим, мы должны выполнить часть «как».

Мы создадим скрипт как класс и создадим для него функции. Итак, начнем!

Создайте свой инструмент с любым именем и запустите драйвер для Chrome.

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

Это все, что нам нужно, чтобы начать разработку. Теперь перейдите к своему терминалу и введите:

python -i coronavirus.py

Эта команда позволяет нам использовать наш файл как интерактивную игровую площадку. Откроется новая вкладка браузера, и мы можем начать использовать в ней команды. Если вы хотите поэкспериментировать, вы можете использовать командную строку, а не вводить ее непосредственно в исходный файл.

Для терминала:

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

А теперь для исходного кода:

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

Когда мы попадаем на веб-сайт, нам нужно спарсить таблицу, упомянутую ранее, и мы собираемся сделать это следующим образом:

Мы возьмем таблицу в качестве веб-элемента и сохраним ее как «table». Чтобы найти этот элемент на веб-странице, мы используем find_element_by_xpath() и фильтруем его, используя идентификатор, под которым он был определен.

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 и находим наш пример «Китай». Поскольку нам нужны данные по «Китаю», мы должны убедиться, что они принадлежат этой строке, и поэтому мы собираемся взять родительский элемент из 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» — это список, полученный в результате разбиения строк, а затем мы просто распределяем его по разным переменным, чтобы использовать их позже.

Отправляем письмо!

Нам нужно настроить сервер отправки электронной почты, зайти в сервис аккаунта 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 + '\
\nThere is new data on coronavirus:\
\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()

И если вы хотите поставить этот скрипт на повторение каждый день, проверьте эту ссылку.