Парсер контента сайтов

от автора

В этой статье я НЕ напишу вам самый уникальный парсер контента для всех сайтов, но расскажу простые принципы его создания. Все мои действия происходили на денвере, и я добился того результата, которого хотел — мне не приходится по 1000 раз сохранять файлы. Я просто запускаю программу.

Шаг 1. Выбор сайта для парсинга

Нам нужен простой сайт, где ссылки на его контент выложены на прямую, чтобы доступ к скачиванию файлов был свободным. Поэтому, в данной статье я выбрал сайт Тегос.ру

Шаг 2. Проверка страницы на доступность получения ее содержимого

Здесь как раз-таки всё просто. Для начала, введем простой код, который проверит нашу страницу с ссылками на доступность содержимого страницы. Для этого, я выбрал страницу на сайте тегоса с видео-обзорами Рэя Вильяма Джонсона (http://tegos.kz/video/rwj/)

<?php set_time_limit(0); $data = file_get_contents("http://tegos.kz/video/rwj/"); echo $data ?> 

После нескольких секунд мне выдались такие кракозябры:

Но это не важно. Главное, что у нас получилось получить содержимое страницы. Иногда этого не получается сделать через file_get_contents(), поэтому приходится иногда прибегнуть к cURL. Вот тогда как бы выглядел наш способ получения страницы:

<?php set_time_limit(0); if( $curl = curl_init() ) { curl_setopt($curl, CURLOPT_URL, "http://tegos.kz/video/rwj/"); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); $data = curl_exec($curl); echo $data; curl_close($curl); } ?> 

Результат абсолютно тот же самый.

Примечание №1: cURL иногда не входит в базовый пакет денвера, необходимо установить пакет расширений с официального сайта
Примечание №2: Если не хотите кракозябры, то поиграйтесь с функцией iconv()

Шаг 3. Идентификация особенностей прямых ссылок на файлы

После того, как мы убедились в доступности ресурса, откройте исходных код страницы и посмотрите, если в ссылках на скачивание определенные особенности (ненужные &, ? и =).
Вот код нашей страницы с RWJ:

Ссылки без каких либо особенностей. Но если, например, взглянуть на исходники не очень приличной страницы того же сайта, то в их ссылках на скачивание можно увидеть «мусор»:

Тогда, после того как мы сформируем окончательную ссылку на файл, нам необходимо с помощью str_replace() удалить ненужный мусор из ссылки.

Шаг 4. Сборка кода парсера

Чтобы улучшить взаимодействие пользователя с парсером, я создал отдельный файл с переменной, содержащей форму, в которую Вы вписываете адрес страницы, содержащей прямые ссылки на контент; папку, куда сохранять получаемые с сервера папки и формат скачиваемых файлов.

Весь приведенный ниже код спокойно работает для 60-70% страниц на Тегосе (а возможно, и для других сайтов с подобным содержимым тоже) и подходит не только для видео. Результаты исполнения приведу в соответствующих скриншотах.

Код файла index.php

<?php set_time_limit(0); // устанавливаем бесконечное время исполнения кода include("form_var.php"); // тот самый файл с переменной, содержащую форму  // Цикл получения данных POST с формы foreach ($_POST as $var=>$value){ $$var = $value; }  // Если все переменные есть - начинаем if ($site && $dir && $ext){ // vars echo <<<EOD <b>Страница:</b> $site</br> <b>Папка сохранения:</b> $dir<br/> <b>Расширение:</b> *.$ext<br/> EOD; flush(); // вывод сразу sleep(1); // вывод сразу   // Создаем папку, если она не существует if (!file_exists($dir)){ // mkdir mkdir($dir); echo <<<EOD <b>Папка создана</b><br/> EOD; flush(); // вывод сразу sleep(1); // вывод сразу } // mkdir  require_once("simple_html_dom.php"); // обязательно инклудируем файл для удобного поиска ссылок на файлы  $page = $site; $data = file_get_contents($page); // получаем содержимое страницы  // Если данные получены if ($data) { // data $html = str_get_html($data); // преобразуем данные в массив, благодаря SHD  $links = $html->find('a[href*=.' . $ext . ']'); // ищем все ссылки, содержащие указанный нами формат  $TOTAL = count($links); // считаем их количество  echo <<<EOD <b>Найдено файлов:</b> $TOTAL<br/> EOD; flush(); // вывод сразу sleep(1); // вывод сразу  $n = 0; // устанавливаем первоначальное количество получаемых (скачиваемых) файлов   // Начинаем цикл перебора и обработки ссылок foreach ($links as $element){ // foreach  $link = $element->href;   // Убираем мусор $link = str_replace("?f=","",$link); $link = str_replace("&back=0","",$link);   // Глупым способом получаем хост $pageArr = explode("/",$page); $host = $pageArr[0]."/".$pageArr[1]."/".$pageArr[2];   // Глупым способом проверяем и изменяем ссылку на полную $direr = str_replace($host,"",$page); $linker = explode("/",$link); if (count($linker) == 1){ $link = $direr.$link; }   // Генерируем ссылку на скачивание $url = $host.$link; $file = file_get_contents($url); // получаем файл   // Если получил, то... if ($file){ // file   // Создаем ссылку для сохранения файла $linkArr = explode("/",$link); $save = $linkArr[count($linkArr)-1]; $path = $dir."/".$save;  $oper = file_put_contents($path, $file); // закачиваем файл в указанную директорию   // Если файл закачан if ($oper){ // load flush(); // вывод сразу sleep(1); // вывод сразу $n++; $PER = round($n / $TOTAL * 10000) / 100;  echo <<<EOD V - $url [$PER%]<br/> EOD; flush(); // вывод сразу sleep(1); // вывод сразу  } else { // load  // Если не загружен echo <<<EOD ? - $url [не загружен]<br/> EOD; flush(); sleep(1); } // load  } else { // file  // Если файла нет echo <<<EOD X - $url [файл не найден]<br/> EOD; flush(); sleep(1); } // file  } // foreach  echo $FORM;  } else { // data  // Если нет содержимого echo <<<EOD <b>Содержимое страницы не получено</b><br/> EOD; } // data  } else { // vars  // Не указаны переменные echo $FORM; } // vars  ?> 
Код файла form_var.php

<?php  $FORM = <<<EOT <fieldset> <legend>Форма для закачивания</legend> <form action="" method="POST"> <table> <tr> <td width="1%"> <b>URL:</b> </td> <td> <input type="text" name="site" value="$site" placeholder="Страница с ссылками" size="50"> </td> </tr> <tr> <td width="1%"> <b>DIR:</b> </td> <td> <input type="text" name="dir" value="$dir" placeholder="Папка на сайте, куда сохранить файлы" size="50"> </td> </tr> <tr> <td width="1%"> <b>EXT:</b> </td> <td> <input type="text" name="ext" value="$ext" placeholder="Расширение файлов" size="50"> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" name="sub" value="Скачать"> </td> </tr> </table> </form> </fieldset> EOT; ?> 

Файл simple_html_dom.php вы можете скачать с официального сайта (PHP Simple HTML DOM Parser), а также изучить по нему мануал

Результаты работы программ

После запуска сайта на денвере уже через несколько секунд мы начинаем получать первые плоды работы программы. Данные скриншоты показывают ее действия, а PHP-функции flush() и sleep(1) позволяют непрерывно выводить информацию, не заставляя ждать, пока скачается со страницы весь нужный контент.

tegos.kz/video/rwj/

tegos.kz/video/new/prikol/mp4/

tegos.kz/erotic/video_eks/Sex_And_Tattoos/

Папки с сохраненными видео

Послесловие

Конечно, программу можно модифицировать по всякому. Например, если вы качаете множество эпизодов, и файл подписан, как МойСериал_1.mp4, как МойСериал_2.mp4 и т.д., то прервавшись на каком-то эпизоде, сделать обработку ссылок на файл через регулярные выражения или тот же SHD, чтобы он скачивал только тот эпизод, в ссылке на который есть число больше заданного. Можно создать сначала обработку страницы для поиска ссылок на следующую страницу с контентом и потом запустить опять-таки foreach() для парсинга всего раздела с его страницами.

Благодарю за внимание

ссылка на оригинал статьи http://habrahabr.ru/post/211250/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *