Поиск по блогу

пятница, 23 мая 2014 г.

RetryChangeProxyMiddleware... Можно переключать IP в Tor с помощью Python telnetlib

Здесь небольшой фрагмент кода для смены IP на основании данных ответа в Telnet. Автор вопроса использовал платный Proxy Mesh. Ему подали идею создавать новые запросы через Tor с помощью "переговоров" с Telnet... Идея понравилась, надо пробовать...
Идея о таком переключении "instance" в Tor понравилась, но была не очень понятна. Некоторое прояснение наступило после того, как прочитал в документации Scrapy о telnet console...

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

Первоисточники и ссылки

Setting Scrapy proxy middleware to rotate on each request
Using Tor proxy with scrapy
Use a random user agent for each request
Scrapy comes with a built-in telnet console for inspecting and controlling a Scrapy running process. The telnet console is just a regular python shell running inside the Scrapy process, so you can do literally anything from it.
Telnet Console

Вот пример кода, меняем IP и user-agent

In []:
from scrapy import log
from settings import USER_AGENT_LIST

import random
import telnetlib
import time


# 15% ip change
class RetryChangeProxyMiddleware(object):
    def process_request(self, request, spider):
        if random.choice(xrange(1,100)) <= 15:
            log.msg('Changing proxy')
            tn = telnetlib.Telnet('127.0.0.1', 9051)
            tn.read_until("Escape character is '^]'.", 2)
            tn.write('AUTHENTICATE "<PASSWORD HERE>"\r\n')
            tn.read_until("250 OK", 2)
            tn.write("signal NEWNYM\r\n")
            tn.read_until("250 OK", 2)
            tn.write("quit\r\n")
            tn.close()
            log.msg('>>>> Proxy changed. Sleep Time')
            time.sleep(10)



# 30% useragent change
class RandomUserAgentMiddleware(object):
    def process_request(self, request, spider):
        if random.choice(xrange(1,100)) <= 30:
            log.msg('Changing UserAgent')
            ua  = random.choice(USER_AGENT_LIST)
            if ua:
                request.headers.setdefault('User-Agent', ua)
            log.msg('>>>> UserAgent changed')

А этот код был в вопросе (для работы с mesh)

In []:
class ProxyMiddleware(object):
  def process_request(self, request, spider):
    request.meta['proxy'] = "http://open.proxymesh.com:[port number]"

    proxy_user_pass = "username:password"
    encoded_user_pass = base64.encodestring(proxy_user_pass)
    request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

Using Tor proxy with scrapy

I need help setting up Tor in Ubuntu and to use it within scrapy framework.
I did some research and found out this guide:
In []:
class RetryChangeProxyMiddleware(RetryMiddleware):

    def _retry(self, request, reason, spider):
        log.msg('Changing proxy')
        tn = telnetlib.Telnet('127.0.0.1', 9051)
        tn.read_until("Escape character is '^]'.", 2)
        tn.write('AUTHENTICATE "267765"\r\n')
        tn.read_until("250 OK", 2)
        tn.write("signal NEWNYM\r\n")
        tn.read_until("250 OK", 2)
        tn.write("quit\r\n")
        tn.close()
        time.sleep(3)
        log.msg('Proxy changed')
        return RetryMiddleware._retry(self, request, reason, spider)
In []:
#then use it in settings.py:

DOWNLOADER_MIDDLEWARE = {
                         'spider.middlewares.RetryChangeProxyMiddleware': 600,
                         }
In []:
#and then you just want to send requests through local tor proxy (polipo) which could be done with:

tsocks scrapy crawl spirder 

#does anyone can confirm, that this method works and you get different IPs?


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий