CoderCastrov logo
CoderCastrov
PHP

Как создать Cronjob для парсинга последних данных о Covid-19 с использованием PHP, Curl и XPathDOM

Как создать Cronjob для парсинга последних данных о Covid-19 с использованием PHP, Curl и XPathDOM
просмотров
3 мин чтение
#PHP
Table Of Content

    Добрый день, друзья!

    Сегодня мы рассмотрим, как создать простое приложение, которое будет ежедневно получать последние данные о COVID-19 с сайта worldometers.info.

    В этой статье мы будем использовать мой старый язык программирования - PHP - и XPathDOM, а затем процесс будет автоматически запускаться с помощью PHP Automation / Cron / Scheduler каждую полночь (00:00) и полдень (12:00).

    Хорошо, первый шаг - проанализировать веб-сайт, с которого будут браться данные (здесь) и структуру данных. Давайте посмотрим на это вместе.

    Исходя из данных, которые показаны и предоставлены на сайте, мы создадим простое приложение, которое будет получать последние данные о COVID-19 на основе запрашиваемой пользователем страны, очищать их, а затем сохранять их в базе данных, и, конечно же, для завершения, мы создадим PHP Automation с использованием cronjob, чтобы код автоматически запускался в полночь и полдень.

    Хорошо, давайте дальше рассмотрим HTML-код и проанализируем, как получить нужные нам данные с сайта.

    Чтобы получить данные HTML XPATH / элемента, вы можете сделать это вручную или использовать одно из инструментов разработчика Chrome, называемое "Выберите элемент на странице для его проверки". Чтобы использовать его, нажмите Ctrl + Shift + c, а затем щелкните на веб-сайте (в данном случае я щелкнул на строке США). Плагин Chrome Developer Tools будет показан и покажет HTML-элементы веб-сайта. Щелкните правой кнопкой мыши на элементе "<tr>", затем выберите "Копировать", нажмите на одну из опций. Вот что я получил, используя Chrome Developer Tools.

    Копировать > Копировать селектор

    #main_table_countries_today > tbody:nth-child(2) > tr:nth-child(5)

    Копировать > Копировать XPATH

    //*[[@id](http://twitter.com/id)]="main_table_countries_today"]/tbody[1]/tr[5]

    Копировать > Копировать полный XPATH

    /html/body/div[3]/div[3]/div/div[6]/div[1]/div/table/tbody[1]/tr[5]

    Я думаю, мы соединим это с ручным анализом, поэтому вот XPATH, который мы будем использовать:

    //table[@id='#main_table_countries_today']/tbody/tr

    И после того, как мы получим данные в "tr", мы разобьем данные по тегу "td" следующим образом (число представляет собой столбец в таблице):

    Хорошо, для второго шага давайте начнем код.

    Сначала мы создадим функцию для получения HTML-кода веб-сайта с использованием PHP и CURL.

    Вызовем функцию с использованием параметра URL: https://www.worldometers.info/coronavirus и поместим полученный HTML в DOMDocument.

    Добавим ловушку для параметра (argv - потому что я использую командную строку), чтобы получить введенный пользователем параметр. В этом коде мы используем параметр: country_name.

    Получим данные, а затем поместим их в массив и попробуем вывести их с помощью функции var_dump.

    Попробуем запустить его в CLI или командной строке:

    php /var/www/remoteworker/covid.php USA

    Вот результат, который мы получили:

    array(7) {
      ["country_rank"]=>
      string(1) "1"
      ["country_name"]=>
      string(3) "USA"
      ["total_cases"]=>
      int(41854465)
      ["new_cases"]=>
      int(1103)
      ["total_deaths"]=>
      int(678001)
      ["new_deaths"]=>
      int(13)
      ["total_recovered"]=>
      int(31871869)
    }

    Хорошо, выглядит хорошо.

    Для следующего шага давайте разберем данные, чтобы сделать их "чистыми" и затем поместим их в базу данных.

    Упс, я забыл, давайте сначала создадим базу данных и таблицу для данных.

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

    Данные стали более чистыми.

    array(7) {
      'country_rank' =>
      string(1) "1"
      'country_name' =>
      string(3) "USA"
      'total_cases' =>
      int(41853362)
      'new_cases' =>
      int(0)
      'total_deaths' =>
      int(677988)
      'new_deaths' =>
      int(0)
      'total_recovered' =>
      int(31871868)
    }

    Поместим данные в базу данных.

    Вот как выглядит наш код.

    Для последнего шага давайте создадим cronjob для кода, чтобы код мог автоматически запускаться в полночь.

    0 0 * * * root /usr/bin/php /var/www/remoteworker/covid.php USA
    0 12 * * * root /usr/bin/php /var/www/remoteworker/covid.php USA

    Я опубликую данные после того, как получу некоторые данные из них.

    Кстати, вы можете посмотреть репозиторий этого проекта на моем Github здесь.

    Спасибо за время, которое вы потратили на чтение. Давайте снова встретимся в следующий раз, когда мы исследуем еще один интересный случай! 😉