53 votes

Scrapy et proxys

Comment utilisez-vous la prise en charge du proxy avec le framework de grattage Web python Scrapy ?

53voto

Amom Points 629

Proxy unique

  1. Activez HttpProxyMiddleware dans votre settings.py , comme ceci :

     DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1
    }
    
  2. passer le proxy pour demander via request.meta :

     request = Request(url="http://example.com")
    request.meta['proxy'] = "host:port"
    yield request
    

Vous pouvez également choisir une adresse proxy au hasard si vous disposez d'un pool d'adresses. Comme ça:

Plusieurs procurations

 class MySpider(BaseSpider):
    name = "my_spider"
    def __init__(self, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.proxy_pool = ['proxy_address1', 'proxy_address2', ..., 'proxy_addressN']

    def parse(self, response):
        ...parse code...
        if something:
            yield self.get_request(url)

    def get_request(self, url):
        req = Request(url=url)
        if self.proxy_pool:
            req.meta['proxy'] = random.choice(self.proxy_pool)
        return req

32voto

1-Créez un nouveau fichier appelé "middlewares.py" et enregistrez-le dans votre projet scrapy et ajoutez-y le code suivant.

 import base64
class ProxyMiddleware(object):
    # overwrite process request
    def process_request(self, request, spider):
        # Set the location of the proxy
        request.meta['proxy'] = "http://YOUR_PROXY_IP:PORT"

        # Use the following lines if your proxy requires authentication
        proxy_user_pass = "USERNAME:PASSWORD"
        # setup basic authentication for the proxy
        encoded_user_pass = base64.encodestring(proxy_user_pass)
        request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

2 – Ouvrez le fichier de configuration de votre projet (./project_name/settings.py) et ajoutez le code suivant

 DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
    'project_name.middlewares.ProxyMiddleware': 100,
}

Maintenant, vos demandes devraient être transmises par ce proxy. Simple, n'est-ce pas ?

9voto

laurent alsina Points 171

ce serait:

export http_proxy=http://user:password@proxy:port

4voto

Niranjan Sagar Points 769

Il existe un bon middleware écrit par quelqu'un [1] : https://github.com/aivarsk/scrapy-proxies "Scrapy proxy middleware"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X