Pregunta

¿Cómo se utiliza el soporte de proxy con el marco de raspado web pitón Scrapy?

¿Fue útil?

Solución

Desde el Scrapy FAQ ,

¿Funciona Scrapy con servidores proxy HTTP?

Sí. Soporte para HTTP proxies se proporciona (desde Scrapy 0.8) a través del Proxy HTTP descargador de middleware. Ver HttpProxyMiddleware .

La forma más fácil de usar un proxy es establecer la variable de entorno http_proxy. Cómo se hace esto depende de su cáscara.

C:\>set http_proxy=http://proxy:port
csh% setenv http_proxy http://proxy:port
sh$ export http_proxy=http://proxy:port

Si desea utilizar https proxy y visitado https web, para establecer la variable de entorno http_proxy que debe seguir a continuación,

C:\>set https_proxy=https://proxy:port
csh% setenv https_proxy https://proxy:port
sh$ export https_proxy=https://proxy:port

Otros consejos

un único Proxy

  1. Habilitar HttpProxyMiddleware en su settings.py, como esto:

    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1
    }
    
  2. pasar proxy para solicitud a través de request.meta:

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

También puede elegir una dirección de proxy al azar si usted tiene un conjunto de direcciones. De esta manera:

Múltiples servidores proxy

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

1-Crear un nuevo archivo llamado “middlewares.py” y guardarlo en su proyecto scrapy y agregue el código siguiente a la misma.

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 - fichero de configuración de su proyecto Open (./project_name/settings.py) y añadir el siguiente código

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

Ahora, sus solicitudes se debe pasar por este proxy. Simple, ¿verdad?

que sería:

exportación http_proxy = http: // usuario: contraseña @ proxy: puerto

No es agradable middleware escrito por otra [1]: https://github.com/aivarsk/scrapy -proxies "Scrapy middleware proxy"

En Windows junté un par de respuestas anteriores y funcionó. Yo simplemente hice:

C:>  set http_proxy = http://username:password@proxy:port

y luego me lanzó mi programa:

C:/.../RightFolder> scrapy crawl dmoz

donde "dmzo" es el nombre del programa (lo estoy escribiendo porque es el que usted encuentra en un tutorial sobre Internet, y si estás aquí es probable que haya comenzado desde el tutorial).

Como he tenido problemas al establecer el entorno en / etc / environment, esto es lo que he puesto en mi araña (Python):

os.environ["http_proxy"] = "http://localhost:12345"

Yo recomendaría utilizar un middleware como scrapy-proxies . Puede proxies giran filtro malos servidores proxy o utiliza un único proxy para toda su petición. Además, el uso de un middleware le ahorrará la molestia de crear proxy en cada carrera.

Este es directamente desde el GitHub README.

  • Instalar la biblioteca de proxy scrapy-rotación-

    pip install scrapy_proxies

  • En su settings.py añadir los siguientes ajustes

# Retry many times since proxies often fail
RETRY_TIMES = 10
# Retry on most error codes since proxies fail for different reasons
RETRY_HTTP_CODES = [500, 503, 504, 400, 403, 404, 408]

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
    'scrapy_proxies.RandomProxy': 100,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

# Proxy list containing entries like
# http://host1:port
# http://username:password@host2:port
# http://host3:port
# ...
PROXY_LIST = '/path/to/proxy/list.txt'

# Proxy mode
# 0 = Every requests have different proxy
# 1 = Take only one proxy from the list and assign it to every requests
# 2 = Put a custom proxy to use in the settings
PROXY_MODE = 0

# If proxy mode is 2 uncomment this sentence :
#CUSTOM_PROXY = "http://host1:port"

Aquí puede cambiar los tiempos reintentos , establecer un representación única o de rotación

  • A continuación, añadir el proxy a un archivo list.txt como esto
http://host1:port
http://username:password@host2:port
http://host3:port

Después de esto a todas sus peticiones para ese proyecto se enviarán a través del proxy. Proxy se gira para cada petición al azar. No afectará a la concurrencia.

Nota: Cuando no tiene la quiere usar proxy. Simplemente puede comentar la scrapy_proxy middleware línea.

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
#    'scrapy_proxies.RandomProxy': 100,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

feliz que se arrastra !!!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top