Frage
Wie nutzen Sie Proxy-Unterstützung mit dem Python-Web-Scraping Rahmen Scrapy?
Lösung
Von der Scrapy FAQ ,
Does Scrapy Arbeit mit HTTP-Proxies?
Ja. Unterstützung für HTTP-Proxies bereitgestellt (da Scrapy 0,8) über die HTTP-Proxy-Downloader-Middleware. Siehe
HttpProxyMiddleware
.
Der einfachste Weg, einen Proxy zu verwenden, ist der Umgebungsvariable http_proxy
einzustellen. Wie dies geschieht, hängt von der Shell.
C:\>set http_proxy=http://proxy:port csh% setenv http_proxy http://proxy:port sh$ export http_proxy=http://proxy:port
Wenn Sie verwenden möchten, HTTPS-Proxy und besuchten https Web, die Umgebungsvariable http_proxy
zu setzen, sollten Sie unten folgen,
C:\>set https_proxy=https://proxy:port csh% setenv https_proxy https://proxy:port sh$ export https_proxy=https://proxy:port
Andere Tipps
Single Proxy
-
Aktivieren
HttpProxyMiddleware
in Ihremsettings.py
, wie folgt aus:DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1 }
-
Proxy-Anforderung über
request.meta
übergeben:request = Request(url="http://example.com") request.meta['proxy'] = "host:port" yield request
Sie können auch eine Proxy-Adresse zufällig wählen, ob Sie einen Adresspool haben. Wie folgt aus:
Mehrere Proxies
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-Erstellen Sie eine neue Datei mit dem Namen „middlewares.py“ und speichern Sie es in Ihrem scrapy Projekt, und fügen Sie den folgenden Code hinzu.
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 - Öffnen Sie Ihre Projekt-Konfigurationsdatei (./project_name/settings.py) und fügen Sie den folgenden Code
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
'project_name.middlewares.ProxyMiddleware': 100,
}
Nun, Ihre Anfragen sollten von diesem Proxy übergeben werden. Einfach, nicht wahr?
Das wäre:
export http_proxy = http: // user: password @ Proxy: Port
Es ist schön, Middleware von jemandem geschrieben [1]: https://github.com/aivarsk/scrapy -proxies "Scrapy Proxy-Middleware"
In Windows ich ein paar früheren Antworten zusammen und es funktionierte. Ich einfach tat:
C:> set http_proxy = http://username:password@proxy:port
und dann startete ich mein Programm:
C:/.../RightFolder> scrapy crawl dmoz
, wobei „dmzo“ ist der Programmname (ich schreibe es, weil es ist diejenige, die Sie in einem Tutorial im Internet finden, und wenn Sie hier sind haben Sie wahrscheinlich aus dem Tutorial gestartet).
Als ich Probleme hatte durch die Umwelt Einstellung in / etc / environment, hier ist das, was ich in meiner Spinne gesetzt habe (Python):
os.environ["http_proxy"] = "http://localhost:12345"
Ich würde Ihnen empfehlen, eine Middleware zu verwenden, wie zum Beispiel scrapy-Proxies . Sie können drehen Proxies, Filter schlecht Proxies oder verwenden einen einzigen Proxy für alle Ihre Anfrage. Auch eine Middleware erhalten Sie die Probleme der Einrichtung Proxy auf jedem Lauf speichern.
Dies ist direkt von der GitHub README.
-
Installieren Sie die scrapy rotierenden Proxy-Bibliothek
pip install scrapy_proxies
-
In Ihrem settings.py die folgenden Einstellungen hinzufügen
# 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"
Hier können Sie ändern Wiederholungs mal , stellen Sie eine ein- oder rotierenden Proxy
- Fügen Sie dann Ihre Proxy auf eine list.txt Datei wie diese
http://host1:port
http://username:password@host2:port
http://host3:port
Nach all Ihre Wünsche für dieses Projekt wird durch Proxy gesendet werden. Proxy wird zufällig für jede Anforderung gedreht. Es wird nicht die Parallelität beeinflussen.
Hinweis: Wenn Sie donot wollen Proxy verwenden. Sie können einfach kommentieren Sie die scrapy_proxy Middleware-Linie.
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
# 'scrapy_proxies.RandomProxy': 100,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
Happy Crawling !!!