72 votes

Qui est le meilleur dans Python: urllib2, PycURL ou mécaniser?

Ok, donc j'ai besoin de télécharger des pages web à l'aide de Python et fait une rapide enquête de mes options.

Inclus avec Python:

urllib - me semble que je devrais utiliser urllib2 à la place. urllib n'a pas le support des cookies, HTTP/FTP/fichiers locaux uniquement (sans SSL)

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

Complète:

mécaniser - peut utiliser/enregistrer Firefox/IE cookies, de prendre des mesures comme suivre second lien, activement maintenu (0.2.5 publié en Mars 2011)

PycURL - prend en charge tout curl n' (FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE et LDAP), mauvaise nouvelle: pas de mise à jour depuis, 9 septembre 2008 (7.19.0)

De nouvelles possibilités:

urllib3 - prend en charge la connexion de ré-utilisation/mise en commun et l'affichage de fichier

Obsolète (un.k.un. utilisation 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, c'est que urllib/urllib2/PycURL/mécaniser sont tous assez de maturité des solutions qui fonctionnent bien. mécaniser et PycURL navire avec un certain nombre de distributions Linux (par exemple Fedora 13) et les Bsd, donc l'installation est un non-problème en général (donc c'est bien).

urllib2 semble bon mais je me demandais pourquoi PycURL et mécaniser les deux semblent très populaire, est-il quelque chose que je suis absent (c'est à dire si j'utilise urllib2 je me peindre dans un coin à un certain point?). J'aimerais vraiment que certains des commentaires sur les avantages/inconvénients de ces choses afin que je puisse faire le meilleur choix pour moi-même.

Edit: ajout d'une remarque sur le verbe support dans urllib2

45voto

Diego Castro Points 1953

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

À partir de la PYCON 2009 horaire:

Ne vous vous trouvez face à les sites web qui ont données dont vous avez besoin pour extrait? Votre vie serait plus simple si vous pouvez par programmation des données d'entrée dans les applications web, même ceux à l'écoute de résister à l'interaction par des robots?

Nous allons en discuter les bases du web en grattant, puis plonger dans l' détails de méthodes différentes et où ils sont plus applicables.

Vous allez quitter avec une compréhension de quand s'applique différents outils, et d'en apprendre sur un "marteau lourd" pour la capture d'écran que j'ai ramassé à un projet pour le L'Electronic Frontier Foundation.

Participants doivent apporter un ordinateur portable, si possible, d'essayer les exemples que nous discuter et éventuellement prendre des notes.

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

  • PyCon 2010: Gratter le Web: Stratégies pour la programmation de sites web qui ne ne s'y attendait 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 grattage: de manière Fiable et efficace de récupérer des données à partir de pages qui ne s'y attendent pas

Informations passionnantes est pris au piège dans des 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 en font >grattage plus rapide et plus stable. Nous allons couvrir parallèle à télécharger avec Tordus, gevent, >et d'autres; analyser les sites derrière SSL; - la conduite de JavaScript-y des sites avec du Sélénium; et >éluder les courants anti-grattage techniques.

39voto

Tutul Points 553

Python demandes est également un bon candidat pour HTTP trucs. Il a une belle api à mon humble avis, un exemple de requête http à partir offciel de la documentation:

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

35voto

Ignacio Vazquez-Abrams Points 312628
  • urllib2 se trouve dans tous les Python installer partout, donc c'est une bonne base de départ.
  • PycURL est utile pour les personnes déjà l'habitude d'utiliser libcurl, expose plus de détails de bas niveau de HTTP, plus il gagne toutes les corrections ou des améliorations appliquées à libcurl.
  • mechanize est utilisé pour la persistance de conduire une connexion un peu comme un navigateur.

Il n'y a pas une meilleure que l'autre, c'est une question de choix de l'outil approprié pour le travail.

3voto

mit Points 4462

Pour "trouver des pages web", utilisez les demandes de!

À partir de http://docs.python-requests.org/en/latest/ :

Python standard urllib2 module fournit la plupart des HTTP capacités dont vous avez besoin, mais l'API est complètement cassé. Il a été construit pour un autre temps et un autre site web. Il exige une énorme quantité de travail (même méthode remplace) pour effectuer la plus simple de les tâches.

Les choses ne devraient pas être de cette façon. 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, ...}

2voto

wisty Points 4280

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

urllib2 est le meilleur (comme il est intégré), puis de passer à mécaniser si vous avez besoin des cookies de Firefox. mécaniser peut être utilisé comme un remplacement pour urllib2 - qu'ils ont des méthodes similaires, etc. L'utilisation de Firefox cookies signifie que vous pouvez obtenir les choses à partir de sites (comme, disons, StackOverflow) utilisez vos identifiants de connexion. Juste être responsable avec votre nombre de demandes (ou vous aurez bloqué).

PycURL est pour les gens qui ont besoin de tout le bas niveau de stuff en libcurl. Je voudrais essayer les autres bibliothèques de la première.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X