Comment utilisez-vous la prise en charge de proxy avec le cadre de scrap python Scrapy?
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
proxy unique
Activez HttpProxyMiddleware
dans votre settings.py
, comme ça:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1
}
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
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?
ce serait:
exporter http_proxy = http: // utilisateur: mot de passe @ proxy: port
Il y a un middleware Nice écrit par quelqu'un [1]: https://github.com/aivarsk/scrapy-proxies "middleware Scrapy proxy"
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).
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"
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
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 !!!