|
Хочу рассказать вам о том, как написать граббер. Напишем простой граббер на 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());
И помните – авторские права нужно соблюдать, поэтому граббер написан в образовательных целях для автоматизации рутинной работы (например, вытащить ссылки на блоги из ЯндексБлогов).
Постовой: Новые гаджеты
Оставьте свой комментарий
|
18.12.2008 в 9:19 пп
Использовать fopen не очень удобно, так как нельзя контролировать время соединения, получать ответы ошибок сервера и т.д. Нельзя также запрашивать страничку с передачей POST-данных. Я лично пользую cURL, ну или сокетами если cURL не доступно.
18.12.2008 в 10:39 пп
Алексей Качаев, так и есть, Вы совершенно правы. Просто это самый простой способ, а я для новичков пишу в основном.
19.12.2008 в 12:13 дп
Я согласен с Алексеем. cURL значительно лучше. Более того, на некоторых хостингах запрещен fopen через http
19.12.2008 в 10:22 пп
На таких сайтах, обычно, и cURL запрещен ;)
20.12.2008 в 10:53 дп
гм.. $str=file_get_contents(«http://google.com/»);
– и никаких проблем и заморочек с циклами и проверками)
Курл, конечно, мощнее будет, но он громоздкий… Хотя, иногда без него не обойтись (гораздо проще отправлять POST запросы, через прокси работать, SSL пробивать и т.д.)
Да, а вот с регулярками у меня проблемы ((( Иногда чтобы не мучится размочаливаю страницу всякими explode() и примитивными eregi (( медленней конечно, но увы – в регулярках что-то выше среднего я уже не разбираюсь..
20.12.2008 в 5:26 пп
Spryt, file_get_contents – это fopen, fread, fclose одной командой. cURL быстрее. я у себя в блоге тест проводил что быстрее.
Смотреть тут. Не сочтите за рекламу.
Вместо eregi для ускорения пользуйтесь preg_…
21.12.2008 в 11:49 дп
Для таких целей лучше перл использовать, имхо.
22.12.2008 в 6:58 пп
mysql_query ("INSERT INTO content VALUES (0, '".$data[1]."');")Если в образовательных целях, то не забываем про addslashes().
ЗЫ – а регэксп в примере-то жадный…
29.01.2009 в 5:24 пп
Добрый день!!
вот, что я хочу сделать:
есть картинка (http://www.calend.ru/img/export/informer.png), мне нужно ее граббить на сервак в /usr/local/www/apache22/data/uploads/
я потом в кроне пропишу, что раз в сутки.. (и будет ли она заменяться новой?)
как сделать, чтобы эта картинка копировалась на сервер?
вот пробовал этот код, но не работает….
на uploads стоит 777
за ранее спасибо!!!!
29.01.2009 в 5:33 пп
Открываете (http://www.calend.ru/img/export/informer.png) для чтения в бинарном режиме, все читаете и сохраняете куда надо ;)
29.01.2009 в 5:33 пп
Типа:
$file = fopen («http://www.calend.ru/img/export/informer.png», «rb»);
$c = «»;
while (!foef ($file)){
$c .= fread ($file, 256);
}
fclose ($file);
и аналогично сохраняем.
29.01.2009 в 6:12 пп
а можно весь скрипт, если не трудно???
не в PHP полный ноль))
29.01.2009 в 6:37 пп
Держите:
$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);
Я проверил, у меня работает.
29.01.2009 в 6:39 пп
за рание спасибо, просто я правда сам не сделаю… :cry:
29.01.2009 в 6:58 пп
честно говоря не работает(((
создал файл load.php
в него вписал
запускаю файл через http://………load.php
картинка в каталоге не появляется.(( что я делаю не так, или в чем проблема??
29.01.2009 в 7:19 пп
все работает, просто «(ковычки) скопировались на так…
БОЛЬШОЕ ВАМ СПАСИБО!!!!!!!!!!!
29.01.2009 в 8:30 пп
Да не за что ) Я про кавычки, кстати, не подумал, рад, что Вы заметили ;)
30.01.2009 в 10:29 дп
Сорри, за наглость но ,если можете, напишите скрипт, с помощью которого можно накладывать вотермарку на конкретный рисунок.
есть на сайте рисунок 189 x 408 пикселей и скажем в самом верху на него нужно накладывать другой рисунок
за ранее спасибо за ответ!!
30.01.2009 в 12:31 пп
Zen, полистайте мой блог, я как-то писал, как накладывать вотермарку.
14.04.2009 в 8:19 пп
У меня есть готовый граббер он грабит инфу с 3 сайтов погоды
именно инфу на сегоднийний день, но вот проблема один сайт чтото у себя поменял и в граббере он неработает кто бы мог его подправить?)
14.04.2009 в 8:23 пп
Никита, пишите мне в ICQ 361 266 067 или на почту dimoning@inbox.ru, сделаем.
18.04.2009 в 3:24 дп
доброго времени суток,пожалуйста помогите
суть проблемы такова: есть переменная в которой хранится исходный код страницы,мне нужно выбрать несколько фрагментов находящихся между 123456789 и 987654321. помогите пожалуйста составить регулярное выражение
я делаю следующим образом
preg_match_all(‘/(?<=123456789)(.*)(?=987654321)/iU’,$s,$text)
но почему то не получаю результата
для связи можно в icq 461912916
23.04.2009 в 8:02 пп
Спасибо за примеры, особенно за пример с картинкой и fopen
03.06.2009 в 2:55 пп
Подскажите, пожалуйста, как сделать скрипт для граббинга каталога диссертаций например с этого сайта http://diss-shop.ru/
04.06.2009 в 1:59 дп
Очень хорошая тема и топик… Аналогично, хочу сделать граббер Академики, Википедии и подобных ресурсов для составления архива слов с дальнейшей их ручной корректировкой, уже вторую неделю изучаю пхп, выучил массивы и начал MySQL, но встает сотня вопросов, как реализовать готовый прототип…
DimoninG, а на заказ подобные клепаете и какая может быть примерная стоимость оного (все тех. нюансы могу расписать) – мне для ориентира, потяну по копейкам или нет и какой срок может занять написание такого грабера?
Также интересно узнать, а возможно ли перелить все тех. свойства слов, например, в пояснениях к словам указываются их характеристики (род, число, сущ., глагол и т.д.) – все идет без обрамлений тегами, т.е. одной сплошной строчкой, но в скобках – (характеристики).
07.08.2009 в 1:02 пп
Здравствуйте.
А можете написать как наоборот блокировать грабберы, т.к. в отличие от некоторых отписавшихся, которые только тырят контент, я как раз этот контент создаю и такие прихлебаи заколебали.
С моего сайта уже четыре говноблога тянут информацию, дошло, что в гугле они на первом месте, а моего сайта вообще нет.
07.08.2009 в 2:02 пп
Grabberhater , если учесть, что инфу можно стырить вручную, но в конечном итоге ничего не поможет. Против автоматов ставьте капчу, остальное все довольно легко ломается.
07.08.2009 в 3:54 пп
Так вручную тяжело мой материал вынимать – картинок и графиков много и без них материал ценности не имеет, но поисковикам-то нужен текст, вот они граберами своими текст и вынимают.
Поэтому по запросам мой сайт не находится, а по картинкам на первом месте.
А что такое капча, можете дать ссылку где почитать или как она хоть правильно называется, а то я только одну капчу знаю, против спамеров :)
И ещё такой вот вопрос.
А если я узнаю ip адрес сервера, где находится сайт-вор, можно как нибудь закрыть доступ ему, ведь граббер же с сайта того запускается, может ему как-нить доступ закрыть.
А то вчера четыре новых статьи добавил – те сайты уже в топе выдачи по запросу у гугла, а моего сайта нет – обидно :(
07.08.2009 в 7:23 пп
Grabberhater, чтобы поставить капчу, Вам точно нужен будет программист. Нужно сделать так: если с одного IP больше N запросов в минуту, то выводится капча с просьбой подтвердить, что это не робот. Можно дополнительно сделать и другую защиту. Обратиться можете, например, ко мне.
Вы ничего сделать не сможете. Попробуйте узнать, где хостится сайты-воры и написать хостеру с просьбой закрыть эти сайты. Но это помогает очень редко.
07.08.2009 в 7:35 пп
Я ваш блог читаю часто.
Сначала сам попробую этих гадов прибить :)
Если не получится, то обращусь к вам :)
20.12.2009 в 10:38 пп
Спасибо За столь поучительную инфу. :roll:
02.02.2010 в 8:23 дп
$file=file_get_contents(‘http://site.ru?’.$_SERVER['QUERY_STRING']);
$file=str_replace(»,»,$file);
echo $file;
02.02.2010 в 8:27 дп
2 строка в скобках «что меняем»,»на что меняем» соответсвенно. Например ссылки
23.04.2010 в 4:38 дп
DimoninG :mrgreen: ты пишешь не для новичков а для долбо*ёбов. Которые в этой теме 200 рас спрося а как а шо а не работает. Не пиши ху* ню пиши на чистом php и нормально излагай код
27.07.2010 в 10:47 пп
спасибо за инфу, попробовал на вашем примере.
А что делать, если нужно сграббить инфу с сайта, где вход с логином и паролем?
03.11.2010 в 12:29 дп
меня этот вопрос тоже интересует!!непонятно как сделать что б грабер вводил логин пароль а потом грабил контент!подскажите решение этой проблемы!
29.11.2010 в 2:35 пп
я не пойму как сделать грабер чтобы он грабил фреш. подскажите пожалуйста!