curl в php практическое применение


Я уже публиковал несколько статей про работу c curl в php. Сегодня я продолжаю эту тему и покажу на примере одного из сайтов как можно практически применять это инструмент.

Вымышленной задачей на сегодня я будет получения погоды для г. Евпатории, с этим городом у меня много воспоминаний, поэтому выбрал именно его. «Донором» будет сайт METEOPROG.UA:Погода в Украине. Немного оглядевшись на сайте находим интересующую нас страницу: /ru/weather/Yevpatoria/.

На этой странице мы видим интересующий нас блок (см. рисунок), его мы и будем препарировать. Просмотри исходного кода страницы сразу дает нам понять, что сайт в кодировке UTF8, а разработчики заботливо выделили для нас начало блока комментариями вида: <!— begin info td —>. Если бы его не было пришлось бы искать другие точки опоры, но здесь получилось очень довольно просто.
Сам блок содержащий необходимую для нас информацию выглядит следующим образом:

  1. <!— begin info td —>  
  2. <table width="100%" cellspacing="0" cellpadding="0" border="0">
  3. <tr>
  4. <td valign=top><div class="block_header" style="color: #CC050C; padding: 12px 0px 0px 15px;"><h3 style="font-size: 16px;display:inline;">Евпатория (на 15:00 EET)</h3></div></td>
  5. <td valign=top align=right style="font-size:22px;color:#0E64D1;padding:8px 10px 0px 0px;">6°C</td>
  6. </tr>
  7. </table>
  8. <table width="100%" cellspacing="0" cellpadding="0" border="0">
  9. <tr>
  10. <td style="padding: 5px 5px 5px 5px;"><img src="/images/weather/dull.png" width="157" height="125" border="0" alt=""></td>
  11. <td valign=top style="padding: 0px 0px 0px 0px;width:46%;">
  12. <table width="100%" cellspacing="1" cellpadding="1" border="0">
  13. <tr>
  14. <td style="padding: 0px 1px 0px 0px;" align=right>Ветер:</td>
  15. <td><b>ЮЗ, 9 м/с</b></td>
  16. </tr>
  17. <tr>  
  18. <td style="padding: 0px 1px 0px 0px;" align=right>Давление:</td>
  19. <td><b>758 мм рт.ст.</b></td>
  20. </tr>
  21. <tr>    
  22. <td style="padding: 0px 1px 0px 0px;" align=right>Влажность:</td>
  23. <td><b>93%</b></td>
  24. </tr>  
  25. </table>
  26. <div style="padding: 12px 0px 0px 0px;"></div>
  27. <!— begin gray corner —>

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

  1. "|<!— begin info td —>(.*?)<!— begin gray corner —>|siu".

Первый вариант получается такой:

  1. <?php
  2. $ch = curl_init();
  3. curl_setopt($ch, CURLOPT_URL, "http://www.meteoprog.ua/ru/weather/Yevpatoria/");
  4. curl_setopt($ch, CURLOPT_HEADER, false);
  5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  6. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  7. curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (http://blog.yousoft.ru)');
  8. $data = curl_exec($ch);
  9. if (preg_match("|<!— begin info td —>(.*?)<!— begin gray corner —>|siu",$data,$res)){
  10.  echo $res[1];
  11. }
  12. curl_close($ch);
  13. ?>

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

  1. "|<!— begin info td —>.*?<td.*?<td.*?>(.*?)</td>.*?<!— begin gray corner —>|siu".

Вставляем в предыдущий пример и проверяем. У меня работает температура получена. Следующим шагом мы получим направление и скорость ветра, ориентиром для нас будет название поля «Ветер:» и оформление самого значения:

  1. "|<!— begin info td —>.*?<td.*?<td.*?>(.*?)</td>.*?Ветер:.*?<td><b>(.*?)</b></td>.*?<!— begin gray corner —>|siu".

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

Похожие записи:

Tags: , ,

One Response to “curl в php практическое применение”

  1. seo:

    регулярки могут затруднить читаемость кода. я больше склоняюсь к php dom html parser

Leave a Reply