Python 将Scrapy代理中间件设置为在每次请求时轮换
这个问题必然有两种形式,因为我不知道更好的解决办法 我正在爬网的网站经常会将我踢到重定向的“用户阻止”页面,但频率(按请求/时间)似乎是随机的,而且他们似乎有一个黑名单阻止了我通过Proxymesh使用的许多“打开”代理列表。所以Python 将Scrapy代理中间件设置为在每次请求时轮换,python,redirect,proxy,scrapy,http-proxy,Python,Redirect,Proxy,Scrapy,Http Proxy,这个问题必然有两种形式,因为我不知道更好的解决办法 我正在爬网的网站经常会将我踢到重定向的“用户阻止”页面,但频率(按请求/时间)似乎是随机的,而且他们似乎有一个黑名单阻止了我通过Proxymesh使用的许多“打开”代理列表。所以 当Scrapy收到对其请求的“重定向”时(例如,DEBUG:Redirecting(302)to(GEThttp://.../you_got_blocked.aspx)从(得到)http://.../page-544.htm)),它是继续尝试访问page-544.ht
DEBUG:Redirecting(302)to(GEThttp://.../you_got_blocked.aspx)从(得到)http://.../page-544.htm)
),它是继续尝试访问page-544.htm,还是继续访问page-545.htm并永远失去page-544.htm?如果它“忘了”(或算作访问过),有没有办法告诉它继续重试该页面?(如果这是自然的,那么是的,很高兴知道…) 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
昨天我在代理和DDoS防护方面也做了类似的工作 想法是随机的。选择。每个请求都有机会改变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')
来自scrapy导入日志的
从设置导入用户\代理\列表
随机输入
导入telnetlib
导入时间
#15%的知识产权变更
类RetryChangeProxyMiddleware(对象):
def过程_请求(自我、请求、蜘蛛):
如果是随机选择(X范围(1100))