PHP и http proxy

Для работы через 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());

и всё будет работать. Вот только без заголовков браузера прасиг яндекса, к примеру, вам очень скоро выдаст капчу.

Similar Posts:

Запись опубликована в рубрике Кодим с прокси с метками , , , . Добавьте в закладки постоянную ссылку.

Комментарии запрещены.