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

Я не буду выкладывать готовые парсеры, т.к. делаются они, как правило, под конкретную ситуацию и на коленке. Общая схема парсинга такова:

  1. Нужно ли авторизовываться на страницу парсинга. Если нужно, юзаем класс авторизации
  2. Есть ли «защита» у сайта от парсинга. Если есть — юзаем класс explorer
  3. Используется при выводе нужной нам информации аякс (фреймы, ифреймы, флеш). Если да — надо перехватывать заголовки и смотреть куда-что отправляется
  4. Насколько прост и логичен html у сайта, а также насколько сильно нужная нам информация «размыта» по коду. В зависимости от этого либо обычной preg-функцией тащим инфу, либо используем класс парсинга html.

Распишу поподробнее эти пункты:

  1. Авторизация обычно происходит через библиотеку curl, используя ее можно написать свою авторизовывалку. Но зачем делать самокат, если за нас все сделали. Мегачувак по имени Dude ведет проект по имени DudeCurl. Он авторизуется большую тройку соц.сетей (контакт, фейсбук, одноклассники), во все сайты, которые я парсил и где требуеца авторизация. Пол года назад даже успешно авторизовывался в гугл-аккаунт, сейчас незнаю, не проверял. Скачать DudeCurl можно тут (в поле логин пишем anonymous). Единственный косяк — документации по классу нет, тут либо шерстить блог с метками DudeCurl, либо смотреть сорцы класса.
  2. «Защиту» обычно ставят те сайты, которых часто парсят. Защита в кавычках, т.к. это по сути простая проверка на дурака — проверяют заголовки на похожесть с заголовками, посылаемыми обычным браузером. То есть, достаточно корректно и полно общаться с сервером через заголовки (в том числе, принять кукисы от сайта) + делать (u)sleep на время в районе секунды — и «защита» обойдена. Вполне себе полноценно общается с сервером вышеописанный DudeCurl. Но иногда я использовал другой класс на php — Explorer. Он намного проще и поэтому позволяет быстро вносить изменения при необходимости. Рекомендую попробовать и тот и другой.
  3. Довольно сложная фигня — когда нужная нам инфа лежит не прямо на странице по конкретному урлу, а подгружается при клике, либо находится во фрейме (т.е., по сути по другому урлу). Приходится вооружаться плагинами (например, LiveHttpHeaders) для firefox и вычленять запросы к серверу для получения информации. В случае с аяксом идут запросы POST или GET к серверу, и они хорошо видны при просмотре заголовков. Для формирования GET-запроса достаточно прописать переменные и их значения в парсингуемом URL, т.е., парсить как обычную страницу с параметрами в URL. Для POST-запроса лучше использовать какой-нибудь из классов для работы с Curl (см выше). В случае с фреймом — надо вытащить из html адрес, по которому идет его загрузка и парсить уже его.
  4. Иногда надо вытащить всего 1 значение между уникальными наборами символов, и тогда это лучше сделать обычным «preg_match()» или даже «ereg()». Но чаще всего стоит другая задача. Скажем, мне нужны все картинки на странице. Или ссылки. Или содержимое всех слоев div с классом «text». Или, скажем, у нас огромная таблица, и нужно вытащить пятую слева, восьмую сверху ячейку, а также еще несколько. А они ничем в коде не отличаются от других… Так вот, есть мега-крутой класс для парсинга html. Называется он совсем неоригинально: PHP Simple HTML DOM Parser. В архиве с классом лежит наглядная документация с примерами для большинства задач.

Конечно, не всегда следует использовать весь инструментарий, в простейшем случае парсинг выглядит так: echo file_get_contents (‘http://yandex.ru’);

И начинать следует именно с такого варианта — абсолютное большинство простых сайтов парсятся таким способом.

Удачного парсинга! :)