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
Antworten:
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.
quelle
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:
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
quelle
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 ...
quelle
Verwenden Sie Anfragen , um "einige Webseiten zu erhalten" !
Von http://docs.python-requests.org/en/latest/ :
>>> 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, ...}
quelle
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.
quelle
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.
quelle
urllib2.urlopen
eineHEAD
Anforderung generieren können , wird sie nicht unterstützt. Erstellen einer benutzerdefinierten Unterklasse! =HEAD
Unterstützung. Ich könnte eineint
Unterklasse erstellen , die generiertHTML
, aber es würde niemals Sinn machen zu sagen, dass Pythonint
generieren kannHTML
.ullib2.urlopen
Generieren einer Nicht-GET- oder POST-Anfrage verweisen können, werde ich meine Antwort löschen.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.
quelle
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.
quelle