Home > PHP > Использование PHP для получение html страницы

Использование PHP для получение html страницы

Сентябрь 20th, 2009

Для наполнения проекта pre.musicdown.org приходится использовать самописный парсер, с помощью которого сайт автоматически наполняется свежей информацией о музыкальных релизах. Парсером является скрипт написанный на PHP,  который в свою очередь через определенный промежуток времени запускает планировщик CRON.

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

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

$html = file_get_contents(«http://www.example.com/»);

У этой функции есть один большой недостаток — невозможность передачи никаких параметров, а особенно параметра User-Agent с помощью которого можно определить какой Browser использует клиент, какую OS и т.д. Может из-за отсутствия User-Agent парсер так быстро и вычислили!? Так же к недостаткам можно отнести отсутствие TimeOut, поддержки Proxy и ряда других возможностей.

Пришлось искать пути для обхода установленных ограничений. Самый просто и доступный способ это использование Proxy серверов для скрытия реального IP адреса. В сети Internet существует множество различных Proxy серверов, какой выберите Вы и как вы его найдете это ваше дело. Не рекомендую использовать Transperent proxy (Прозрачные прокси), так как все равно ваш IP можно будет определить. Рекомендуется использовать Anonymous Proxy (Анонимный прокси) или лучше Elite Proxy (Элитный прокси). Боллее подробнее о видах прокси в посту Какие бывают Proxy

Для написания функции для получения контента страницы пришлось использовать CURL, который оказался очень гибким инструментом с рядом интересных возможностей.

function get_url_contents($url){
$crl = curl_init();
$user_agents[0] = «User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)»;
…..
$user_agents[19] = «User-Agent: Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)»;

$timeout = 5;

$user_agent = $user_agents[rand(0, count($user_agents)-1)];

curl_setopt($crl, CURLOPT_PROXY, «address:PORT»);
curl_setopt($crl, CURLOPT_PROXYUSERPWD, «user:password»);  если proxy с авторизацией
curl_setopt($crl, CURLOPT_URL,$url);
curl_setopt($crl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($crl, CURLOPT_USERAGENT, $user_agent);
$ret = curl_exec($crl);
curl_close($crl);
return $ret;
}

Функция возвращает содержание html страницы адрес которой передается в $url. Так же в функции организован массив из 20-ти User-Agent’ов, один из которых при выполнении случайным образом выбирается из массива.

Прокси сервер и его порт выставляется в строке  curl_setopt($crl, CURLOPT_PROXY, «address:PORT«);

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

PHP , , , , , , , , , ,

  1. No comments yet.
  1. No trackbacks yet.
Перед отправкой формы: