2016-07-16 3 views
0

Ich benutze python3 urllib3, um einen Crawler zu bauen, um mehrere URLs herunterzuladen.Python3 urllib3 crawler - kann max Verbindungen zu einer einzelnen Domäne nicht beschränken

Auf meiner Haupttätigkeit schaffen i 20 Threads, dass das gleiche (eins) Instanz meine Downloader-Klasse, die eine Instanz von PoolManager verwendet:

def __init__(self): 
    self.manager = PoolManager(num_pools=20) 

Ich habe versucht, über die gleiche URL einreichen und wieder und ich sehe im Log, dass es viele Verbindungen zu der gleichen Domain schafft. Ich habe versucht, die Anzahl der Pools zu begrenzen (num_pools=1) und es schafft immer noch mehrere Verbindungen zu derselben URL. Auf der Dokumentation habe ich verstanden, dass die PoolManager eine neue Verbindung erstellt, wenn die anderen Verbindungen zu der gleichen Domäne verwendet werden.

Ich möchte die Anzahl der Verbindung zu einer einzigen Domäne beschränken. Die Verwendung von bis zu zwei verschiedenen Verbindungen wird von einem normalen Browser verwendet, damit er sicher ist. Wie kann ich das machen?

Antwort

1

PoolManager(num_pools=20) wird den Pool auf 20 zwischengespeicherte Instanzen von ConnectionPools beschränken, die normalerweise jeweils eine Domäne repräsentieren. Sie beschränken also effektiv auf 20 zwischengespeicherte Domain-Pools. Die Verbindungen pro Domain sind eine Ebene tiefer.

Wir können die Grenze pro ConnectionPool mit maxsize=20 angeben. Da Sie den Pool zum Drosseln Ihres Crawlers verwenden, sollten Sie auch block=True verwenden, wodurch das Erstellen zusätzlicher Verbindungen außerhalb des Limits verhindert wird. Mit block=False (Standard) werden bei Bedarf mehr Verbindungen erstellt, aber solche, die über die maximale Größe hinausgehen, werden nicht für die Wiederverwendung gespeichert.

Insgesamt wollen Sie wahrscheinlich:

def __init__(self): 
    self.manager = PoolManager(maxsize=20, block=True) 

Ein bisschen mehr Dokumentation, auf die Parameter zur Verfügung:

Verwandte Themen