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

Примечание редакции: todatascience.com - это издание Medium, в основном основанное на изучении науки о данных и машинного обучения. Мы не профессионалы в области здравоохранения и не эпидемиологи. Чтобы узнать больше о пандемии коронавируса, нажмите здесь.

Сегодня мы собираемся изучить тот факт, как вы можете оставаться в курсе информации о Коронавирусе и делать это таким увлекательным способом с помощью Python.

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

Я собираюсь использовать метод, который называется Веб-парсинг, и инструменты Selenium и Python.

Давайте сразу же приступим к делу!

Планируйте процесс

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

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

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

Настройка среды

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

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

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

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

Откройте терминал и введите следующие команды:

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, что очень полезно для того, чтобы все было в одном месте.

Когда он открыт, нам нужно установить еще несколько вещей, а именно виртуальную среду и селен для веб-драйвера. Введите эти команды в свой терминал.

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/')

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

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

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

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

country_element = table.find_element_by_xpath("//td[contains(., 'USA')]")

Мы снова используем XPath и находим наш пример «США».

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

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

Отправить электронное письмо

Нам нужно настроить сервер отправки электронной почты, перейти в службу учетной записи 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()

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

Мы сделали!

Готовый продукт

Вот полный код:



Следующие шаги

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

Подобные руководства, подобные этому, для автоматизации и запуска хорошего кода: Как сэкономить деньги с помощью Python и Как создать инструмент анализа с помощью Python.

Также, если вы хотите узнать больше о парсинге веб-страниц, прочтите Все, что вам нужно знать о парсинге.

Последние слова

Напоминаем, что перед уходом всегда заботьтесь о своей гигиене и, особенно, пока продолжается эпидемия, не вступайте в физический контакт с другими людьми!

Спасибо за внимание!