Настройка промежуточного ПО прокси-сервера Scrapy для поворота по каждому запросу

Этот вопрос обязательно возникает в двух формах, потому что я не знаю лучшего пути к решению.

Сайт, который я просматриваю, часто меня пересылает на перенаправленную страницу «Пользовательские блокировки», но частота (по запросу / времени) кажется случайной, и они, похоже, имеют черный список, блокирующий многие из «открытых» списков прокси, которые я использую через Проксимеш. Так…

  1. Когда Scrapy получает «перенаправление» к его запросу (например, DEBUG: Redirecting (302) to (GET http://.../you_got_blocked.aspx) from (GET http://.../page-544.htm) ), продолжает ли он пытаться добраться до страницы 544.htm, или продолжит ли она до страницы 545.htm и навсегда проиграет на странице 544.htm? Если он «забывает» (или считает его посещенным), есть ли способ сказать ему продолжать повторять эту страницу? (Если это так естественно, тогда yay, и хорошо знать …)

  2. Какое наиболее эффективное решение?

(a) Что я сейчас делаю: используя прокси-сервер с проксимишером через переменную окружения http_proxy, которая, по-видимому, достаточно часто поворачивает прокси, чтобы, по крайней мере, довольно регулярно проходить перенаправления целевого сайта. (Даунсайды: открытые прокси-серверы медленно пингуют, их только так много, проксимеш в конечном итоге начнет заряжать меня за гиг за 10 концертов, мне нужно, чтобы они вращались при перенаправлении, я не знаю, как часто или на что триггер они вращаются, и выше: я не знаю, будут ли страницы, которые меня перенаправляют, переупорядочиваются с помощью Scrapy …) (Если Proxymesh вращается по каждому запросу, тогда я в порядке с разумной расходы.)

(б) Имеет ли смысл (и будет просто) использовать промежуточное программное обеспечение для повторного выбора нового прокси для каждого перенаправления? Как насчет каждого запроса? Будет ли это иметь больше смысла с помощью чего-то другого, такого как TOR или Proxifier? Если это будет относительно просто, как бы настроить его? Я читал что-то вроде этого в нескольких местах, но большинство из них устарело со сломанными ссылками или устаревшими командами Scrapy.

Для справки, у меня есть промежуточное программное обеспечение, которое в настоящее время настроено для Proxy Mesh (да, я использую переменную окружения http_proxy, но я поклонник избыточности, когда дело доходит до того, что вы не попали в неприятности). Так вот что я имею для этого в настоящее время, если это имеет значение:

  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 

One Solution collect form web for “Настройка промежуточного ПО прокси-сервера Scrapy для поворота по каждому запросу”

вчера у меня была аналогичная задача с прокси-сервером и защита от DDoS. (Я проанализировал сайт) Идея в random.choice . У каждого запроса есть шанс изменить IP. Scrapy использует Tor и telnetlib3. Вам необходимо настроить пароль ControlPort.

 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') из 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') 
  • Python: Как сделать несколько запросов HTTP POST в один момент?
  • Как создать HTTP GET-запрос Scapy?
  • iOS Chunked Upload
  • Обнаружение типа запроса HTTP (GET, HEAD и т. Д.) Из cgi python
  • Как я могу выполнить запрос HEAD в библиотеке механизации?
  • Использование urllib2 через прокси-сервер
  • Селен медленно, или мой код неправильный?
  • Использование декодеров ETag / Last-Modified с использованием общих представлений Django на основе классов
  • Запросы Python, как добавить запрос типа контента к запросу multipart / form-data
  • Python OAuth WooCommerce
  • Как я могу вернуть код статуса HTTP 204 из представления Django?
  • Python - лучший язык программирования в мире.