Как обчистить чужой сайт - Нет проблем

В этой статье реч пойдет о том, что называют граберами или парсерами на PHP. На самом деле я всего лишь раскрою технологию, которая очень проста, а превращать ее в парсер или грабер ваше дело. Как я уже сказал, все очень просто. Давай ка разберем что вообще мы хотим сделать, тогда проще будет понять все остальные телодвижения. Чаще всего нам надо получить текст с другого сайта. Для этого нам нужен исходный код страниц, который можно получить с помощью PHP. Самый простой способ это когда мы знаем адрес нужной страницы и просто получаем ее код, например так
<?php $data = file_get_contents('http://target.com');?>


Это очень простой способ. Можно скормить скрипту файл с адресами и он их обшарит. В самом скрипте можно вести обработку полученного кода, например вырезать новости или заголовки. Но что делать если сайт требует авторизации или особых заголовков. Сейчас большинство сайтов имеют такую защиту(нормальных сайтов:)). Тогда на на помощь приходит curl. Че за хрень, спросят некоторые, я отвечу. Это библиотека на PHP для работы с HTTP. Она умеет выставлять заголовки, куки и еще много чего. Самый просто запрос на curle будет выглядеть примерно так
<?php //инициализируем сеанс 
$ch = curl_init('http://target.com'); 
//устанавливаем параметры 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
//делаем запрос 
$responseData = curl_exec($ch); 
//закрываем сеанс 
curl_close($ch); ?>

Согласись, не так сложно, если учесть, что с помощью этого мы можем управлять куками и заголовками, а так же еще кучей приколов. Взять к примеру возможность не следовать редиректу:) или транслировать пост данные. К стати как передавать POST я и расскажу. Для этого наши данные должны иметь вид

Code:
переменная=значение&переменная2=значение2...

пример передачи POST данных через CURL
<?php  
//устанавливаем что будем посылать 
$reguestParams = 'var=value&var2=value2'; 
//инициализируем сеанс 
$ch = curl_init('http://target.com'); 
//устанавливаем параметры 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
//говорим что мы собираемся передавать данные и что именно передавать
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $reguestParams); 
//делаем запрос 
$responseData = curl_exec($ch); 
//закрываем сеанс 
curl_close($ch); ?>

Думаю все уже догадались что после всех этих манипуляций, исходный код целевой страницы находится в переменной $responseData. Ну вот мы и получили HTML код странички и теперь можем его обрабатывать.

В предыдущей статье мы остановились на том что научились получать доступ к страницам удаленных сайтов посредством CURL. Для повторения лишь приведу последний пример.
<?php  
//устанавливаем что будем посылать 
$reguestParams = 'var=value&var2=value2'; 
//инициализируем сеанс 
$ch = curl_init('http://target.com'); 
//устанавливаем параметры 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
//говорим что мы собираемся передавать данные и что именно передавать
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $reguestParams); 
//делаем запрос 
$responseData = curl_exec($ch); 
//закрываем сеанс 
curl_close($ch); ?>

Теперь давайте разберемся как нам получить доступ к странице с авторизацией. Для этого мы должны получить ID сессии и в дальнейшем передавать его при каждом запросе. Это может выглядеть сложно, но на самом деле все намного проще. Сперва мы отправляем POST запрос с логином и паролем, а за тем вытягиваем ID сессии и в дальнейшем путешествуем по сайту и получаем его странички, пользуясь этим ID.
Делается это так
<?php  
if ( isset($_SESSION['user_sess_id']) ) { 
    curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=' . $_SESSION['user_sess_id']);
} 
?>

А теперь все вместе, что бы было понятнее как CURL с этим всем справляется
<?php  
//устанавливаем что будем посылать 
$reguestParams = 'var=value&var2=value2'; 
//инициализируем сеанс 
$ch = curl_init('http://target.com'); 
//устанавливаем параметры 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
//говорим что мы собираемся передавать данные и что именно передавать
curl_setopt($ch, CURLOPT_POST, 1); 
//устанавливаем куки с ID сессии 
if ( isset($_SESSION['user_sess_id']) ) { 
    curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=' . $_SESSION['user_sess_id']);
} 
curl_setopt($ch, CURLOPT_POSTFIELDS, $reguestParams); 
//делаем запрос 
$responseData = curl_exec($ch); 
//закрываем сеанс 
curl_close($ch); 
//тут мы проверяем пришел ли нам в ответе от сервера ID сессии и если он есть устанавливаем его
if (preg_match('#Set-Cookie:\s+PHPSESSID=(.*);#Ui', $responseData, $match)) $_SESSION['user_sess_id'] = $match[1];
 ?>

как видишь, все очень просто. Мы просто, получая ответ проверяем есть ли там то что нам надо и пихаем его в нашу сессию, но перед запросом устанавливаем куки. Но некоторые сайты так же проверяют заголовки, что бы еще немного себя обезопасить. Наш друг КУРЛ и с этим справляется на 5 баллов. Например заголовки в curl можно установить так
<?php  
curl_setopt($ch, CURLOPT_USERAGENT, 'Браузер'); 
curl_setopt($ch, CURLOPT_REFERER , 'Реферер'); 
?>

Cо всем списком опций курла можно ознакомиться в доке по PHP. Использование этой библиотеки открывает очень большие перспективы, я лично писал на ее основе скрипты, способные выдерать из сайта контент и картинки, сохраняя это все в нужном мне формате, полностью автоматически, единственным недостатком являеться лишь то, что под каждый сайт такие скрипты надо писать индивидуально, но это уже не бока курла а методов обработки в целом, которые на данный момент не являются совершенством.

Думаю на некоторое время этого тебе хватит, а осмыслив то что тут написано и как с этим работать, можно почитать третью часть этой статьи.

И так, из предыдущих статей мы уже знаем как посылать запросы, получать данные, формировать заголовки и даже проходить авторизацию при помощи CURL. Но один вопрос все еще открыт. Как автоматизировать процесс? Вот об этом я и хотел написать в этой части статьи. За пример возьмем обычный запрос с использованием библиотеки CURL
<?php  
//устанавливаем что будем посылать 
$reguestParams = 'var=value&var2=value2'; 
//инициализируем сеанс 
$ch = curl_init('http://target.com'); 
//устанавливаем параметры 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
//говорим что мы собираемся передавать данные и что именно передавать
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $reguestParams); 
//делаем запрос 
$responseData = curl_exec($ch); 
//закрываем сеанс 
curl_close($ch); ?>

Если запрос будет удачным и страница существует, мы получим ее код HTML. Теперь для автоматизации процесса парсинга нам необходимо определиться с тем что мы вообще делаем. Давай разберем пример когда нам нужно получить список страниц с текущей страницы, например в каком нибудь каталоге статей. Тогда мы должны в ручную посмотреть код сайта, который будем парсить и определить в каком виде у него эти самые ссылки. Обычно это что-то вроде
Code:
http://target.net/stat?page=.....

тогда для нахождения этих ссылок мы можем воспользоваться регулярным выражением вроде этого
<?php  
//пытаемся найти ссылки на другие страницы 
if (preg_match_all('#href="(http://target.net/stat?page=[\d]+)"#i', $responseData, $matches)) { 
     //если есть перебираем все совпадения 
     foreach ($matches as $match) { 
          //тут посылаем запрос на все найденные страницы по очереди 
     } 
} 
?>

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

Но смотрите, грабинг сайтов не очень хорошее занятие я лишь показал вам технологию, а как ее применять ваше личное дело. Я например использую это для автоматизации некоторых вещей. По такому же принцыпу можно писать ботов, которые будут проверять сайты, например на наличие на них ваших ссылок или что-то в этом духе. Поисковые роботы работают по такому же принцыпу, хотя и не на PHP.
Теги:
парсер
Добавлено: 24 Мая 2018 20:22:59 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...