Парсер, чекер и база бесплатных прокси


Для одного проекта понадобилось иметь прокси. Много, даже очень много прокси. Проблема была в том, что сервер сайта донора блокировал (выдавал капчу) как по времени, так и по частоте обращения. Через запросов 30 ip блокировался на сутки. А нам (заказчику) надо было получать информацию как можно быстрее – счет шел на тысячи запросов за ограниченный промежуток времени. Решение – создать базу данных своих прокси. Бесплатных. Однако, это оказалось не так уж просто.

Где брать

Первая проблема состояла в том: а где, собственно говоря, брать эти самые бесплатные прокси? Не, на самом деле сайтов много, но большинство из них либо копируют у друг друга, либо же ставят защиты от парсинга.

Понять их можно, но нам вручную не вариант, совсем не вариант. Поэтому после недолгих поисков все таки нашелся сайт, не в рунете, но с разнообразным, постоянно обновляющимся набором прокси. Поставил на крон скрипт php, который забирает раз в час страницу и заносит в базу ip и порт (проверяя на дубликаты, конечно же).

Зависеть от одного сайта, конечно же, не очень хорошо, но будем решать проблемы по мере их поступления

Устаревание

Тут же поспела другая проблема: устаревание прокси, их актуальность. Дело в том, что бесплатные прокси могут быть нерабочими уже через день после добавления в нашу базу. Да какое через день – через пару часов иногда прикрываются. Или даже сразу не работают.

Сначала я думал сразу при сборщике поставить проверку, но нам требовались постоянно актуальные поэтому решено запустить еще процесс – чекер прокси.

Проверка (чекер)

Перед основным парсером основного сайта (а не с прокси, надеюсь, вы не запутались) мы запускаем чекер прокси. Точнее, запускается параллельно (парсер – раз в минуту, чекер – раз в две минуты), но идущий на 50 позиций вперед. Таким образом мы получаем актуальнейшие прокси и основной паук, ползающий по сайт донору, не тратит время на их проверку.

Интересно, что проверка прокси оказалась не простейшей задачей. Простой, но не простейшей. То есть вот такой:

$ip = $row['ip'];
$port = $row['port'];
$fp = @fsockopen($ip, $port, $errno, $errstr, 10);
if($fp) {//прокси рабочий}
Проверки не хватит. Почему? Ну сокеты открываются, порт нормально, но сам прокси-сервер может выдать что-то типа «Доступ запрещён». Так что лучше дополнительно инициализировать курл и использовать такой код:

$proxy = $ip.":".$port;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 10);curl_setopt($ch, CURLOPT_PROXY, $proxy);
$res = curl_exec($ch);$pos = stripos($res, "ERR_ACCESS_DENIED");
if (($pos === false)
Я сначала думал создать список «плохих» ответов:
  • ERR_ACCESS_DENIED
  • Bad Request
  • Доступ запрещен
  • Доступ заблокирован
  • Service Unavailable
  • Network Access Message
И в некоторых случаях так действительно можно поступать. Но в нашем случае проще и правильнее сравнивать не то, что может быть, а то, что должно быть. Иными словами часть текста страницы, которая будет всегда. Например, заголовок или что-то внутри.

$pos_true = stripos($res, "То, что есть всегда на странице");
if  (!$pos_true)) {
Плюсом этого подхода является то, что можно отсеять сразу те прокси, которые уже наш донор заблокировал (не мы же одни ими пользуемся и такое бывает).

Хэппи энд

В конце концов все же все эти проблемы удалось решить. Теперь у меня есть собственная база прокси, которая постоянно пополняется и обновляется. Актуальные бесплатные прокси в любое время, и доступные для работы в любом формате. За плату я вам помогу в подобном проекте - пишите.

Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, прокси, парсинг




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 34. Интерфейсы коллекции C#
Рецензия на книгу Симмонс Дэн Лето ночи
Вытаскиваем исходник C# из exe-файла