Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将Scrapy代理中间件设置为在每次请求时轮换_Python_Redirect_Proxy_Scrapy_Http Proxy - Fatal编程技术网

Python 将Scrapy代理中间件设置为在每次请求时轮换

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

这个问题必然有两种形式,因为我不知道更好的解决办法

我正在爬网的网站经常会将我踢到重定向的“用户阻止”页面,但频率(按请求/时间)似乎是随机的,而且他们似乎有一个黑名单阻止了我通过Proxymesh使用的许多“打开”代理列表。所以

  • 当Scrapy收到对其请求的“重定向”时(例如,
    DEBUG:Redirecting(302)to(GEThttp://.../you_got_blocked.aspx)从(得到)http://.../page-544.htm)
    ),它是继续尝试访问page-544.htm,还是继续访问page-545.htm并永远失去page-544.htm?如果它“忘了”(或算作访问过),有没有办法告诉它继续重试该页面?(如果这是自然的,那么是的,很高兴知道…)

  • 什么是最有效的解决方案

  • (a) 我目前正在做的是:通过http_Proxy环境变量使用proxymesh旋转代理,这似乎足够频繁地旋转代理,至少相当定期地通过目标站点的重定向。(缺点:打开的代理ping速度很慢,只有这么多,proxymesh最终将开始向我收取每gig超过10 gig的费用,我只需要它们在重定向时旋转,我不知道它们旋转的频率或触发点,以及上面的内容:我不知道我被重定向的页面是否被Scrapy重新排队…)(如果Proxymesh根据每个请求进行旋转,那么我可以支付合理的费用。)

    (b) 这有意义吗(而且很简单)使用中间件在每次重定向时重新选择一个新代理?在每次请求时如何?通过TOR或Proxifier之类的其他方法是否更有意义?如果这相对简单,我该如何设置?我在一些地方读过类似的内容,但大多数都过时了,链接断开或不推荐使用的Scrapy co曼兹

    作为参考,我目前确实为代理网格设置了中间件(是的,我使用的是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
    

    昨天我在代理和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))