Welches ist das Beste in Python: urllib2, PycURL oder mechanize?


72

Ok, ich muss einige Webseiten mit Python herunterladen und habe meine Optionen schnell untersucht.

In Python enthalten:

urllib - scheint mir, dass ich stattdessen urllib2 verwenden sollte. urllib hat keine Cookie-Unterstützung, nur HTTP / FTP / lokale Dateien (kein SSL)

urllib2 - vollständiger HTTP / FTP-Client, unterstützt die am meisten benötigten Dinge wie Cookies, unterstützt nicht alle HTTP-Verben (nur GET und POST, kein TRACE usw.)

Voll ausgestattet:

mechanisieren - kann Firefox / IE-Cookies verwenden / speichern, Aktionen wie den zweiten Link folgen, aktiv gepflegt (0.2.5 veröffentlicht im März 2011)

PycURL - unterstützt alles, was Curl macht (FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, DATEI und LDAP), schlechte Nachrichten: seit dem 9. September 2008 nicht aktualisiert (7.19.0)

Neue Möglichkeiten:

urllib3 - unterstützt die Wiederverwendung / das Pooling von Verbindungen und das Posten von Dateien

Veraltet (auch bekannt als urllib / urllib2):

httplib - Nur HTTP / HTTPS (kein FTP)

httplib2 - Nur HTTP / HTTPS (kein FTP)

Das erste, was mir auffällt, ist, dass urllib / urllib2 / PycURL / mechanize allesamt ziemlich ausgereifte Lösungen sind, die gut funktionieren. mechanize und PycURL werden mit einer Reihe von Linux-Distributionen (z. B. Fedora 13) und BSDs ausgeliefert, sodass die Installation normalerweise kein Problem darstellt (das ist also gut).

urllib2 sieht gut aus, aber ich frage mich, warum PycURL und mechanize beide sehr beliebt zu sein scheinen. Fehlt mir etwas (dh wenn ich urllib2 verwende, male ich mich irgendwann in eine Ecke?). Ich hätte gerne ein Feedback zu den Vor- und Nachteilen dieser Dinge, damit ich die beste Wahl für mich treffen kann.

Bearbeiten: Hinweis zur Verbunterstützung in urllib2 hinzugefügt


3
Was bedeutet "am besten"? Am besten in Bezug auf was? Am schnellsten? Größten? Beste Verwendung von Cookies? Was musst du tun?
S.Lott

1
httplib ist nicht "veraltet". Es ist ein Modul der unteren Ebene, auf dem urllib2 aufgebaut ist. Sie können es direkt verwenden, aber es ist einfacher über urllib2
Corey Goldberg

1
Was Corey gesagt hat, zB urllib3, ist eine Ebene über httplib. Außerdem ist httplib2 nicht veraltet - tatsächlich ist es neuer als urllib2 und behebt Probleme wie die Wiederverwendung von Verbindungen (wie bei urllib3).
Yang

12
Es gibt eine neuere Bibliothek namens Anfragen. Siehe docs.python-requests.org/en/latest/index.html
ustun

1
Mit @ustun: Verwenden Sie Anfragen.
Hughdbrown

Antworten:


35
  • urllib2 wird in jeder Python-Installation überall gefunden, ist also eine gute Basis, um zu beginnen.
  • PycURL Dies ist nützlich für Benutzer, die bereits an die Verwendung von libcurl gewöhnt sind. Außerdem werden mehr Details von HTTP auf niedriger Ebene angezeigt. Außerdem werden Korrekturen oder Verbesserungen für libcurl vorgenommen.
  • mechanize wird verwendet, um eine Verbindung dauerhaft herzustellen, ähnlich wie es ein Browser tun würde.

Es geht nicht darum, dass einer besser ist als der andere, sondern darum, das geeignete Werkzeug für den Job auszuwählen.


Ich habe httplib2 in meiner Python-Anwendung implementiert. Unterstützt httplib2 NTLM?. Wenn nicht, was muss ich für die NTLM-Authentifizierung tun?. Hinweis: Ich finde, dass httplib2 NTLM nicht unterstützt.
TinTin

2
@ Ayyappan urllib3 hat NTLM-Unterstützung über das Contrib-Submodul: urllib3 / Contrib / ntlmpool.py
Shazow

45

Ich denke, dieser Vortrag (auf der pycon 2009) hat die Antworten auf Ihre Fragen (Asheesh Laroia hat viel Erfahrung in dieser Angelegenheit). Und er weist auf die guten und die schlechten aus den meisten Ihrer Auflistungen hin

Aus dem PYCON 2009-Zeitplan:

Sind Sie mit Websites konfrontiert, deren Daten Sie extrahieren müssen? Wäre Ihr Leben einfacher, wenn Sie programmgesteuert Daten in Webanwendungen eingeben könnten, selbst solche, die so eingestellt sind, dass sie der Interaktion durch Bots widerstehen?

Wir werden die Grundlagen des Web-Scraping diskutieren und dann die Details der verschiedenen Methoden und deren Anwendbarkeit untersuchen.

Sie werden wissen, wann Sie verschiedene Werkzeuge anwenden müssen, und lernen einen "schweren Hammer" für das Scraping von Bildschirmen kennen, den ich bei einem Projekt für die Electronic Frontier Foundation aufgegriffen habe.

Die Teilnehmer sollten nach Möglichkeit einen Laptop mitbringen, um die besprochenen Beispiele auszuprobieren und optional Notizen zu machen.

Update: Asheesh Laroia hat seine Präsentation für pycon 2010 aktualisiert

  • PyCon 2010: Scrape the Web: Strategien zum Programmieren von Websites, die dies nicht erwartet haben

    * My motto: "The website is the API."
    * Choosing a parser: BeautifulSoup, lxml, HTMLParse, and html5lib.
    * Extracting information, even in the face of bad HTML: Regular expressions, BeautifulSoup, SAX, and XPath.
    * Automatic template reverse-engineering tools.
    * Submitting to forms.
    * Playing with XML-RPC
    * DO NOT BECOME AN EVIL COMMENT SPAMMER.
    * Countermeasures, and circumventing them:
          o IP address limits
          o Hidden form fields
          o User-agent detection
          o JavaScript
          o CAPTCHAs 
    * Plenty of full source code to working examples:
          o Submitting to forms for text-to-speech.
          o Downloading music from web stores.
          o Automating Firefox with Selenium RC to navigate a pure-JavaScript service. 
    * Q&A; and workshopping
    * Use your power for good, not evil. 
    

Update 2:

PyCon US 2012 - Web Scraping: Zuverlässiges und effizientes Abrufen von Daten von Seiten, die dies nicht erwarten

Spannende Informationen sind in Webseiten und hinter HTML-Formularen gefangen. In diesem Tutorial erfahren Sie, wie Sie diese Seiten analysieren und wann Sie fortgeschrittene Techniken anwenden, die das Scraping schneller und stabiler machen. Wir werden das parallele Herunterladen mit Twisted, gevent und anderen behandeln. Analysieren von Websites hinter SSL; Fahren von JavaScript-y-Sites mit Selen; und> Umgehung gängiger Anti-Scraping-Techniken.


Zwei oder drei Sätze, die die Empfehlungen des Vortrags zusammenfassen, wären großartig, wenn Sie nicht die Zeit hätten, sie anzuhören. :-)
Brandon Rhodes

39

Python- Anfragen sind auch ein guter Kandidat für HTTP-Inhalte. Es hat eine schönere API IMHO, ein Beispiel http Anfrage aus ihrer offiziellen Dokumentation:

>>> r = requests.get('https://api.github.com', auth=('user', 'pass'))
>>> r.status_code
204
>>> r.headers['content-type']
'application/json'
>>> r.content
...

Anfragen verwendet intern urlib3
Yuvaraj Loganathan

3

Verwenden Sie Anfragen , um "einige Webseiten zu erhalten" !

Von http://docs.python-requests.org/en/latest/ :

Das Standard-Modul urllib2 von Python bietet die meisten der benötigten HTTP-Funktionen, die API ist jedoch vollständig defekt. Es wurde für eine andere Zeit gebaut - und ein anderes Web. Es erfordert einen enormen Arbeitsaufwand (sogar Methodenüberschreibungen), um die einfachsten Aufgaben auszuführen.

Die Dinge sollten nicht so sein. Nicht in Python.

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

2

Mach dir keine Sorgen über "zuletzt aktualisiert". HTTP hat sich in den letzten Jahren nicht viel verändert;)

urllib2 ist am besten (da es eingebaut ist), wechseln Sie dann zur Mechanisierung, wenn Sie Cookies von Firefox benötigen. mechanize kann als Ersatz für urllib2 verwendet werden - es gibt ähnliche Methoden usw. Mit Firefox-Cookies können Sie mithilfe Ihrer persönlichen Anmeldeinformationen Dinge von Websites (z. B. StackOverflow) abrufen. Seien Sie einfach mit Ihrer Anzahl von Anfragen verantwortlich (oder Sie werden blockiert).

PycURL ist für Leute, die all die Low-Level-Sachen in libcurl brauchen. Ich würde zuerst die anderen Bibliotheken ausprobieren.


1
Anfragen sind auch nützlich beim Speichern von Cookies. Bei Anforderungen erstellen Sie eine neue Sitzung und rufen dann anstelle von request.get () sessionName.get () auf. Cookies werden dann in Ihrer Sitzung gespeichert. Wenn Sie sich beispielsweise mit einer Sitzung bei einer Website angemeldet haben, können Sie andere http-Anforderungen mit Ihrer Sitzung als angemeldeter Benutzer ausführen.
wp-overwatch.com

2

Urllib2 unterstützt nur HTTP GET und POST. Möglicherweise gibt es Problemumgehungen. Wenn Ihre App jedoch von anderen HTTP-Verben abhängt, bevorzugen Sie wahrscheinlich ein anderes Modul.



@Piotr Dobrogost. Immer noch sehr wahr. Bis Sie urllib2.urlopeneine HEADAnforderung generieren können , wird sie nicht unterstützt. Erstellen einer benutzerdefinierten Unterklasse! = HEADUnterstützung. Ich könnte eine intUnterklasse erstellen , die generiert HTML, aber es würde niemals Sinn machen zu sagen, dass Python intgenerieren kann HTML.
Mikerobi

Bis Sie urllib2.urlopen zum Generieren einer HEAD-Anforderung verwenden können, wird diese nicht unterstützt. Was bringt dich dazu, so zu denken? Erstellen einer benutzerdefinierten Unterklasse! = HEAD-Unterstützung. Welcher Teil der HEAD-Unterstützung fehlt urllib2?
Piotr Dobrogost

1
@Piotr Dobrogost, ich denke schon, weil es nicht von der API unterstützt wird. Wenn Sie mich auf ein Beispiel für das ullib2.urlopenGenerieren einer Nicht-GET- oder POST-Anfrage verweisen können, werde ich meine Antwort löschen.
Mikerobi

1

Jede Python-Bibliothek, die HTTP spricht, hat ihre eigenen Vorteile.

Verwenden Sie die Funktion mit der Mindestanzahl an Funktionen, die für eine bestimmte Aufgabe erforderlich sind.

In Ihrer Liste fehlt mindestens urllib3 - eine coole HTTP-Bibliothek von Drittanbietern, die eine HTTP-Verbindung wiederverwenden kann, wodurch das Abrufen mehrerer URLs von derselben Site erheblich beschleunigt wird.


Anfragen verwendet urllib3 unter der Haube.
wp-overwatch.com

1

Schauen Sie sich Grab an (http://grablib.org). Es handelt sich um eine Netzwerkbibliothek, die zwei Hauptschnittstellen bietet: 1) Grab zum Erstellen von Netzwerkanforderungen und zum Parsen abgerufener Daten 2) Spider zum Erstellen von Massen-Site-Scrapern

Unter der Haube verwendet Grab pycurl und lxml, es ist jedoch möglich, andere Netzwerktransporte zu verwenden (z. B. Anforderungsbibliothek). Anfragen Transport ist noch nicht gut getestet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.