Хочу рассказать вам о том, как написать граббер. Напишем простой граббер на 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 пп
18.12.2008 в 10:39 пп
19.12.2008 в 12:13 дп
19.12.2008 в 10:22 пп
20.12.2008 в 10:53 дп
– и никаких проблем и заморочек с циклами и проверками)
20.12.2008 в 5:26 пп
Смотреть тут. Не сочтите за рекламу.
21.12.2008 в 11:49 дп
22.12.2008 в 6:58 пп
mysql_query ("INSERT INTO content VALUES (0, '".$data[1]."');")
29.01.2009 в 5:24 пп
вот, что я хочу сделать:
есть картинка (http://www.calend.ru/img/export/informer.png), мне нужно ее граббить на сервак в /usr/local/www/apache22/data/uploads/
я потом в кроне пропишу, что раз в сутки.. (и будет ли она заменяться новой?)
как сделать, чтобы эта картинка копировалась на сервер?
29.01.2009 в 5:33 пп
29.01.2009 в 5:33 пп
$c = «»;
while (!foef ($file)){
$c .= fread ($file, 256);
}
fclose ($file);
29.01.2009 в 6:12 пп
не в PHP полный ноль))
29.01.2009 в 6:37 пп
$c = «»;
while (!feof ($file)){
$c .= fread ($file, 256);
}
fclose ($file);
fwrite ($file, $c);
fclose ($file);
29.01.2009 в 6:39 пп
29.01.2009 в 6:58 пп
создал файл 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 пп
14.04.2009 в 8:19 пп
именно инфу на сегоднийний день, но вот проблема один сайт чтото у себя поменял и в граббере он неработает кто бы мог его подправить?)
14.04.2009 в 8:23 пп
18.04.2009 в 3:24 дп
суть проблемы такова: есть переменная в которой хранится исходный код страницы,мне нужно выбрать несколько фрагментов находящихся между 123456789 и 987654321. помогите пожалуйста составить регулярное выражение
я делаю следующим образом
preg_match_all(‘/(?<=123456789)(.*)(?=987654321)/iU’,$s,$text)
но почему то не получаю результата
для связи можно в icq 461912916
23.04.2009 в 8:02 пп
03.06.2009 в 2:55 пп
04.06.2009 в 1:59 дп
07.08.2009 в 1:02 пп
А можете написать как наоборот блокировать грабберы, т.к. в отличие от некоторых отписавшихся, которые только тырят контент, я как раз этот контент создаю и такие прихлебаи заколебали.
С моего сайта уже четыре говноблога тянут информацию, дошло, что в гугле они на первом месте, а моего сайта вообще нет.
07.08.2009 в 2:02 пп
07.08.2009 в 3:54 пп
Поэтому по запросам мой сайт не находится, а по картинкам на первом месте.
А если я узнаю ip адрес сервера, где находится сайт-вор, можно как нибудь закрыть доступ ему, ведь граббер же с сайта того запускается, может ему как-нить доступ закрыть.
А то вчера четыре новых статьи добавил – те сайты уже в топе выдачи по запросу у гугла, а моего сайта нет – обидно
07.08.2009 в 7:23 пп
07.08.2009 в 7:35 пп
Сначала сам попробую этих гадов прибить
Если не получится, то обращусь к вам
20.12.2009 в 10:38 пп
02.02.2010 в 8:23 дп
$file=str_replace(»,»,$file);
echo $file;
02.02.2010 в 8:27 дп
23.04.2010 в 4:38 дп
27.07.2010 в 10:47 пп
А что делать, если нужно сграббить инфу с сайта, где вход с логином и паролем?