Поскольку массовые эпидемии и новости распространяются быстрее, чем сам Коронавирус (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.
Также, если вы хотите узнать больше о парсинге веб-страниц, прочтите Все, что вам нужно знать о парсинге.
Последние слова
Напоминаем, что перед уходом всегда заботьтесь о своей гигиене и, особенно, пока продолжается эпидемия, не вступайте в физический контакт с другими людьми!
Спасибо за внимание!