Maison  >  Article  >  développement back-end  >  [Python] Web Crawler (4) : Introduction et applications pratiques d'Opener et de Handler

[Python] Web Crawler (4) : Introduction et applications pratiques d'Opener et de Handler

黄舟
黄舟original
2017-01-21 13:50:521335parcourir

Avant de commencer le contenu suivant, expliquons d'abord les deux méthodes dans urllib2 : info et geturl

La réponse de l'objet de réponse (ou instance HTTPError) renvoyée par urlopen a deux méthodes très utiles info() et geturl( )

1.geturl() :

Ceci renvoie la véritable URL obtenue. Ceci est très utile car urlopen (ou celle utilisée par l'objet opener) peut avoir des redirections. L'URL obtenue peut être différente de l'URL de la demande.

Prenons comme exemple un lien hypertexte dans Renren,


Nous construisons un urllib2_test10.py pour comparer l'URL d'origine et le lien redirigé :

from urllib2 import Request, urlopen, URLError, HTTPError  
  
  
old_url = 'http://rrurl.cn/b1UZuP'  
req = Request(old_url)  
response = urlopen(req)    
print 'Old url :' + old_url  
print 'Real url :' + response.geturl()

Après l'exécution, vous pouvez voir l'URL pointée par le vrai lien :

[Python] Web Crawler (4) : Introduction et applications pratiques dOpener et de Handler

2.info() :

Cela renvoie un objet Un objet dictionnaire qui décrit la situation de la page obtenue. En-têtes généralement spécifiques envoyés par le serveur. Actuellement, une instance de httplib.HTTPMessage.

Les en-têtes classiques incluent "Content-length", "Content-type" et d'autres contenus.


Nous construisons une urllib2_test11.py pour tester l'application de l'info :

from urllib2 import Request, urlopen, URLError, HTTPError  
  
old_url = 'http://www.baidu.com'  
req = Request(old_url)  
response = urlopen(req)    
print 'Info():'  
print response.info()

Les résultats de l'opération sont les suivants, vous pouvez voir la page Informations associées :

[Python] Web Crawler (4) : Introduction et applications pratiques dOpener et de Handler

Parlons de deux concepts importants dans urllib2 : les ouvreurs et les gestionnaires.

1.Openers :

Lorsque vous obtenez une URL, vous utilisez un ouvreur (une instance de urllib2.OpenerDirector).

Normalement, nous utilisons l'ouvreur par défaut : via urlopen.

Mais vous pouvez créer vos propres ouvreurs.

2.Poignées :

Les ouvreurs utilisent des gestionnaires de processeur, et tous les travaux « lourds » sont gérés par les gestionnaires.

Chaque gestionnaire sait comment ouvrir des URL via un protocole spécifique, ou comment gérer différents aspects de l'ouverture d'une URL.

Tels que la redirection HTTP ou les cookies HTTP.


Vous souhaiterez créer un ouvreur si vous souhaitez obtenir des URL avec un gestionnaire spécifique, par exemple obtenir un ouvreur qui gère les cookies, ou obtenir un ouvreur qui ne le fait pas réorienter.


Pour créer un opener, instanciez un OpenerDirector,

puis appelez .add_handler(some_handler_instance).

De même, vous pouvez utiliser build_opener, qui est une fonction plus pratique pour créer des objets d'ouverture. Elle ne nécessite qu'un seul appel de fonction.
build_opener ajoute plusieurs processeurs par défaut, mais fournit un moyen rapide d'ajouter ou de mettre à jour les processeurs par défaut.

Autres gestionnaires que vous souhaiterez peut-être gérer les proxys, la validation et d'autres cas courants mais quelque peu particuliers.


install_opener est utilisé pour créer un ouvreur par défaut (global). Cela signifie que l'appel à urlopen utilisera l'ouvreur que vous avez installé.

L'objet Opener a une méthode open.

Cette méthode peut être utilisée directement pour obtenir des urls comme la fonction urlopen : il n'est généralement pas nécessaire d'appeler install_opener, sauf par commodité.


Après avoir terminé les deux contenus ci-dessus, jetons un coup d'œil au contenu d'authentification de base qui sera utilisé ici.

Authentification de base

Pour démontrer la création et l'installation d'un gestionnaire, nous utiliserons HTTPBasicAuthHandler.

Lorsqu'une vérification de base est requise, le serveur envoie un en-tête (code d'erreur 401) pour demander la vérification. Ceci spécifie le schéma et un « domaine » et ressemble à ceci : Www-authenticate : SCHEME realm="REALM".

Par exemple
Www-authenticate : Basic realm="cPanel Users"

Le client doit utiliser une nouvelle requête et inclure le nom et le mot de passe corrects dans les en-têtes de la requête.

Il s'agit de "l'authentification de base". Afin de simplifier ce processus, nous pouvons créer une instance de HTTPBasicAuthHandler et laisser opener utiliser ce gestionnaire.


HTTPBasicAuthHandler utilise un objet de gestion de mot de passe pour gérer les URL et les domaines afin de mapper les noms d'utilisateur et les mots de passe.

Si vous savez ce qu'est le domaine (dans l'en-tête envoyé depuis le serveur), vous pouvez utiliser HTTPPasswordMgr.


Habituellement, les gens ne se soucient pas de ce qu'est un royaume. Dans ce cas, le HTTPPasswordMgrWithDefaultRealm pratique peut être utilisé.

Cela spécifiera un nom d'utilisateur et un mot de passe par défaut pour votre URL.

Ceci sera fourni lorsque vous fournirez une autre combinaison pour un domaine spécifique.

Nous indiquons cette situation en spécifiant None pour le paramètre realm fourni à add_password.


L'URL de niveau le plus élevé est la première qui nécessite une vérification. Les URL plus profondes que vous transmettez à .add_password() conviendront également.

Après avoir dit tant de bêtises, utilisons un exemple pour démontrer ce qui est dit ci-dessus.


Nous construisons un urllib2_test12.py pour tester l'application d'informations :

# -*- coding: utf-8 -*-  
import urllib2  
  
# 创建一个密码管理者  
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()  
  
# 添加用户名和密码  
  
top_level_url = "http://example.com/foo/"  
  
# 如果知道 realm, 我们可以使用他代替 ``None``.  
# password_mgr.add_password(None, top_level_url, username, password)  
password_mgr.add_password(None, top_level_url,'why', '1223')  
  
# 创建了一个新的handler  
handler = urllib2.HTTPBasicAuthHandler(password_mgr)  
  
# 创建 "opener" (OpenerDirector 实例)  
opener = urllib2.build_opener(handler)  
  
a_url = 'http://www.baidu.com/'  
  
# 使用 opener 获取一个URL  
opener.open(a_url)  
  
# 安装 opener.  
# 现在所有调用 urllib2.urlopen 将用我们的 opener.  
urllib2.install_opener(opener)

Remarque : dans l'exemple ci-dessus, nous fournissons uniquement notre HHTTPasicAuthHandler à build_opener .

Les ouvreurs par défaut ont des gestionnaires normaux : ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.

Le top_level_url dans le code peut en fait être une URL complète (comprenant "http:", ainsi que le nom d'hôte et le numéro de port facultatif).


Par exemple : http://example.com/.

peut également être une "autorité" (c'est-à-dire un nom d'hôte et éventuellement un numéro de port).

Par exemple : "exemple.com" ou "exemple.com:8080".

Ce dernier contient le numéro de port.

Ce qui précède est le contenu de [Python] Web Crawler (4) : Introduction et exemples d'applications d'Opener et de Handler. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn). !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn