Всё про php

  • Яндекс.XML: Поиск в подразделе сайта

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

    Все решается с помощью языка запросов к Яндексу.

    // имя домена по которому будет искаться
    $host  = 'site.ru';
    // далее задаем искать только на страницах,
    // в адресах которых присутствует site.ru/catalog
    $search_tail = htmlspecialchars("<< inurl=\"$host/catalog\"");

    Конечно способ работает, при условии, что у вас человеко-понятные урлы и вы сможете отделить нужный вам раздел. Если страницы формируются по принципу site.ru/index.php?id=135 будет проблематично вычленить нужные урлы.

  • Поиск по сайту с помощью Яндекс XML и CURL

    Решил на одном новом проекте реализовать поиск по сайту на основе Яндекс.XML. Сложного ничего нету, тем более, что на Яндексе есть готовый пример реализации такого поиска. Его надо было только доработать немного напильником под свои нужды и все будет Ok.

    Но я все-равно столкнулся с проблемой. Хитрость в том, что надо в Яндексе зарегистрировать IP адрес с которого будет идти обращение к нему. И один IP может принадлежать только одному пользователю. Я, конечно, хитрый перец, быстренько проверил IP на котором размещен проект, сообразил, что его никто не использует и зарегистрировал быстренько. Но не тут-то было. При обращении к Яндексу, мне было сообщено, что запрос происходит совсем с другого адреса и вот именно этот другой адрес уже занят другим пользователем.

    Я начал искать пути решения (смена ИП адреса, аренда дополнительного ИП или еще что нибудь) через техподдержку хостинга. И там мне разъяснили, что не смотря на то, что у сервера несколько IP, бывает используется только дефолтный. Но зато можно изменить его на другой прямо из php. И дали мне мудрую ссыль на решение проблемы.

    В результате, я немного подправил это решение и смог задать нужный мне IP адресс. Если брать стандартный пример Яндекса реализации поиска по сайту на php, то вместо строки:

    $response = file_get_contents('http://ваша ссылка для запроса', true, $context);

    мы ставим код типа такого:

    // Запрос к Яндексу через CURL
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://ваша ссылка для запроса");
    curl_setopt($ch, CURLOPT_HEADER, false);
     // задаем ip с которого необходимо отправлять запрос
    curl_setopt($ch, CURLOPT_INTERFACE, '88.xx.xx.xx');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$doc);
    $response = curl_exec($ch);
    curl_close($ch);

    И все. Все запросы к Яндексу с указанного Вами IP адреса.

    PS. Вот еще бы узнать, как список доступных IP адресов получить... ;)

  • Проверка битых ссылок на файловые хранилища

    У меня на балбесах сложилась очень неприятная ситуация с файловым архивом (клипарты, кисти для фотошопа и т.д. ) Сейчас все эти разделы наполняются пользователями. Они размещают свои файлы на различных файловых хранилищах и для скачивания дают уникальную ссылку позволяющую скачать их файл. Это все достаточно удобно, за исключением одного момента. Если файл не скачивается определенное время (обычно 1 месяц), то файловое хранилище удаляет этот файл у себя, чтобы не хранить никому не нужные данные. А это приводит к тому, что пусть через месяц, но какому-нибудь посетителю сайта понадобится этот не популярный файл.  Но файла уже нету на хранилище и, соответственно, его не скачать. И тут разочарованный пользователь идет к другому файлу, который возможно тоже уже стерт. Получается что на сайте «мертвые» линки на уже несуществующие файлы. А это уже совсем не хорошо.

    В идеале надо постоянно удалять такие файлы с сайта. А как это сделать? Я начал просить посетителей сайта сообщать о таких битых ссылках через форму обратной связи. Поначалу это дало хороший эффект и таких «файлов-фантомов» почти не оставалось на балбесах. Но со временем сайт становился более популярным, и файлов стали добавлять очень много. А посетители стали лениться сообщать о битых линках. И вот настал момент, когда почти каждый день мне приходит письмо, о том, что на сайте половина линков битая. Посетители жаловались. Перелопатить несколько тысяч в ручную, как вы понимаете, очень не просто. Поэтому решил написать скрипт проверки битых ссылок на файловые хранилища для danneo 0,52 (т.к. «балбесы» на ней).

    Скрипт проверки файлов на доступность написал на php с использованием класса snoopy.

    Пока он чистит файлы, которые ссылаются на letitbit.net. Начал с летитбит, т.к. у меня на сайте битых ссылок на него больше всего. В дальнейшем добавлю проверку на битые ссылки и для других файловых хранилищ.

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

    Проверка битых ссылок

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

    Скачать скрипт проверки битых ссылок для danneo 0.52 (ver 1.00)

    Этот скрипт не сложно переправить для работы с любой CMS. Конечно надо минимальные знания пхп и mysql.

    Работает скрипт долго. Поэтому запускать его лучше с локального компьютера. Это удобнее всего делать с помощью денвера.

    Не забудьте перед запуском скрипта сделать бэкап базы данных своего сайта.

  • Эмуляция браузера на php или парсер без проблем

    Не так давно столкнулся с одной задачкой. Надо было взять 1000 урлов из поиска Яндекса и проверить наличие определенных признаков (строк) на странице. Пытался все сделать с помощью стандартной функции fsockopen, но возникла проблема — 70-80% серверов меня приравнивали к ДДОС атаке и банили по IP.  Убил часа 2-3 на подборы различных User-Agent, но меня всеравно причисляли к вредителям и блокировали.

    В результате я наткнулся на библиотеку snoopy.php, которая позволяет эмулировать работу браузера. Там мощный набор функций не только для эмуляции браузера, а еще и для нормального парсинга сайтов.

    snoopy

    Вот основной перечень полезных функций этого парсера:

    • $snoopy->fetch(«http://www.php.net/»);
      Отправляем запрос по интересующему нас урлу и получаем в ответ все содержимое страницы
    • $snoopy->fetchtext(«http://www.php.net/»);
      После отправки запроса получаем только текст, который на странице. Т.е. все теги, картики и скрипты вырезаются.
    • $snoopy->fetchlinks(«http://www.php.net/»);
      Получаем массив с урлами ссылок, которые находятся на интересующей нас странице

    И перечень основных переменных этого класса:

    • $snoopy->results;
      Переменная в которую записывается результат работы предыдущих функций. Она может вернуть строку или массив, в зависимости от того, что хотим получить.
    • $snoopy->agent;
      User-agent, который быдет передаваться при отправке наших запросов.
    • $snoopy->referer;
      Поле реферера, которое будет передано запрашиваемому серверу. Его можно использовать, например, чтобы создавать видимость переходов по ссылкам внутренней навигации сайта.

    Также с помощью этой библиотеки можно не только обращаться к страницам, но еще и эмулировать отправку html форм. Видимо создавать post запрос.

    Примеры использования:

    include "Snoopy.class.php";
    $snoopy = new Snoopy;
    
    $snoopy->fetchtext("http://www.php.net/");
    print $snoopy->results;
    $snoopy->fetchlinks("http://www.phpbuilder.com/");
    print $snoopy->results;

    Советую всем. Меня эта библиотека просто выручила в трудную минуту.

    PS. Прикол от webmonkey

    Бот по имени Зомби