Как написать граббер » lamara-nsk.ru


lamara-nsk.ru
Это блог о сео, деньгах, заработке в сети, разработке своих проектов, программировании
и "жизни программиста", бизнесе, блогосфере, фрилансе и многом другом.


Контакты, Реклама в блоге




Как написать граббер

Автор DimoninG, написано 18.12.2008
Рубрика на PHP  

Хочу рассказать вам о том, как написать граббер. Напишем простой граббер на PHP, который грабит, нууу… скажем заголовок (title) страницы и записывает нам в базу данных. Таким образом не сложно написать любой граббер, который можно вмонтировать в любой движок. Когда я писал этот пост, у меня было постоянное дежавю. А дело в том, что недавно я написал статью о том, как сделать собственный счетчик. Но основные моменты там очень похожи, поэтому советую прочитать и ту статью тоже.

Любой граббер состоит из нескольких кусков:

1. подключение к странице-донору
2. скачивание исходного кода
3. вытаскивание нужного фрагмента (самый сложный этап)
4. запись вытащенного фрагмента в базу данных/файл или куда-то еще

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

1. Подключение к странице-донору.

В PHP есть несколько способов сделать это. Я покажу самый простой. Теоретически он работает не везде (иногда на хостинге запрещен этот метод), но я еще такого хостинга не видел. Например, подключаемся к блогам яндекса:


$sock = fopen ('http://blogs.yandex.ru/top/?page=1', 'r');
if (!$sock){
echo "Не получилось подключиться к yandex.";
}else{
}
fclose ($sock);

То есть мы открываем страницу, будто это обычный файл! Легко и приятно. Если страница не открылась, нам покажет ошибку, а если открылась, исполнится код в else.

2. Чтение исходника.

Дальше нужно прочитать исходный код страницы. Опять же не сложно. В цикле читаем всю информацию:


else{
    $html = '';
    while (!feof($sock)){
        $html .= fgets($sock);
    }
}

Соответственно исходник страницы у нас будет в $html, а вывести его можно с помощью htmlspecialchars ($html).

3. Вытаскивание нужного фрагмента.

Это самый сложный момент во всей программе. Дело в том, что для его осуществления нужно знать регулярные выражения PHP. Изучить подробнее их можно в гугле. Но для нашего случая ничего сверх-умного не нужно. А именно:


preg_match('|(.*)<title>(.*)</title>|is', $html, $data);
print_r ($data);

Подробнее об это функции можно почитать тут.

4. Запись вытащенного значения.

Тут вообще все просто и конкретная реализация зависит от Ваших потребностей. Например, если нужно записать данные в блог на ВП, записывайте их в таблицу wp_posts. В нашем примере вытащенные данные хранятся в $data[1], поэтому запись может выглядеть так:


mysql_query ("INSERT INTO content VALUES (0, '".$data[1]."');")
    or die(mysql_error());

И помните – авторские права нужно соблюдать, поэтому граббер написан в образовательных целях для автоматизации рутинной работы (например, вытащить ссылки на блоги из ЯндексБлогов).

Постовой: Новые гаджеты



Отзывов (35) на «Как написать граббер»


ae471697

    пишет:

    Использовать fopen не очень удобно, так как нельзя контролировать время соединения, получать ответы ошибок сервера и т.д. Нельзя также запрашивать страничку с передачей POST-данных. Я лично пользую cURL, ну или сокетами если cURL не доступно.


    пишет:

    Алексей Качаев, так и есть, Вы совершенно правы. Просто это самый простой способ, а я для новичков пишу в основном.


    пишет:

    Я согласен с Алексеем. cURL значительно лучше. Более того, на некоторых хостингах запрещен fopen через http


    пишет:

    На таких сайтах, обычно, и cURL запрещен ;)


    пишет:

    гм.. $str=file_get_contents(«http://google.com/»);
    – и никаких проблем и заморочек с циклами и проверками)

    Курл, конечно, мощнее будет, но он громоздкий… Хотя, иногда без него не обойтись (гораздо проще отправлять POST запросы, через прокси работать, SSL пробивать и т.д.)

    Да, а вот с регулярками у меня проблемы ((( Иногда чтобы не мучится размочаливаю страницу всякими explode() и примитивными eregi (( медленней конечно, но увы – в регулярках что-то выше среднего я уже не разбираюсь..


    пишет:

    Spryt, file_get_contents – это fopen, fread, fclose одной командой. cURL быстрее. я у себя в блоге тест проводил что быстрее.
    Смотреть тут. Не сочтите за рекламу.

    Вместо eregi для ускорения пользуйтесь preg_…


    пишет:

    Для таких целей лучше перл использовать, имхо.


    пишет:

    mysql_query ("INSERT INTO content VALUES (0, '".$data[1]."');")

    Если в образовательных целях, то не забываем про addslashes().

    ЗЫ – а регэксп в примере-то жадный…


    пишет:

    Добрый день!!
    вот, что я хочу сделать:
    есть картинка (http://www.calend.ru/img/export/informer.png), мне нужно ее граббить на сервак в /usr/local/www/apache22/data/uploads/
    я потом в кроне пропишу, что раз в сутки.. (и будет ли она заменяться новой?)
    как сделать, чтобы эта картинка копировалась на сервер?

    вот пробовал этот код, но не работает….

    на uploads стоит 777

    за ранее спасибо!!!!


    пишет:

    Открываете (http://www.calend.ru/img/export/informer.png) для чтения в бинарном режиме, все читаете и сохраняете куда надо ;)


    пишет:

    Типа:

    $file = fopen («http://www.calend.ru/img/export/informer.png», «rb»);
    $c = «»;
    while (!foef ($file)){
    $c .= fread ($file, 256);
    }
    fclose ($file);

    и аналогично сохраняем.


    пишет:

    а можно весь скрипт, если не трудно???
    не в PHP полный ноль))


    пишет:

    Держите:

    $file = fopen («http://www.calend.ru/img/export/informer.png», «rb»);
    $c = «»;
    while (!feof ($file)){
    $c .= fread ($file, 256);
    }
    fclose ($file);

    $file = fopen («/usr/local/www/apache22/data/uploads/informer.png», «wb»);
    fwrite ($file, $c);
    fclose ($file);

    Я проверил, у меня работает.


    пишет:

    за рание спасибо, просто я правда сам не сделаю… :cry:


    пишет:

    честно говоря не работает(((
    создал файл load.php
    в него вписал

    запускаю файл через http://………load.php

    картинка в каталоге не появляется.(( что я делаю не так, или в чем проблема??


    пишет:

    все работает, просто «(ковычки) скопировались на так…
    БОЛЬШОЕ ВАМ СПАСИБО!!!!!!!!!!!


    пишет:

    Да не за что ) Я про кавычки, кстати, не подумал, рад, что Вы заметили ;)


    пишет:

    Сорри, за наглость но ,если можете, напишите скрипт, с помощью которого можно накладывать вотермарку на конкретный рисунок.
    есть на сайте рисунок 189 x 408 пикселей и скажем в самом верху на него нужно накладывать другой рисунок

    за ранее спасибо за ответ!!


    пишет:

    Zen, полистайте мой блог, я как-то писал, как накладывать вотермарку.


    пишет:

    У меня есть готовый граббер он грабит инфу с 3 сайтов погоды
    именно инфу на сегоднийний день, но вот проблема один сайт чтото у себя поменял и в граббере он неработает кто бы мог его подправить?)


    пишет:

    Никита, пишите мне в ICQ 361 266 067 или на почту dimoning@inbox.ru, сделаем.


    пишет:

    доброго времени суток,пожалуйста помогите
    суть проблемы такова: есть переменная в которой хранится исходный код страницы,мне нужно выбрать несколько фрагментов находящихся между 123456789 и 987654321. помогите пожалуйста составить регулярное выражение
    я делаю следующим образом
    preg_match_all(‘/(?<=123456789)(.*)(?=987654321)/iU’,$s,$text)
    но почему то не получаю результата
    для связи можно в icq 461912916


    пишет:

    Спасибо за примеры, особенно за пример с картинкой и fopen


    пишет:

    Подскажите, пожалуйста, как сделать скрипт для граббинга каталога диссертаций например с этого сайта http://diss-shop.ru/


    пишет:

    Очень хорошая тема и топик… Аналогично, хочу сделать граббер Академики, Википедии и подобных ресурсов для составления архива слов с дальнейшей их ручной корректировкой, уже вторую неделю изучаю пхп, выучил массивы и начал MySQL, но встает сотня вопросов, как реализовать готовый прототип…

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

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


    пишет:

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


    пишет:

    Grabberhater , если учесть, что инфу можно стырить вручную, но в конечном итоге ничего не поможет. Против автоматов ставьте капчу, остальное все довольно легко ломается.


    пишет:

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

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

    И ещё такой вот вопрос.
    А если я узнаю ip адрес сервера, где находится сайт-вор, можно как нибудь закрыть доступ ему, ведь граббер же с сайта того запускается, может ему как-нить доступ закрыть.
    А то вчера четыре новых статьи добавил – те сайты уже в топе выдачи по запросу у гугла, а моего сайта нет – обидно :(


    пишет:

    Grabberhater, чтобы поставить капчу, Вам точно нужен будет программист. Нужно сделать так: если с одного IP больше N запросов в минуту, то выводится капча с просьбой подтвердить, что это не робот. Можно дополнительно сделать и другую защиту. Обратиться можете, например, ко мне.

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


    пишет:

    Я ваш блог читаю часто.
    Сначала сам попробую этих гадов прибить :)
    Если не получится, то обращусь к вам :)


    пишет:

    Спасибо За столь поучительную инфу. :roll:


    пишет:

    $file=file_get_contents(‘http://site.ru?’.$_SERVER['QUERY_STRING']);
    $file=str_replace(»,»,$file);
    echo $file;


    пишет:

    2 строка в скобках «что меняем»,»на что меняем» соответсвенно. Например ссылки


    пишет:

    DimoninG :mrgreen: ты пишешь не для новичков а для долбо*ёбов. Которые в этой теме 200 рас спрося а как а шо а не работает. Не пиши ху* ню пиши на чистом php и нормально излагай код


    пишет:

    спасибо за инфу, попробовал на вашем примере.
    А что делать, если нужно сграббить инфу с сайта, где вход с логином и паролем?


Оставьте свой комментарий

Что здесь почитать?



1.   Разработки.
1.1 Плагин "Я не робот"
1.2 Плагин "Код Adsense прямо в пост"

2.   Заработай.
2.1 Блогун: 20$ в день
2.2 Уходим от налогов в Sape
2.3 Хватит думать, пора зарабатывать

3.   Акции и конкурсы.
3.1 Ссылка за "Рабочий стол"

Показать весь список.

-->







Блог на движке WordPress и тема для него создана DimoninG'ом в 2007 году.
Все материалы авторские, их копирование запрещено законом об авторском праве.