Работа под прикрытием

Agent Smith

Заглянув в лог своего веб-сервера, я вижу серию примерно таких записей:

37.110.39.47 crawlers.info - [21/Sep/2015:20:14:52 +0000] "GET / HTTP/1.1" 200 4641 "https://www.facebook.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"
37.110.39.47 crawlers.info - [21/Sep/2015:20:14:53 +0000] "GET /theme/css/main.css HTTP/1.1" 200 3295 "http://crawlers.info/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"
188.123.231.51 crawlers.info - [21/Sep/2015:20:15:37 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Linux; Android 4.2.2; W6500 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Safari/537.36" OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"
83.220.238.15 crawlers.info - [21/Sep/2015:20:22:41 +0000] "GET / HTTP/1.1" 200 4641 "-" "Mozilla/5.0 (Linux; Android 4.4.2; ru-ru; SAMSUNG GT-I9301I Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36"

Кто это ко мне зачастил?

$ whois 83.220.238.15

...
% Information related to '83.220.238.0/23AS16345'

route:          83.220.238.0/23
descr:          OJSC "VimpelCom"
origin:         AS16345
mnt-by:         BEE-MNT
created:        2013-09-16T16:15:10Z
last-modified:  2013-09-16T16:15:10Z
source:         RIPE # Filtered

Так это я сам с мобильного через Билайн!

Несложно настроить веб-сервер так, чтобы он игнорировал обращения с нежелательных адресов. Можно даже накатать жалобу Интернет-провайдеру 1. Вот почему краулеру, работающему в промышленных масштабах, важно скрывать свой IP-адрес. Добиться этого помогают прокси-сервисы. Прокси — в переводе "посредник", "представитель" — передает запрос в пункт назначения, но вместо исходного адреса подставляет свой. По сети ходят списки бесплатных прокси. Они ненадежны и недолговечны. Есть сервисы, предоставляющие прокси за небольшую плату. Это лучше. Наконец, можно использовать анонимную сеть Tor. На последней технике мы и остановимся.

Но сперва рассмотрим, как работать с прокси из библиотеки Requests. Это просто. У метода requests.get есть необязательный параметр proxies. Его значением должен быть словарь вида {ПРОТОКОЛ:АДРЕС [, ПРОТОКОЛ:АДРЕС]}. Например:

requests.get('http://some.site.net', proxies={'http': 'http://some.proxy.org:8000'})

или:

requests.get('http://some.site.net', proxies={'http': 'http://some.proxy.org:8000', 'https': 'http://some.proxy.org:8000'})

Во втором примере мы указываем, что для всех запросов через протоколы 'http' и 'https' следует использовать прокси-сервис 'http://some.proxy.org:8000'. Нестандартный порт, такой как 8000, типичен для публичных прокси-серверов.

Работать с Tor-ом таким способом не получится. К нему нужно обращаться через специальный протокол SOCKS, который Requests (как и стандартные питоновские сетевые библиотеки) не поддерживает. То есть, не получится сделать вот так:

# не работает!
requests.get('http://some.site.net', proxies={'socks5': '127.0.0.1'})

Есть два выхода:

  1. Отказаться от библиотеки Requests и поискать альтернативу, которая поддерживает SOCKS.2

  2. Запустить на своей машине отдельный сервис, который станет посредником между программой и Tor-ом.

Второй вариант проще. С ролью такого посредника хорошо справляется служба Privoxy. Она легко устанавливается и ничего не просит.

Tor via Privoxy

В веб-облаке следовало бы изобразить сеть узлов Tor, но я хотел показать в первую очередь то, что происходит на нашей стороне. А именно:

  • Privoxy "слушает" локальные HTTP-запросы, приходящие на порт 81183, и переадресовывает их Tor-у.

  • Программа настроена использовать в качестве прокси Privoxy, т.е. http://127.0.0.1:8118

  • Tor сам знает, что делать.

Как все это установить

Ниже описаны шаги по установке и конфигурации связки Tor - Privoxy на Linux Debian и родственных платформах. На других Unix-системах процедуры аналогичные.

Privoxy

$ sudo apt-get install privoxy

Открываем в редакторе /etc/privoxy/config и вставляем туда строчки:

forward-socks4a / localhost:9050 .
forward-socks5 / localhost:9050 .

Не пропустите точки в конце строк!

Tor

$ sudo apt-get install tor

Тест

А вот тест, позволяющий проверить, добились ли мы ожидаемого результата. Здесь делаются два запроса, первый — прямой, второй — через прокси. Если прокси в порядке, то сервис http://icanhazip.com определит два разных адреса.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import nose
from requests import get
from nose.tools import assert_not_equals

def test_proxy():
    url = 'http://icanhazip.com'
    r1 = get(url).text
    r2 = get(url, proxies={'http': 'http://127.0.0.1:8118'}).text
    assert_not_equals(r1, r2,  'Proxy endpoint should not be equal to <%s>' % r1)

if __name__ == '__main__':
    nose.runmodule()

Можно проверить прокси браузером. Например, настроить Firefox как показано на скриншоте ниже и зайти на тот же http://icanhazip.com.

FireFox Proxy Settings

Privoxy — вообще, полезная программа. Разобравшись с ней, нетрудно настроить ее на фильтрацию рекламы или прочего мусора.


  1. Многие хостинговые компании запрещают запускать с их площадок веб-краулеры 

  2. Есть библиотека [Requesocks]https://github.com/dvska/requesocks() — ветка Requests с поддержкой протокола SOCKS. 

  3. Разумеется, при необходимости Privoxy может быть настроена на другой порт. 

social

Яндекс.Метрика