Парсер, чекер и база бесплатных прокси
Для одного проекта понадобилось иметь прокси. Много, даже очень много прокси. Проблема была в том, что сервер сайта донора блокировал (выдавал капчу) как по времени, так и по частоте обращения. Через запросов 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.