web-dev-qa-db-fra.com

Scrapy et procurations

Comment utilisez-vous la prise en charge de proxy avec le cadre de scrap python Scrapy?

39
no1

De la Scrapy FAQ ,

Scrapy fonctionne-t-il avec les proxys HTTP?

Oui. La prise en charge des proxys HTTP est fournie (depuis Scrapy 0.8) via le middleware de téléchargement du proxy HTTP. Voir HttpProxyMiddleware .

La façon la plus simple d'utiliser un proxy est de définir la variable d'environnement http_proxy. La façon dont cela se fait dépend de votre Shell.

 C: \> set http_proxy = http: // proxy: port 
 Csh% setenv http_proxy http: // proxy: port 
 Sh $ export http_proxy = http: // proxy :Port

si vous souhaitez utiliser le proxy https et le site Web https visité, pour définir la variable d'environnement http_proxy vous devez suivre ci-dessous,

 C: \> set https_proxy = https: // proxy: port 
 Csh% setenv https_proxy https: // proxy: port 
 Sh $ export https_proxy = https: // proxy :Port
46
ephemient

proxy unique

  1. Activez HttpProxyMiddleware dans votre settings.py, comme ça:

    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 mandataires

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
43
Amom

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 doivent être passées par ce proxy. C'est simple, non?

26
Shahryar Saljoughi

ce serait:

exporter http_proxy = http: // utilisateur: mot de passe @ proxy: port

9
laurent alsina

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

4
Niranjan Sagar

Dans Windows, j'ai rassemblé quelques réponses précédentes et cela a fonctionné. J'ai simplement fait:

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

puis j'ai lancé mon programme:

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

où "dmzo" est le nom du programme (je l'écris parce que c'est celui que vous trouvez dans un tutoriel sur Internet, et si vous êtes ici, vous avez probablement commencé à partir du tutoriel).

3
Andrea Ianni ௫

Comme j'ai eu du mal à configurer l'environnement dans/etc/environment, voici ce que j'ai mis dans mon araignée (Python):

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

Je vous recommande d'utiliser un middleware tel que scrapy-proxies . Vous pouvez faire pivoter les proxy, filtrer les mauvais proxy ou utiliser un seul proxy pour toutes vos demandes. En outre, l'utilisation d'un middleware vous évitera de configurer un proxy à chaque exécution.

C'est directement à partir du fichier LISEZMOI de GitHub.

  • Installez la bibliothèque de proxy rotatif

    pip install scrapy_proxies

  • Dans votre settings.py ajoutez les paramètres suivants

# 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"

Ici, vous pouvez modifier les temps de nouvelle tentative , définir un proxy simple ou rotatif

  • Ajoutez ensuite votre proxy à un fichier list.txt comme celui-ci
http://Host1:port
http://username:password@Host2:port
http://Host3:port

Après cela, toutes vos demandes pour ce projet seront envoyées via un proxy. Le proxy pivote au hasard pour chaque demande. Cela n'affectera pas la simultanéité.

Remarque: si vous ne souhaitez pas utiliser de proxy. Vous pouvez simplement commenter la ligne middleware scrapy_proxy .

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

Bonne exploration !!!

0
Amit