Парсинг - легко и доступно! Мастер-класс от SEOVirus’a.
25 мая, 2008вводная часть
Как и обещал, пишу заметку на тему парсинга, который попытаюсь дать лёгким и доступным языком даже для непрограммистов. Парсить будем на РНР.
Итак, что я понимаю под словом парсинг?
Парсинг это синтаксический анализ текста. Т.е. преобразование его в некоторую структуру данных, с которой работать нам будет просто и легко. Т.е скажем на вход подаём страницу результатов из гугла/яндекса, а на выходе (после процесса парсинга) мы получаем массив в виде пунктов результатов поиска, где поэлементо будет расписано: урл, заголовок сайта, занимаемая позиция, сниппет, favicon и т.д.
Ещё один пример. Запускаем скрипт парсить полностью какой-либо сайт - он выдирает из него все статьи, после чего мы можем разместить их у себя с собственным дизайном. Плохо это или хорошо, вопрос не для обсуждения в данной заметке. Зато после прочтения оной - Вы узнаете как народ парсит Ваши сайты и соответственно узнаете как можно защититься от подобных скриптов. Прелюдия закончилась, поехали.
с чего начать?
Изначально нам нужно изучить структуру текста (страницы, сайта и т.д.), который мы собираемся парсить.
Что в этом нужно нам усмотреть?
Необходимо понять какой подстрокой начинается контент, который мы собираемся изъять и какой строкой заканчивается.
В качестве примера такая HTML страница:
<html>
<head><title>заголовок</title></head>
<body>
здесь некоторый текст, меню и т.д.
<p>
<h1>заголовок статьи</h1>
здесь располагается
некоторая статья
</p>
продажные ссылки и т.д. что не должно войти в наш "срез"
</body>
</html>
В данном случае мы видим, что нужный нам текст стоит между тэгами “p“. Пишем код под эту ситуацию:
$matchesArr = array();
preg_match_all( '|<p>(.*)</p>|sUS', $str, $matchesArr );
print_r( $matchesArr );
Модификатор “s” - указывает нам на то, чтобы символ “.” включал в себя перевод строки. По умолчанию не включает.
Модификатор “U” - включает “жадность” квантификаторов. По умолчанию, опять же, они “не жадны”.
Модификатор “S” включён, так скать, на вырост
Всё!
На самом деле, видоизменяя эту единственную строчку кода (preg_match_all) можно добиться парсинга 97% статей (если они там вообще есть).
Если мы хотим распарсить на странице кучу анекдотов - этот код также справиться и с этой ситуацией. Всё гораздо проще, чем Вам кажется! Проще!
Теперь представим, что мы скачали некоторый сайт, положили его в виде HTML файлов в некоторой директории my_site. Посмотрим как можно обойти все эти файлы и выкачать с них всю нужную информацию.
Пример обхода всех файлов в директории my_site:
$myDir = 'my_site';
$d = dir( $myDir );
$matchesArr = array();
while( false !== ( $fileName = $d->read() ) ){
if( ( $fileName != '.' ) && ( $fileName != '..' ) ) {
$str = file_get_contents( $myDir . '/' . $fileName );
preg_match_all( '|<p>(.*)</p>|sUS', $str, $matchesArr );
// обрабатываем полученную информацию в $matchesArr
}
}
$d->close();
Вот и все чудеса! Таким образом народ и парсит Ваши сайты. Теперь Вы знаете как они это делают, теперь Вы знаете как защититься от этого.
Любые вопросы и замечания - приветствуются!
37 Responses to “Парсинг - легко и доступно! Мастер-класс от SEOVirus’a.”
r7 [27.05.08 01:09] | Reply
т.е. чтоб не украли контент надо вставить код с 3 рисунка? я правильно понял?
SEOVirus [27.05.08 09:29] | Reply
Нет.. Я имел ввиду, что попытки кражи контента так и будут продолжаться, от них никуда не деться.
Пока крадут Ваш контент, часто не обращают внимания на то, что крадут - соответственно, если в контенте стоит реклама - украдут Ваш контент, Вам же на пользу
Второй момент это изменяющая структура контента при которой украсть контент просто не получится. Как видите крадут часто по шаблонному коду, а если его не будет, то и ориентироваться не на что (откуда и докуда воровать). Соответственно - ничего и не получится.
В скором времени я напишу статью о некотором методе кражи контента, который народ старается не офишировать. Там же мозговой штурм будет поинтереснее
Я тут так уверенно высказываюсь о всяких кражах контента и т.д. Хочу сразу заметить, что я не вор контента и не копипастер. Я программист, который кое-чего понимает в программинге
(ну и параллельно осведомлён о многих интересных методах работы СЕОшников).
Mega строитель [29.05.08 17:28] | Reply
Самое главное не указали, можно же даже автоматизировать кликанье по страницам! )
SEOVirus [30.05.08 08:08] | Reply
Это верно конечно!
Лингуд [13.06.08 16:56] | Reply
На редкость хороший блог: очень кратко и очень по делу -) Редкость.
nafik [15.06.08 19:48] | Reply
Лично я столкнулась с воровством контента напрямую и думаю, что большинство, все-таки против воровства - и не важно какой термин мы под это придумаем. Но с другой стороны, если тырят ваш контент - значит вы кому-то интересны?
SEOVirus [15.06.08 20:18] | Reply
Интересная интерпретация вопроса
В общем-то цель данной статьи не только, чтобы показать как воруют контент, но так же и приобрести навыки программирования НЕ ПО ВОРОВСТВУ контента. А применимы такие навыки практически при любой работе с контентом.
Astat [23.06.08 18:14] | Reply
Насколько я понял так можно парсить и RSS ленты? одну или несколько , заносить в массив и далее у себя выкладывать на сайте (допустим новости). Постоянно будет свежий контент.
SEOVirus [24.06.08 00:20] | Reply
Конечно, можно парсить и РСС фиды. В том числе и так как Вы сказали можно сделать.
VolCh [06.07.08 05:33] | Reply
никак с этими регекспами не разберусь толком, хотя c PHP уже много лет работаю, проще, блин, XSLT для меня нарисовать, всегда старалсяя регэкспов избегать
Просто как в примере очень редко бывает, тем более если парсить нужно не внутри одного тега, а ту же статью разбивать на несколько частей смысловых (титл, тизер, тело например). Для меня проблема при работе с PCRE это типа как вырезать именно тот тег P, который лежит внутри div’a, , который 7-ой по счету после body причем контента между div’ом и p, и между body и div’ом может быть по разному (новости, например, или метадаты разные)
SEOVirus [06.07.08 22:36] | Reply
Ну регэкспы зря избегаете - очень полезная штука.
Конкретно по Вашему примеру - да, такое сходу и не скажешь как парсить надо
Отсчитывать прийдётся. Либо находить какие-то принципиальные отличия нужных блоков с контентом.
VolCh [07.07.08 06:52] | Reply
Не то чтобы совсем их не использую, готовые копипастю да правлю чутка
А вот со сложными никак не подружиться. Сейчас вот еще одну попытку делаю освоить их, опять заткнулся, вроде элементарно должно быть, а не получается, всю ночь просидел над
SEOVirus [07.07.08 07:56] | Reply
Ну в Вашем случае прокатит и такой паттерн:
$str=’<body>text<table><tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr></table>text</body>’;
$pattern=’#<td>(.*)</td>#sUS’;
preg_match_all($pattern,$str,$matches,PREG_SET_ORDER);
print_r ($matches);
Но я как понимаю, Вы хотите ещё параллельно и вхождение в тэг таблицы проверить?
VolCh [07.07.08 18:53] | Reply
Ну пример утрирован, по конкретной задаче одна из многих, там выбираю по контексту, но, как мне на том форуме ответили, одной регуляркой в принципе не обойтись, то есть двухмерный массив не создать так просто, типа рекурсии нужно, сначала выбрать саму таблицу (если она не одна), потом ее строки, а потом ячейки.
Samoslov [27.07.08 18:11] | Reply
А автоматическая проверка обратных ссылок на сайт тоже парсингом реализуется или как?
Дмитрий [05.09.08 14:34] | Reply
Интересный материал. Нужно попробовать под что нибудь “заточить”:) Наприме, под тот же парсинг rss-фидов:)
SEOVirus [11.09.08 05:52] | Reply
..Ну да, сложного в этом-то ничего нет.
Хотя, если парсить XML, то для этих целей в РНР 5 существует готовое решение - SimpleXML.
В справке можно посмотреть вот эту функцию: simplexml_load_file.
AxioS [29.10.08 17:57] | Reply
Спасибо, очень удобно. Нада бы теперь разобраться с парсингом беков…
Алексей [09.11.08 00:56] | Reply
Нужно заметить, что парсинг бывает не только для кражи контента. Можно парсить вордстат яндекса или статистику по поисковым словам от ливинтернета. Вообще, ливинтернет со своей статистикой - это просто кладезь. Можно например посмотреть ключевики по одной выбранной теме, например “музыка” или “спорт”. Как идея для нового парсера?
TaunT [19.11.08 17:46] | Reply
слишком просто пример
обычно тырят целиком весь сайт, а там тэгов очень много и разных
и не прегом а через dom
Технолог [21.11.08 18:50] | Reply
При парсинге RSS фидов тянуть надо не контент, а ссылку, которая указывает на страницу с основным материалом. Затем, следует сделать переход и уже парсить контент страницы сайта-донора.
Только затачивать надо парсер в каждом конкретном случае индивидуально под сайт.
В общем, имея навыки работы с регулярными выражениями и с сокетами можно состряпать грабилку на любой вкус.
tetis [03.12.08 11:17] | Reply
Знаете, если бы не парсеры + CURL, как тогда крупные сайты делать. Например захлтел на сайт вставить вопрос-ответ - спарсил с сайта 13000 вопросов-ответов, пронал через синонимайзер и получил неплохой контент. Так и трафик потечет с поисковика, причем качественный траф.
Технолог [08.12.08 20:08] | Reply
Знание правил составления регулярных выражений - мощное оружие не только программиста, но и вебмастера. К сожалению, для меня этот материал - трудноизучаемый((. Вот , как мне кажется, необходимо продолжить тему, но только применительно к защите контента.
Доктор Портфолиус [01.03.09 05:16] | Reply
Насчет парсинга при помощи DOM подробнее не подскажете?
Vit [25.06.09 13:59] | Reply
Вопрос от чайника.
Положил в корень сайта файл по Вашему образцу, озаглавил parser.php, далее в папку my_site положил хтмл-файлы. Ничего не срабатывает - пустая страница.
SEOVirus [25.06.09 20:06] | Reply
По корню - смотрите error.log если есть, скорее всего какие-то ошибки.
denStat [15.01.10 11:54] | Reply
Да неплохо надо будет попробовать, PHP я конечно не наполную шарю но знания С/C++ немного есть. Напишу свой первый парсер контента. Спасибо за совет пригодиться.
peter [23.03.10 16:53] | Reply
Одмин убери внешнюю ссылку в капчи!
Замени её на обновление кода с кнопки
Alexandr [03.04.10 13:36] | Reply
а как обходить-то сайты.
есть же какая-то функция,распознающая существующие адреса.
или всё в цикле-методом перебора всех вариантов-это-же очень долго и требует немалого времени и траффика?
если есть така функция,буду рад получить её на адрес drevo-laz@ya.ru
Александр [27.04.10 17:45] | Reply
Где бы мне парсер поисковой выдачи бесплатный найти. Мож у кого есть скинте на мыло если не жалко hotkotak@yahoo.com
Redlex [23.05.10 19:29] | Reply
Вот, хорошие ребята написали хорошую штуку, чтобы не мучаться с регулярными выражениями, с помощью этой штуки можно вырезать именно тот тег после div’а, который седьмой после body))
fioricet [11.06.10 00:55] | Reply
достали эти парсеры ни хрена не работает!
SEOVirus [11.06.10 14:35] | Reply
fioricet
Вы извините конечно, но - голова у вас нихрена не работает. Что там не рабочего, скажите? Тысячу раз люди проверяли на практике - у всех всё работает. Учитесь программировать, а не писать такие комменты.
smit [14.09.10 23:35] | Reply
книжка хорошая есть “php5 для чайников” с нее и нужно начинать, что бы хоть немного понимать)) Автору респект за статью - полезная, все по делу!
GoShirts [23.10.10 09:32] | Reply
А что мешает не придумывать велосипед а распарсивать чем-то вроде программ(уже готовых)