Хотите получать новые советы по заработку и раскрутке сайтов? !
Не знаете как подписаться? Читайте здесь!

Парсинг - легко и доступно! Мастер-класс от 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();

Вот и все чудеса! Таким образом народ и парсит Ваши сайты. Теперь Вы знаете как они это делают, теперь Вы знаете как защититься от этого.

Любые вопросы и замечания - приветствуются!


  1. 37 Responses to “Парсинг - легко и доступно! Мастер-класс от SEOVirus’a.”

  2. r7 [27.05.08 01:09] | Reply

    т.е. чтоб не украли контент надо вставить код с 3 рисунка? я правильно понял?

  3. SEOVirus [27.05.08 09:29] | Reply

    Нет.. Я имел ввиду, что попытки кражи контента так и будут продолжаться, от них никуда не деться.

    Пока крадут Ваш контент, часто не обращают внимания на то, что крадут - соответственно, если в контенте стоит реклама - украдут Ваш контент, Вам же на пользу ;)

    Второй момент это изменяющая структура контента при которой украсть контент просто не получится. Как видите крадут часто по шаблонному коду, а если его не будет, то и ориентироваться не на что (откуда и докуда воровать). Соответственно - ничего и не получится.

    В скором времени я напишу статью о некотором методе кражи контента, который народ старается не офишировать. Там же мозговой штурм будет поинтереснее :)

    Я тут так уверенно высказываюсь о всяких кражах контента и т.д. Хочу сразу заметить, что я не вор контента и не копипастер. Я программист, который кое-чего понимает в программинге ;) (ну и параллельно осведомлён о многих интересных методах работы СЕОшников).

  4. Mega строитель [29.05.08 17:28] | Reply

    Самое главное не указали, можно же даже автоматизировать кликанье по страницам! )

  5. SEOVirus [30.05.08 08:08] | Reply

    Это верно конечно!

  6. Лингуд [13.06.08 16:56] | Reply

    На редкость хороший блог: очень кратко и очень по делу -) Редкость.

  7. nafik [15.06.08 19:48] | Reply

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

  8. SEOVirus [15.06.08 20:18] | Reply

    Интересная интерпретация вопроса :)

    В общем-то цель данной статьи не только, чтобы показать как воруют контент, но так же и приобрести навыки программирования НЕ ПО ВОРОВСТВУ контента. А применимы такие навыки практически при любой работе с контентом.

  9. Astat [23.06.08 18:14] | Reply

    Насколько я понял так можно парсить и RSS ленты? одну или несколько , заносить в массив и далее у себя выкладывать на сайте (допустим новости). Постоянно будет свежий контент.

  10. SEOVirus [24.06.08 00:20] | Reply

    Конечно, можно парсить и РСС фиды. В том числе и так как Вы сказали можно сделать.

  11. VolCh [06.07.08 05:33] | Reply

    никак с этими регекспами не разберусь толком, хотя c PHP уже много лет работаю, проще, блин, XSLT для меня нарисовать, всегда старалсяя регэкспов избегать :)
    Просто как в примере очень редко бывает, тем более если парсить нужно не внутри одного тега, а ту же статью разбивать на несколько частей смысловых (титл, тизер, тело например). Для меня проблема при работе с PCRE это типа как вырезать именно тот тег P, который лежит внутри div’a, , который 7-ой по счету после body причем контента между div’ом и p, и между body и div’ом может быть по разному (новости, например, или метадаты разные)

  12. SEOVirus [06.07.08 22:36] | Reply

    Ну регэкспы зря избегаете - очень полезная штука.

    Конкретно по Вашему примеру - да, такое сходу и не скажешь как парсить надо :) Отсчитывать прийдётся. Либо находить какие-то принципиальные отличия нужных блоков с контентом.

  13. VolCh [07.07.08 06:52] | Reply

    Не то чтобы совсем их не использую, готовые копипастю да правлю чутка :)

    А вот со сложными никак не подружиться. Сейчас вот еще одну попытку делаю освоить их, опять заткнулся, вроде элементарно должно быть, а не получается, всю ночь просидел над

  14. 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);

    :)
    Но я как понимаю, Вы хотите ещё параллельно и вхождение в тэг таблицы проверить?

  15. VolCh [07.07.08 18:53] | Reply

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

  16. Samoslov [27.07.08 18:11] | Reply

    А автоматическая проверка обратных ссылок на сайт тоже парсингом реализуется или как?

  17. Дмитрий [05.09.08 14:34] | Reply

    Интересный материал. Нужно попробовать под что нибудь “заточить”:) Наприме, под тот же парсинг rss-фидов:)

  18. SEOVirus [11.09.08 05:52] | Reply

    ..Ну да, сложного в этом-то ничего нет.

    Хотя, если парсить XML, то для этих целей в РНР 5 существует готовое решение - SimpleXML.
    В справке можно посмотреть вот эту функцию: simplexml_load_file.

  19. AxioS [29.10.08 17:57] | Reply

    Спасибо, очень удобно. Нада бы теперь разобраться с парсингом беков…

  20. Алексей [09.11.08 00:56] | Reply

    Нужно заметить, что парсинг бывает не только для кражи контента. Можно парсить вордстат яндекса или статистику по поисковым словам от ливинтернета. Вообще, ливинтернет со своей статистикой - это просто кладезь. Можно например посмотреть ключевики по одной выбранной теме, например “музыка” или “спорт”. Как идея для нового парсера?

  21. TaunT [19.11.08 17:46] | Reply

    слишком просто пример
    обычно тырят целиком весь сайт, а там тэгов очень много и разных
    и не прегом а через dom

  22. Технолог [21.11.08 18:50] | Reply

    При парсинге RSS фидов тянуть надо не контент, а ссылку, которая указывает на страницу с основным материалом. Затем, следует сделать переход и уже парсить контент страницы сайта-донора.

    Только затачивать надо парсер в каждом конкретном случае индивидуально под сайт.
    В общем, имея навыки работы с регулярными выражениями и с сокетами можно состряпать грабилку на любой вкус.

  23. tetis [03.12.08 11:17] | Reply

    Знаете, если бы не парсеры + CURL, как тогда крупные сайты делать. Например захлтел на сайт вставить вопрос-ответ - спарсил с сайта 13000 вопросов-ответов, пронал через синонимайзер и получил неплохой контент. Так и трафик потечет с поисковика, причем качественный траф.

  24. Технолог [08.12.08 20:08] | Reply

    Знание правил составления регулярных выражений - мощное оружие не только программиста, но и вебмастера. К сожалению, для меня этот материал - трудноизучаемый((. Вот , как мне кажется, необходимо продолжить тему, но только применительно к защите контента.

  25. Доктор Портфолиус [01.03.09 05:16] | Reply

    Насчет парсинга при помощи DOM подробнее не подскажете?

  26. Vit [25.06.09 13:59] | Reply

    Вопрос от чайника.
    Положил в корень сайта файл по Вашему образцу, озаглавил parser.php, далее в папку my_site положил хтмл-файлы. Ничего не срабатывает - пустая страница.

  27. SEOVirus [25.06.09 20:06] | Reply

    По корню - смотрите error.log если есть, скорее всего какие-то ошибки.

  28. denStat [15.01.10 11:54] | Reply

    Да неплохо надо будет попробовать, PHP я конечно не наполную шарю но знания С/C++ немного есть. Напишу свой первый парсер контента. Спасибо за совет пригодиться.

  29. peter [23.03.10 16:53] | Reply

    Одмин убери внешнюю ссылку в капчи!
    Замени её на обновление кода с кнопки

  30. Alexandr [03.04.10 13:36] | Reply

    а как обходить-то сайты.
    есть же какая-то функция,распознающая существующие адреса.
    или всё в цикле-методом перебора всех вариантов-это-же очень долго и требует немалого времени и траффика?
    если есть така функция,буду рад получить её на адрес drevo-laz@ya.ru

  31. Александр [27.04.10 17:45] | Reply

    Где бы мне парсер поисковой выдачи бесплатный найти. Мож у кого есть скинте на мыло если не жалко hotkotak@yahoo.com

  32. Redlex [23.05.10 19:29] | Reply

    Вот, хорошие ребята написали хорошую штуку, чтобы не мучаться с регулярными выражениями, с помощью этой штуки можно вырезать именно тот тег после div’а, который седьмой после body))

  33. fioricet [11.06.10 00:55] | Reply

    достали эти парсеры ни хрена не работает!

  34. SEOVirus [11.06.10 14:35] | Reply

    fioricet
    Вы извините конечно, но - голова у вас нихрена не работает. Что там не рабочего, скажите? Тысячу раз люди проверяли на практике - у всех всё работает. Учитесь программировать, а не писать такие комменты.

  35. smit [14.09.10 23:35] | Reply

    книжка хорошая есть “php5 для чайников” с нее и нужно начинать, что бы хоть немного понимать)) Автору респект за статью - полезная, все по делу!

  36. GoShirts [23.10.10 09:32] | Reply

    А что мешает не придумывать велосипед а распарсивать чем-то вроде программ(уже готовых)

  1. 2 Trackback(s)

  2. Jun 1, 2008: SEOVirus.RU » Blog Archive » Автоматическая подсветка любого кода в блогах и HTML документах
  3. Jun 22, 2008: Пишем парсер на php

Post a Comment

Security Code: