Дек 12
2008парсинг сайтов. Теория. Курсы валют центробанка
Рубрики: (Без рубрики, Парсинг) Автор: phpdude 12-12-2008
Теги : curl, file_get_contents, parse php, php, preg, preg_match, preg_match_all, print_r, psockopen, Парсинг, парсинг php
такс, я просто смотрю на статистику ливинтернета и замечаю что люди часто ищут «парсинг пхп» … думаю стоит начать рассказывать эту тему)
парсинг – сбор нужной информации со страниц интернета. парсинг бывает необходим для люых целей – начиная от котировок валюты, погоды с гисметео, страниц интересных нам сайтов, результатов поисковой выдачи и заканчивая авторизацией на сайт «вконтакте» для поиска музыки аля «вплеер.ру».
итого парсинг – сбор инетересующей нас информции со страниц.
что для этого необходимо
- сервер подключенный к интеренту с установленным php.
- allow_url_fopen или curl extension(было бы шикарно) или fsockopen(сам пользуюсь курлом, но есть люди немоей веры).
- свободное место на диске.
чтобы парсить страницы, нам надо их сначала скачать
скачивать страницы можно с помощью перечисленных в пункте 2 средств.
$string = file_get_contents(«http://www.cbr.ru/»);
после того как мы получили html код интересующей нас страницы в виде строки, мы можем ее обрабатывать. заходим браузером на страницу http://www.cbr.ru/. открываем «просмотр HTML» кода страницы средствами браузера (в firefox – ctrl+U). дальше в диалоговое окно поиска текста вводим «Доллар США», и видим кусок html кода.
<tr>
<td>
<table cellspacing=«0″ cellpadding=«0″ width=«5″ align=«left» border=«0″><tr>
<td width=«5″></td>
</tr>
</table>
<img height=«11″ alt=«Доллар США» hspace=«2″ src=«/images/icon_dollar.gif» width=«11″ align=«left» vspace=«2″ border=«0″>Доллар
США</td>
<td></td>
<td class=«digit» align=«right»>27,8671 </td>
<td></td><td class=«digit» align=«right» nowrap>27,9310 <IMG alt=‘up +0.0639 ‘ border=0 height=8 hspace=2 src=/images/icon_up.gif width=7></td>
</tr>
<tr>
<td>
<table cellspacing=«0″ cellpadding=«0″ width=«5″ align=«left» border=«0″>
<tr>
<td width=«5″></td>
</tr></table>
<img height=«11″ alt=«Евро» hspace=«2″ src=«/images/icon_evro.gif» width=«11″ align=«left» vspace=«2″ border=«0″>Евро</td>
<td></td>
<td class=«digit» align=«right»>36,1715 </td><td></td>
<td class=«digit» align=«right» nowrap>36,6678 <IMG alt=‘up +0.4963 ‘ border=0 height=8 hspace=2 src=/images/icon_up.gif width=7></td>
</tr>
класс. как раз в этом куске кода и находятся интересующие наскурс доллара и евро. ну что, уже хорошо
вопрос, какбы нам взять эту информацию? для разбора текста я рекомендую использовать регулярные выражения в пхп это функции preg_* сейчас могу предположить что мы будем использовать preg_match и preg_match_all
в полученном куске html ищем особенности верстки – 90% верстки имеют интересные нам значения обрамленные в какие нить html теги с css классами уникальными, ну если нет уникальности, то просто алгоритм поиска слегка усложняется, но остается все равно прозрачный. и так, смотрим верствку и замечаем, что наши значения
<td class="digit" align="right">27,8671 </td> <td class="digit" align="right">36,1715 </td>
обрамлены в специфичные html теги – сначала
<td class="digit" align="right">
и в конце
</td>
что чрезвычайно удобно для наших целей
составляем следующее регулярное выражение для поиска нужных значений из результатов проведенного нами анализа – #<td class=»digit» align=»right»>(.*?) </td>#. подставляем в функцию preg_match_all и получаем
preg_match_all(«#<td class=\»digit\» align=\»right\»>(.*?) </td>#ism»,$string,$values);
потом небольшое украшательство
$values = $values[1];
и вуаля!
print_r($values);
дает нам результат
Array ( [0] => 27,8671 [1] => 36,1715 )
где первая цифра в массиве – курс доллара, вторая – курс евро соответственно
это было сложно? я думаю что нет. надеюсь многие после такой статьи перестанут задавать глупые вопросы на форумах
В следующей ститье будем парсить результаты выдачи яндекса.
Всея ПЫХА
adw0rd
Мавр
ГО
Irinax
Гражданин, я вахуе
сколько ж кода и все зря
http://pyha.ru/articles/php/parsing/
парсить xml можно с помощью strpos’ов
так что вы из пушки по голубям среляете граждане)
А я использую для этих целей BeautifulSoup
BeautifulSoup насколько я понял он для питона)
Бууу, отпарсил бы регуляркой весь контент
а я чем парсил?)
Статья познавательная. Особенно если учесть, что тут написан пример, который можно применить не только к курсу валют. В общем. автору зачет.
в ближ время напишу посложнее
пока времени не хватает.
Было бы отлично, если бы Вы «разжевали» несколько регулярок, которые привели выше. Просто пока читаю литературу (+ статьи) на эту тему, но там есть примеры, а вот объяснений типа «(.*?) – любое выражение с начала строки» (правда не дуплю что означает «?», квантификатор, мать его, по-умному).
смотри тут все просто
. – любой символ(цифры,буквы,тире, спецсимволы и прочая хер, любой в прямом смысле ), при модификаторе s это еще и переводы строк.
* – значит сколько попало раз, больше 0 другими словами. этот квантор «жадный», то есть жрет максимальое количество символов попадающих под маску перед «.».
? – значит «усмирение жадности». значит жрать как можно меньше)
на примере
(
) – сожрет
(
) – сожрет
.
понятно?
могу накидать небольшую статью на тему регулярок, но мне надо помощь – список регулярок от новичка, ибо для меня это все просто и я не могу понять где есть сложность
блядь ебанный вордпресс, сожрал весь хтмл
на примере
[td]lalal[/td][td] ..[/td] [td] …[/td]
([td].*[/td]) – сожрет [td]lalal[/td][td] ..[/td] [td] …[/td]
([td].*?[/td]) – сожрет [td]lalal[/td]
Ок, со списком – наваяю сегодня вечером (еси домой попаду
).
А в целом это значительно понятней, нежели то, что читал про эти же метасимволы в статье!
п.с. Список кину на мыло сегодня или завтра с утра.
довай.
Ёкараный бабай! Сколько примеров и скриптов не находил – ничерта не работало! Нашелся наконец человек, который разжевал! Бик зур рэхмет, т.е. очень большое спасибо!
не за что)))
а как сделать, чтобы эта дрянь не выводилась:
Array
(
[0] => 27,8671
[1] => 36,1715
)
а выводилось только:
27,8671
36,1715
?
вместо print_r($values);
echo join(«»,$values);
к примеру с этим кодом
<?php
;$string = file_get_contents('http://www.pr-cy.ru/'
preg_match_all('#(.*?)#ism',$string,$values);
print_r($values);
?>
не работает
я привел не волшебный кусок кода, он работает только там где должен