2016-04-29 12 views
2

Ich habe festgestellt, dass es mehrere Möglichkeiten gibt, http-Verbindungen für das Verschrotten von Webseiten zu initiieren. Ich bin nicht sicher, ob einige neuere und aktuellere Arten der Codierung sind, oder ob es nur unterschiedliche Module mit unterschiedlichen Vor- und Nachteilen sind. Genauer gesagt versuche ich zu verstehen, was die Unterschiede zwischen den beiden folgenden Ansätzen sind und was würden Sie empfehlen?Was ist der praktische Unterschied zwischen diesen beiden Möglichkeiten, Webverbindungen in Python herzustellen?

1) Mit urllib3:

http = PoolManager() 
r = http.urlopen('GET', url, preload_content=False) 
soup = BeautifulSoup(r, "html.parser") 

2) Verwenden von Anfragen

html = requests.get(url).content 
soup = BeautifulSoup(html, "html5lib") 

Was auseinander diese beiden Optionen setzt, neben der einfachen Tatsache, dass sie benötigen, importieren verschiedene Module?

+0

Die 'requests' Modul verwendet (und [packages/vendorizes 'urllib3'] (https://github.com/kennethreitz/requests/tree/master/requests/packages)) unter der Haube - aber Es bietet eine etwas höhere Ebene und eine einfachere API darüber. –

+0

Abgesehen davon, dass Anfragen eine API höherer Ebene, wahrscheinlich mit etwas weniger Code, bieten, gibt es Situationen, in denen es besser wäre, sich für das eine oder andere zu entscheiden? Oder ist es generell eine bessere Option, ganz auf "Anfragen" zu setzen? –

+0

Ich empfehle immer "Anfragen" zu verwenden. Es macht HTTP einfach sehr angenehm zu handhaben, und wenn es etwas gibt, was man mit "Anfragen" nicht machen kann, das kann man mit "urllib3", bin ich noch nicht darauf gestoßen. Aber das ist nur [meine Meinung] (http://stackoverflow.com/help/dont-ask). –

Antwort

4

Unter der Haube, verwendet requestsurllib3, um die meisten http Schwerlast zu tun. Bei richtiger Verwendung sollte es größtenteils identisch sein, es sei denn, Sie benötigen eine erweiterte Konfiguration.

Außer in Ihrem speziellen Beispiel sie nicht die gleichen sind:

Im urllib3 Beispiel Sie erneut mit Verbindungen während in der Anfragen Beispiel sind Sie keine Verbindungen wiederverwenden. Hier ist, wie Sie sagen können:

>>> import requests 
>>> requests.packages.urllib3.add_stderr_logger() 
2016-04-29 11:43:42,086 DEBUG Added a stderr logging handler to logger: requests.packages.urllib3 
>>> requests.get('https://www.google.com/') 
2016-04-29 11:45:59,043 INFO Starting new HTTPS connection (1): www.google.com 
2016-04-29 11:45:59,158 DEBUG "GET/HTTP/1.1" 200 None 
>>> requests.get('https://www.google.com/') 
2016-04-29 11:45:59,815 INFO Starting new HTTPS connection (1): www.google.com 
2016-04-29 11:45:59,925 DEBUG "GET/HTTP/1.1" 200 None 

Um die Wiederverwendung von Verbindungen wie in einem urllib3 Poolmanager zu starten, müssen Sie Sitzung ein Anträge stellen.

>>> session = requests.session() 
>>> session.get('https://www.google.com/') 
2016-04-29 11:46:49,649 INFO Starting new HTTPS connection (1): www.google.com 
2016-04-29 11:46:49,771 DEBUG "GET/HTTP/1.1" 200 None 
>>> session.get('https://www.google.com/') 
2016-04-29 11:46:50,548 DEBUG "GET/HTTP/1.1" 200 None 

Jetzt es entspricht dem, was man mit http = PoolManager() taten. Eine weitere Anmerkung: urllib3 ist eine explizitere Bibliothek der unteren Ebene. Daher erstellen Sie explizit einen Pool, und Sie müssen beispielsweise explizit your SSL certificate location angeben. Es ist eine zusätzliche Zeile oder zwei von mehr Arbeit, aber auch ein bisschen mehr Kontrolle, wenn das, was Sie suchen.

Alle gesagt und getan ist, wird der Vergleich:

1) Unter Verwendung urllib3:

import urllib3, certifi 
http = urllib3.PoolManager(ca_certs=certifi.where()) 
html = http.request('GET', url).read() 
soup = BeautifulSoup(html, "html5lib") 

2) Verwenden von Anfragen:

import requests 
session = requests.session() 
html = session.get(url).content 
soup = BeautifulSoup(html, "html5lib")