Frage

Wie nutzen Sie Proxy-Unterstützung mit dem Python-Web-Scraping Rahmen Scrapy?

War es hilfreich?

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

  1. Aktivieren HttpProxyMiddleware in Ihrem settings.py, wie folgt aus:

    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1
    }
    
  2. 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 !!!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top