Для работы через http proxy на php наилучшим решением является библиотека cURL. Она проста в использовании и результативна.
При многопоточном парсинге можно использовать функцию multicurl().
Ниже представлена функция для получения одной страницы с использованием cURL и http proxy:
function get_page($link, $ProxyList)
{
$ch = curl_init ($link);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
if (is_array($ProxyList) && count($ProxyList)>0)
{
curl_setopt($ch, CURLOPT_PROXY, trim($ProxyList[rand(0,(count($ProxyList)-1))]));
}
curl_setopt($ch, CURLOPT_USERAGENT,
'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$data = curl_exec($ch);
curl_close ($ch);
return $data;
}
На входе функция принимает URL ($link) и массив ($ProxyList), содержащий прокси лист в виде простого списка.
Функция возвращает полученый результат в виде строки.
Следует учитывать, что эта функция полностю рабочая, но она не учитывает возможное отсутствие ответа и выход по тайм-ауту.
Добавив обработку ошибок cURL и рекурсию, получаем отличную функцию:
function get_data($link, $indexo = 0)
{
if ($indexo > 15)
return false;
global $ProxyList;
$ch = curl_init ($link);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
if (is_array($ProxyList) && count($ProxyList) > 0)
curl_setopt($ch, CURLOPT_PROXY, trim($ProxyList[rand(0,(count($ProxyList)-1))]));
curl_setopt($ch, CURLOPT_USERAGENT, getRandomHeaderBrowser());
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$rawdata = curl_exec($ch);
$header = curl_getinfo( $ch );
$curlErrorNum = curl_errno($ch);
# $curlError = curl_error($ch);
curl_close ($ch);
// Если нулевой результат или ошибка cURL
if (empty($rawdata) OR ($curlErrorNum > 0))
{
if ($curlErrorNum == 22) # cURL error 22 = 404
return false;
return get_data($link, $data, $indexo+1);
}
// Если докачалось не полностью
if ($header["size_download"] != $header["download_content_length"])
return get_data($link, $data, $indexo+1);
return $rawdata;
}
Здесь использована функция случаного подбора заголовков браузера getRandomHeaderBrowser().
В простешем варианте вы можете подготовить вручную массив из нескольких заголовков и случайно возвращать один из них.
В более сложном варианте — кому надо — тот сам разберётся, как эти заголовки подготавливать.
Можно и вовсе убрать строку
curl_setopt($ch, CURLOPT_USERAGENT, getRandomHeaderBrowser());
и всё будет работать. Вот только без заголовков браузера прасиг яндекса, к примеру, вам очень скоро выдаст капчу.