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

На этой странице мы видим интересующий нас блок (см. рисунок), его мы и будем препарировать. Просмотри исходного кода страницы сразу дает нам понять, что сайт в кодировке UTF8, а разработчики заботливо выделили для нас начало блока комментариями вида: <!– begin info td –>. Если бы его не было пришлось бы искать другие точки опоры, но здесь получилось очень довольно просто.
Сам блок содержащий необходимую для нас информацию выглядит следующим образом:
-
<!– begin info td –>
-
<table width="100%" cellspacing="0" cellpadding="0" border="0">
-
<tr>
-
<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>
-
<td valign=top align=right style="font-size:22px;color:#0E64D1;padding:8px 10px 0px 0px;">6C</td>
-
</tr>
-
</table>
-
<table width="100%" cellspacing="0" cellpadding="0" border="0">
-
<tr>
-
<td style="padding: 5px 5px 5px 5px;"><img src="/images/weather/dull.png" width="157" height="125" border="0" alt=""></td>
-
<td valign=top style="padding: 0px 0px 0px 0px;width:46%;">
-
<table width="100%" cellspacing="1" cellpadding="1" border="0">
-
<tr>
-
<td style="padding: 0px 1px 0px 0px;" align=right>Ветер:</td>
-
<td><b>ЮЗ, 9 м/с</b></td>
-
</tr>
-
<tr>
-
<td style="padding: 0px 1px 0px 0px;" align=right>Давление:</td>
-
<td><b>758 мм рт.ст.</b></td>
-
</tr>
-
<tr>
-
<td style="padding: 0px 1px 0px 0px;" align=right>Влажность:</td>
-
<td><b>93%</b></td>
-
</tr>
-
</table>
-
<div style="padding: 12px 0px 0px 0px;"></div>
-
<!– begin gray corner –>
Теперь необходимо составить регулярное выражение, конечно существуют и другие способы, но мне так лучше и гибче получается. Сначала из всей страницы выделим интересующий нас блок (пишу сразу в формате preg_match):
-
"|<!– begin info td –>(.*?)<!– begin gray corner –>|siu".
Первый вариант получается такой:
-
<?php
-
$ch = curl_init();
-
curl_setopt($ch, CURLOPT_URL, "http://www.meteoprog.ua/ru/weather/Yevpatoria/");
-
curl_setopt($ch, CURLOPT_HEADER, false);
-
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
-
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (http://blog.yousoft.ru)');
-
$data = curl_exec($ch);
-
if (preg_match("|<!– begin info td –>(.*?)<!– begin gray corner –>|siu",$data,$res)){
-
echo $res[1];
-
}
-
curl_close($ch);
-
?>
Проверяем, все нормально мы получили необходимый нам блок. Двигаемся дальше. Температура находиться в таблице первой строке втором столбце, опишем это так:
-
"|<!– begin info td –>.*?<td.*?<td.*?>(.*?)</td>.*?<!– begin gray corner –>|siu".
Вставляем в предыдущий пример и проверяем. У меня работает температура получена. Следующим шагом мы получим направление и скорость ветра, ориентиром для нас будет название поля «Ветер:» и оформление самого значения:
-
"|<!– begin info td –>.*?<td.*?<td.*?>(.*?)</td>.*?Ветер:.*?<td><b>(.*?)</b></td>.*?<!– begin gray corner –>|siu".
Нужно заметить, что направление и скорость ветра попадут во второй элемент массива.
Ну, а давление и влажность оставим как домашнее задание, тем более делается оно аналогично ветру.

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