web-dev-qa-db-fra.com

Quel est le meilleur en Python: urllib2, PycURL ou mécaniser?

Ok, j'ai donc besoin de télécharger des pages Web en utilisant Python et j'ai fait une enquête rapide sur mes options.

Inclus avec Python:

rllib - il me semble que je devrais utiliser urllib2 à la place. urllib ne prend pas en charge les cookies, HTTP/FTP/fichiers locaux uniquement (pas de SSL)

rllib2 - client HTTP/FTP complet, prend en charge les choses les plus nécessaires comme les cookies, ne prend pas en charge tous les verbes HTTP (uniquement GET et POST, pas de TRACE, etc.)

Complet:

mécaniser - peut utiliser/enregistrer les cookies Firefox/IE, prendre des mesures comme suivre le deuxième lien, activement maintenu (0.2.5 publié en mars 2011)

PycURL - prend en charge tout ce que fait curl (FTP, FTPS, HTTP, HTTPS, Gopher, TELNET, DICT, FILE et LDAP), mauvaise nouvelle: non mise à jour depuis le 9 septembre 2008 (7.19.0)

Nouvelles possibilités:

rllib - prend en charge la réutilisation/le regroupement de connexions et la publication de fichiers

Obsolète (par exemple, utilisez urllib/urllib2 à la place):

httplib - HTTP/HTTPS uniquement (pas de FTP)

httplib2 - HTTP/HTTPS uniquement (pas de FTP)

La première chose qui me frappe est que urllib/urllib2/PycURL/mechanize sont toutes des solutions assez matures qui fonctionnent bien. mechanize et PycURL sont livrés avec un certain nombre de distributions Linux (par exemple Fedora 13) et BSD, donc l'installation n'est généralement pas un problème (c'est donc bien).

urllib2 a l'air bien mais je me demande pourquoi PycURL et mécaniser semblent tous les deux très populaires, y a-t-il quelque chose qui me manque (c'est-à-dire si j'utilise urllib2 vais-je me peindre dans un coin à un moment donné?). J'aimerais vraiment avoir des commentaires sur les avantages/inconvénients de ces choses afin que je puisse faire le meilleur choix pour moi.

Edit: ajout d'une note sur le support des verbes dans urllib2

72
bigredbob
  • urllib2 se trouve dans chaque Python installation partout, c'est donc une bonne base sur laquelle commencer.
  • PycURL est utile pour les personnes déjà habituées à utiliser libcurl, expose davantage les détails de bas niveau de HTTP, plus il gagne les correctifs ou améliorations appliqués à libcurl.
  • mechanize est utilisé pour conduire de manière persistante une connexion un peu comme le ferait un navigateur.

Ce n'est pas une question d'être meilleur que l'autre, c'est une question de choisir l'outil approprié pour le travail.

35

Je pense que cette conférence (au pycon 2009) a les réponses à ce que vous recherchez (Asheesh Laroia a beaucoup d'expérience en la matière). Et il souligne le bon et le mauvais de la plupart de votre annonce

Du programme PYCON 2009:

Vous trouvez-vous confronté à des sites Web contenant des données que vous devez extraire? Votre vie serait-elle plus simple si vous pouviez entrer des données par programme dans des applications Web, même celles réglées pour résister à l'interaction des robots?

Nous discuterons des principes de base du scraping Web, puis nous plongerons dans les détails des différentes méthodes et où elles sont les plus applicables.

Vous repartirez avec une compréhension du moment où appliquer différents outils, et en apprendre davantage sur un "marteau lourd" pour le grattage d'écran que j'ai ramassé lors d'un projet pour la Fondation Electronic Frontier.

Les participants doivent apporter un ordinateur portable, si possible, pour essayer les exemples dont nous discutons et éventuellement prendre des notes.

Mise à jour: Asheesh Laroia a mis à jour sa présentation pour pycon 2010

  • PyCon 2010: Grattez le Web: Stratégies pour programmer des sites Web qui ne s'y attendaient pas

    * 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. 
    

Mise à jour 2:

PyCon US 2012 - Web scraping: extraire de manière fiable et efficace des données de pages qui ne s'y attendent pas

Des informations passionnantes sont piégées dans les pages Web et derrière les formulaires HTML. Dans ce tutoriel, vous apprendrez comment analyser ces pages et quand appliquer des techniques avancées qui rendent le grattage plus rapide et plus stable. Nous couvrirons le téléchargement parallèle avec Twisted, gevent,> et d'autres; analyser les sites derrière SSL; piloter des sites JavaScript-y avec Selenium; et> éluder les techniques anti-grattage courantes.

45
Diego Castro

Python requêtes est également un bon candidat pour les trucs HTTP. Il a un api IMHO plus agréable, un exemple de demande http de leur documentation officielle:

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

Pour "obtenir des pages Web", utilisez les demandes !

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

Le module urllib2 standard de Python fournit la plupart des capacités HTTP dont vous avez besoin, mais l'API est complètement rompue. Il a été construit pour une autre époque - et un site Web différent. Cela nécessite une énorme quantité de travail (même des remplacements de méthode) pour effectuer les tâches les plus simples.

Les choses ne devraient pas être ainsi. Pas en 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, ...}
3
mit

Ne vous inquiétez pas de la "dernière mise à jour". HTTP n'a pas beaucoup changé ces dernières années;)

urllib2 est le meilleur (car il est intégré), puis passez à la mécanisation si vous avez besoin de cookies de Firefox. mechanize peut être utilisé en remplacement de urllib2 - ils ont des méthodes similaires, etc. L'utilisation de cookies Firefox signifie que vous pouvez obtenir des choses à partir de sites (comme par exemple StackOverflow) en utilisant vos informations de connexion personnelles. Soyez juste responsable de votre nombre de demandes (ou vous serez bloqué).

PycURL est destiné aux personnes qui ont besoin de toutes les choses de bas niveau dans libcurl. J'essaierais d'abord les autres bibliothèques.

2
wisty

Urllib2 ne prend en charge que HTTP GET et POST, il peut y avoir des solutions de contournement, mais si votre application dépend d'autres verbes HTTP, vous préférerez probablement un module différent.

2
mikerobi

Jetez un oeil sur Grab (http://grablib.org). Il s'agit d'une bibliothèque réseau qui fournit deux interfaces principales: 1) Grab pour créer des requêtes réseau et analyser les données récupérées 2) Spider pour créer des scrapers de site en vrac

Sous le capot, Grab utilise pycurl et lxml mais il est possible d'utiliser d'autres transports réseau (par exemple, la bibliothèque de requêtes). Le transport des demandes n'est pas encore bien testé.

1
Gregory Petukhov

Chaque bibliothèque python qui parle HTTP a ses propres avantages.

Utilisez celui qui a le minimum de fonctionnalités nécessaires pour une tâche particulière.

Votre liste manque au moins rllib - une bibliothèque HTTP tierce cool qui peut réutiliser une connexion HTTP, accélérant ainsi considérablement le processus de récupération de plusieurs URL à partir du même site.

1
jedi_coder