answer_42 (answer_42) wrote,
answer_42
answer_42

Category:

Ротируем прокси в Python

Унылые люди из различных проектов зачем-то пытаются закрыть от нас с вами свои данные. Один из любимых способ закрыться, но сохранить реноме, что мы, дескать, открытые - закрытие через API с ограничением количества запросов или просто защита сайта через определенное ограничение запросов. Что б не делать, только б не выкладывать нормальные православные дампы.

Возьмем к примеру такой сайт как РеформаЖКХ. Государство наладило сбор данных по ЖКХ на наши с вами налоги и даже нарисовало стандарт раскрытия. Данные ценные, пригодились бы в массе приложений. Пока все хорошо. Но потом начинается, сначала данные доступны только через веб-страницы, ладно, нужно грабить-скрэйпить, это криво, но терпимо. Дальше хуже, администрация решает, что скажем запрос в секунду, это много и ограничивает их количество через капчу. Старые скрипты перестают работать конечно же.

И всё это вместо того, чтобы выложить чёртовы дампы.

Ну достаточно лирики, теперь о том, как мы будем обходить капчи и все равно граббить.

Задача: скачать странички сайта защищенного капчей.
Решение: ротирующиеся прокси (основано на этом рецепте, с небольшими изменениями порта прокси и конфига, иначе не работает).

По шагам.

1. Ставим requesocks, stem для Python (pip install requesocks).

2. Ставим Tor Browser

3. Редактируем файл c:\tools\Tor Browser\Browser\TorBrowser\Data\Tor\torrc Делаем так, чтобы там присутствовала такая секция:
SocksPort 9150 IPv6Traffic PreferIPv6 KeepAliveIsolateSOCKSAuth
ControlPort 9151
HashedControlPassword 16:05834BCEDD478D1060F1D7E2CE98E9C13075E8D3061D702F63BCD674DE
CookieAuthentication 1

9151 это порт, который открывает Tor
HashedControlPassword это захэшированное слово password, пароль который мы дальше будем использовать в коде.

4. Запускаем Tor Browser, он просто будет висеть в памяти.

5. Теперь пишем код на питоне.

Сначала импорты, понадобятся пакеты requesocks, stem, не забываем их заранее установить:

import requesocks
from stem import Signal
from stem.control import Controller

Такой запрос пойдет через прокси сделанный тором и выдаст IP отличный от нашего настоящего:

session = requesocks.session()
session.proxies = {'http': 'socks5://127.0.0.1:9150',
'https': 'socks5://127.0.0.1:9150'}

print session.get("http://httpbin.org/ip").text


А так можно эти прокси менять по мере надобности:

from stem import Signal
from stem.control import Controller
with Controller.from_port(port = 9151) as controller:
controller.authenticate(password="password")
controller.signal(Signal.NEWNYM)

print session.get("http://httpbin.org/ip").text


В принципе это все что нам нужно, теперь мы можем просто делать так:

1. Отправить запрос
2. Проверить появилась ли в ответе капча.
2а. Если да, сменить прокси, перейти к 1.
2б. Если нет, распарсить.

Работает медленнее, чем напрямую, но работает автономно.
Tags: data, tor, реформажкх
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments