X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Пишем собственный парсер. PHP для упрощения SEO задач.
disiyndel
disiyndel
Topic Starter сообщение 23.12.2014, 17:51; Ответить: disiyndel
Сообщение #1


Завсегдатай
*****

Группа: Active User
Сообщений: 762
Регистрация: 27.10.2009
Из: отборных зерен.
Поблагодарили: 219 раз
Репутация:   29  


Приветствую всех!
Несколько дней назад опубликовал пост в блоге по написанию парсера. Описывал на примере сбора liveinternet, но подобные вещи можно для любых целей использовать =)
Туториал расчитан на тех, кто немного щупал HTML/CSS и слышал о PHP. Сам скрипт вышел на 11 строчек. Надеюсь, будет полезно тем, кто хочет упростить/ускорить решение seo задач =)


Скачать готовый парсер с комментариями: http://heisenbrog.com/wp-content/uploads/2014/12/index.zip
Исходный пост (есть интересные комментарии): http://heisenbrog.com/pishem-sobstvennyj-p...iya-seo-zadach/
Поехали! )
-----

Думаю каждый seo-шник сталкивался с необходимостью обработать автоматически довольно большие объемы информации. И куда легче, быстрее и спокойнее сделать это самому, написав на коленке несложный скрипт за пол-часа.

В примере я приведу liveinternet и парсинг всех сайтов определенной тематики. Для полных новичков в программировании урок будет сложноват, но вполне реален для усвоения. Тем более, что по каждому из шагов дополнительно можно найти кучу информации.

0. Нужен PHP.
Для Windows-юзеров можно скачать: http://www.denwer.ru/
Для MacOS-юзеров советую MAMP (free-версии хватит): http://www.mamp.info/en/

1. Анализируем задачу.
У нас стоит цель взять url всех сайтов определенной тематики. Заходим для примера сюда: http://www.liveinternet.ru/rating/ru/genea...dex.html?page=1 и начинаем анализировать.

Цитата
1. Для отображения всех ссылок используется пагинация (всего 9 страниц)

2. Благодаря пагинации, страницы отличаются между собой по GET параметру page.
Т.е. для первой страницы адрес будет: http://www.liveinternet.ru/rating/ru/genea...dex.html?page=1.
А для девятой: http://www.liveinternet.ru/rating/ru/genea...dex.html?page=9

3. На каждой странице есть по 30 ссылок, которые нам и надо взять. Все ссылки обрамляются в одинаковом HTML-коде.


Код
<a name="kakzovut.ru"
target="_blank" onclick="cl(this)" href="http://www.kakzovut.ru/">
КакЗовут.Ру - Значение имени, мужские и женские имена
</a>


Для начала ставим цель спарсить 30 сайтов с одной страницы. Для этого нам нужны регулярные выражения.

2. Парсим html-код страницы.
Делается это при помощи функции file_get_contents. Таким образом весь html-код страницы будет в переменной $url.

Код
$cat = "http://www.liveinternet.ru/rating/ru/genealogy/index.html?page=1"
$url = file_get_contents($cat);


3. Регулярные выражения.
Досконально изучить регулярные выражения с нуля за один мини-урок точно не успеем. Я оставлю тут 3 ссылки, которые помогут всем желающим полностью войти в курс дела и понять их:
http://phpfaq.ru/regexp
http://ru2.php.net/manual/ru/reference.pcr...tern.syntax.php
http://dreamhelg.ru/2010/02/15-regular-exp...web-developers/

Поскольку мы заметили, что у всех ссылок есть один общий шаблон:

Код
<a name="kakzovut.ru"


то регулярное выражение, позволяющее их “выцепить” будет таким:

Код
preg_match_all('/<a name="(.*)"/', $url, $mathces);


В итоге все адреса сайтов помещаются в многомерный массив $matches.

3. Сохранение в файл.
Все наши результаты стоит сохранить в файл, т.к. выводить тысячи страниц в браузере не комильфо.
О работе с файлами на php можно почитать тут:
http://www.php.su/articles/?cat=fs&page=005

А “скелет” сохранения в файл будет таким:

Код
$file = fopen("result.txt", "a+"); // открываем файл с записью в конец
fwrite ($file, $domain."\n"); // записываем с новой строчки
fclose($file); // закрываем соединение


4. Парсим все.
Вообще, по-хорошему, для такой задачи стоит изпользовать cron-демон. Он будет автоматически запускать ваш скрипт, php при каждом запуске будет увеличивать счетчик страниц на одну и сохранять, и так каждую минуту до последней страницы. Также можно использовать CLI - запуск php скриптов из командной строки. На MacOS/ Linux такая штука работает. На Windows - хз, возможно есть консольные способы.

Но поскольку тут только 9 страниц, и что бы не усложнять туториал сделаем небольшой рабочий хардкод >_<

А именно запустим все в браузере, а в php поставим обычный цикл "for" на 9 страниц. Для девяти страниц за раз этот цикл отработает нормально.

Итого выходит рабочий код на 11 строчек :)
Код
<?php
$cat = "http://www.liveinternet.ru/rating/ru/genealogy/index.html?page="; // шаблон url для загрузки страницы. В цикле, в конце этой строки, подставляется номер страницы.
$file = fopen("result.txt", "a+"); // открываем файл для записи результатов

for ($j = 1; $j<=9; $j++) { //  запускаем цикл на 9 страниц
    $url = file_get_contents($cat.$j); // парсим каждую страницу в цикле от первой до девятой
    preg_match_all('/<a name="(.*)"/', $url, $mathces); // регуляркой вытаскивам нужные url и помещаем в массив $matches

    $count = count($mathces[0]); // считаем количество полученных url (в данном случае тридцать
    for ($i = 0; $i<$count; $i++) {
        fwrite ($file, $mathces[1][$i]."\n"); // Записываем в файл результаты, каждый с новой строчки.
    }
}
fclose($file);
?>


В итоге все 248 сайтов рубрики окажутся у вас в файле result.txt.
В следующей статье расскажу про интересный способ применения конкретно этого скрипта.

Сообщение отредактировал disiyndel - 23.12.2014, 17:58


--------------------
http://heisenbrog.com - только цифры, факты и эксперименты.
4
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
x64
x64
сообщение 23.12.2014, 18:11; Ответить: x64
Сообщение #2


F.A.L.L.O.U.T.
*******

Группа: Super Moderator
Сообщений: 3424
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2744 раза
Репутация:   289  


Цитата(disiyndel @ 23.12.2014, 16:51) *
preg_match_all('/<a name="(.*)"/', $url, $mathces);

это жесть.
1. слишком большая и совершенно ненужная нагрузка на сервер.
2. жадность квантификатора не ограничена (дополнительная нагрузка, т. к. ищется наибольшее совпадение), значит, если ссылка имеет вид:
Код
<a name="123" href="http://maultalk.com/">

будет выбран вариант:
Код
123" href="http://maultalk.com/


быстрее уж через explode('<a name="', $url) + вырезание в цикле от начала до " (либо ещё одно explode('"', $part)).
ещё быстрее — strpos() + substr()

Сообщение отредактировал x64 - 23.12.2014, 18:15


--------------------


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
disiyndel
disiyndel
Topic Starter сообщение 23.12.2014, 18:14; Ответить: disiyndel
Сообщение #3


Завсегдатай
*****

Группа: Active User
Сообщений: 762
Регистрация: 27.10.2009
Из: отборных зерен.
Поблагодарили: 219 раз
Репутация:   29  


x64,
Код
<a name="123" href="http://maultalk.com/">

Такой вид ссылка в этом случае точно не имеет.

Предложите вариант лучше =)


--------------------
http://heisenbrog.com - только цифры, факты и эксперименты.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
x64
x64
сообщение 23.12.2014, 18:19; Ответить: x64
Сообщение #4


F.A.L.L.O.U.T.
*******

Группа: Super Moderator
Сообщений: 3424
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2744 раза
Репутация:   289  


лучше? что угодно, без регулярных выражений.
регулярки целесообразно использовать на конечные куски текста, а не «сколько получил, с тем и работаю»


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
disiyndel
disiyndel
Topic Starter сообщение 23.12.2014, 18:30; Ответить: disiyndel
Сообщение #5


Завсегдатай
*****

Группа: Active User
Сообщений: 762
Регистрация: 27.10.2009
Из: отборных зерен.
Поблагодарили: 219 раз
Репутация:   29  


Цитата
быстрее уж через explode('<a name="', $url) + вырезание в цикле от начала до " (либо ещё одно explode('"', $part)).
ещё быстрее — strpos() + substr()


Можно и так. Даже лучше.

Но в данном случае вопрос не стоит в скорости работы.
Регуляркой выходит лаконичнее что-ли. Другой человек в мешанину из строковых функций будет втыкать, а регуляркой нагляднее выходит.

Если парсить огромные объемы - по-любому надо проводить бенчмарки.

Сообщение отредактировал disiyndel - 23.12.2014, 18:42


--------------------
http://heisenbrog.com - только цифры, факты и эксперименты.


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Vladimir-AWM
Vladimir-AWM
сообщение 23.12.2014, 21:46; Ответить: Vladimir-AWM
Сообщение #6


Участник
***

Группа: User
Сообщений: 236
Регистрация: 7.2.2010
Из: Челябинск
Поблагодарили: 62 раза
Репутация:   16  


Цитата(x64 @ 23.12.2014, 17:11) *
preg_match_all('/<a name="(.*)"/', $url, $mathces);


Код
preg_match_all('/<a name="([^"]+)"/', $url, $mathces);


--------------------


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
I_know
I_know
сообщение 24.12.2014, 8:22; Ответить: I_know
Сообщение #7


Участник
***

Группа: User
Сообщений: 102
Регистрация: 7.12.2014
Поблагодарили: 36 раз
Репутация:   10  


Все велосипеды давно придуманы. Мой любимый PHP Simple HTML DOM Parser.

Сообщение отредактировал I_know - 24.12.2014, 8:24


--------------------


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Vladimir-AWM
Vladimir-AWM
сообщение 24.12.2014, 10:06; Ответить: Vladimir-AWM
Сообщение #8


Участник
***

Группа: User
Сообщений: 236
Регистрация: 7.2.2010
Из: Челябинск
Поблагодарили: 62 раза
Репутация:   16  


Я по прывычки всегда регулярками пользуюсь, т.к. для моих целей их вролне хватает. Для большого парсинга и малого кол-во системных ресурсов лучше воспользоваться PHP Simple HTML DOM Parser.

Как я понял ТС для новичков написал данную статью. PHP Simple HTML DOM Parser конечно хорошо, но тут еще новичкам придется подключать доп. библиотеку, знать начальные сведения о DOM и классах что усложнит задачу.

На PHP Simple HTML DOM Parser так получается (скачать simple_html_dom.php http://sourceforge.net/projects/simplehtmldom/):

Код
include("simple_html_dom.php");

$cat = "http://www.liveinternet.ru/rating/ru/genealogy/index.html";

$url = file_get_contents($cat);

$html = str_get_html($url);

$mathces = array();

foreach($html->find('a[name=]') as $link) {
      $mathces[] = $link->href;
}

print_r($mathces);


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Solonik
Solonik
сообщение 24.12.2014, 10:26; Ответить: Solonik
Сообщение #9


Старожил
******

Группа: Active User
Сообщений: 1358
Регистрация: 29.10.2009
Из: г.Москва
Поблагодарили: 338 раз
Репутация:   89  


А я вместо print_r() использую var_dump(); :popcorn2: Ребят есть 100 вариантов решения задачи. Главное результат = работает. И можно вечно обсуждать как лучше придет другой и скажет, что он считает что так лучше.


--------------------


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Sanasol
Sanasol
сообщение 25.12.2014, 4:15; Ответить: Sanasol
Сообщение #10


Участник
***

Группа: User
Сообщений: 111
Регистрация: 9.7.2013
Из: Санкт-Петербург
Поблагодарили: 47 раз
Репутация:   6  


Такой жирный профиль на фрилансе у ТСа, но такой говнокод пишет, как-то не складывается вообще это вместе.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Куплю домен для склейки
3 Natali2110 546 Сегодня, 21:35
автор: Natali2110
Открытая тема (нет новых ответов) Требуются рерайтеры для медицинского сайта
30 руб за 1000 рерайта
14 Lisel85 2691 Сегодня, 19:38
автор: Lisel85
Открытая тема (нет новых ответов) GALAKSION – оптимальный вариант для монетизации вашего сайта!
23 Galaksion_Network 2429 Сегодня, 19:17
автор: Galaksion_Network
Открытая тема (нет новых ответов) Ищу платёжный агрегатор для работы с физ. лизами (не ИП)
21 SergeiVL 2630 Сегодня, 16:26
автор: BestExchangers
Горячая тема (нет новых ответов) Букварикс - бесплатная программа для быстрого подбора ключевых слов
150 Bukvarix 73761 Сегодня, 16:20
автор: Smspva


 



RSS Текстовая версия Сейчас: 12.12.2017, 22:16
Дизайн