Maison >développement back-end >Tutoriel Python >[Python] Web Crawler (5) : détails d'utilisation de urllib2 et des techniques d'exploration de sites Web
J'ai mentionné une introduction simple à urllib2 plus tôt, et voici quelques détails sur la façon d'utiliser urllib2.
1. Paramètres du proxy
urllib2 utilisera la variable d'environnement http_proxy pour définir le proxy HTTP par défaut.
Si vous souhaitez contrôler explicitement le proxy dans votre programme sans être affecté par les variables d'environnement, vous pouvez utiliser un proxy.
Créez un nouveau test14 pour implémenter une démo de proxy simple :
import urllib2 enable_proxy = True proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'}) null_proxy_handler = urllib2.ProxyHandler({}) if enable_proxy: opener = urllib2.build_opener(proxy_handler) else: opener = urllib2.build_opener(null_proxy_handler) urllib2.install_opener(opener)
Un détail à noter ici est que l'utilisation de urllib2.install_opener() définira l'ouvreur global de urllib2.
Ceci sera très pratique pour une utilisation ultérieure, mais il ne peut pas fournir un contrôle plus détaillé, comme vouloir utiliser deux paramètres proxy différents dans le programme.
Une meilleure approche consiste à ne pas utiliser install_opener pour modifier les paramètres globaux, mais à appeler directement la méthode open de l'ouvreur au lieu de la méthode globale urlopen.
2. Paramètre de délai d'attente
Dans les anciennes versions de Python (avant Python 2.6), l'API de urllib2 n'expose pas le paramètre de délai d'attente. Pour définir la valeur du délai d'attente, vous ne pouvez modifier que la valeur globale. Délai d'expiration de la valeur Socket.
import urllib2 import socket socket.setdefaulttimeout(10) # 10 秒钟后超时 urllib2.socket.setdefaulttimeout(10) # 另一种方式
Après Python 2.6, le délai d'attente peut être défini directement via le paramètre timeout de urllib2.urlopen().
import urllib2 response = urllib2.urlopen('http://www.google.com', timeout=10)
3. Ajouter un en-tête spécifique à la requête HTTP
Pour ajouter un en-tête, vous devez utiliser l'objet Request :
import urllib2 request = urllib2.Request('http://www.baidu.com/') request.add_header('User-Agent', 'fake-client') response = urllib2.urlopen(request) print response.read()
Pour certains en-têtes Portez une attention particulière au fait que le serveur vérifiera ces en-têtes
User-Agent : Certains serveurs ou Proxy utiliseront cette valeur pour déterminer si la requête est faite par le navigateur
Content-Type : Lors de l'utilisation l'interface REST, le serveur vérifiera. Cette valeur est utilisée pour déterminer comment le contenu du corps HTTP doit être analysé. Les valeurs courantes sont :
application/xml : utilisez
application/json lors de l'appel de XML RPC, tel que RESTful/SOAP : utilisez
application/x-www-form-urlencoded lors de l'appel de JSON RPC : utilisez
lorsque le navigateur soumet un formulaire Web. Lors de l'utilisation du service RESTful ou SOAP fourni par le serveur, un paramètre Content-Type incorrect entraînera le refus du service par le serveur
urllib2 redirigera automatiquement les codes de retour HTTP 3XX par défaut, sans configuration manuelle. Pour détecter si une action de redirection a eu lieu, il suffit de vérifier si l'URL de la Réponse et l'URL de la Requête sont cohérentes.
import urllib2 my_url = 'http://www.google.cn' response = urllib2.urlopen(my_url) redirected = response.geturl() == my_url print redirected my_url = 'http://rrurl.cn/b1UZuP' response = urllib2.urlopen(my_url) redirected = response.geturl() == my_url print redirectedSi vous ne souhaitez pas rediriger automatiquement, en plus d'utiliser la bibliothèque httplib de niveau inférieur, vous pouvez également personnaliser la classe HTTPRedirectHandler.
import urllib2 class RedirectHandler(urllib2.HTTPRedirectHandler): def http_error_301(self, req, fp, code, msg, headers): print "301" pass def http_error_302(self, req, fp, code, msg, headers): print "303" pass opener = urllib2.build_opener(RedirectHandler) opener.open('http://rrurl.cn/b1UZuP')5. Cookieurllib2 gère également les cookies automatiquement. Si vous avez besoin d'obtenir la valeur d'un élément de cookie, vous pouvez le faire :
import urllib2 import cookielib cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) response = opener.open('http://www.baidu.com') for item in cookie: print 'Name = '+item.name print 'Value = '+item.valueAprès l'exécution, la valeur du cookie pour visiter Baidu sera affichée : 6 .Utilisez les méthodes HTTP PUT et DELETE urllib2 ne prend en charge que les méthodes HTTP GET et POST Si vous souhaitez utiliser HTTP PUT et DELETE, vous ne pouvez utiliser que la bibliothèque httplib de niveau inférieur. Malgré cela, nous pouvons toujours permettre à urllib2 d'émettre des requêtes PUT ou DELETE de la manière suivante :
import urllib2 request = urllib2.Request(uri, data=data) request.get_method = lambda: 'PUT' # or 'DELETE' response = urllib2.urlopen(request)7 Obtenez le code de retour HTTP Pour 200 OK, tant que vous le pouvez. récupérez le code de retour HTTP en utilisant la méthode getcode() de l'objet de réponse renvoyé par urlopen. Mais pour les autres codes retour, urlopen lèvera une exception. À ce stade, il est nécessaire de vérifier l'attribut de code de l'objet d'exception :
import urllib2 try: response = urllib2.urlopen('http://bbs.csdn.net/why') except urllib2.HTTPError, e: print e.code8. Journal de débogageLorsque vous utilisez urllib2, vous pouvez ouvrir le journal de débogage via la méthode suivante. , afin que vous puissiez envoyer et recevoir des paquets. Le contenu sera imprimé sur l'écran, ce qui est pratique pour le débogage. Parfois, vous pouvez enregistrer le travail de capture de paquets
import urllib2 httpHandler = urllib2.HTTPHandler(debuglevel=1) httpsHandler = urllib2.HTTPSHandler(debuglevel=1) opener = urllib2.build_opener(httpHandler, httpsHandler) urllib2.install_opener(opener) response = urllib2.urlopen('http://www.google.com')De cette façon, vous pouvez voir le. contenu du paquet de données transmis :
Par exemple, j'utilise généralement le plug-in Firefox httpfox pour voir quels paquets j'ai envoyés.
En prenant verycd comme exemple, recherchez d'abord la requête POST que vous avez envoyée et les éléments du formulaire POST.
Vous pouvez voir que pour verycd, vous devez renseigner le nom d'utilisateur, le mot de passe, continueURI, fk, login_submit Parmi eux, fk est généré de manière aléatoire (en fait, pas trop aléatoire, il semble qu'il soit généré en encodant simplement l'heure. ). Il doit être obtenu à partir de la page Web, ce qui signifie que vous devez d'abord visiter la page Web et utiliser des outils tels que des expressions régulières pour intercepter l'élément fk dans les données renvoyées. Comme son nom l'indique, continueURI peut être écrit de manière informelle, tandis que login_submit est fixe, comme le montre le code source. Il y a aussi un nom d'utilisateur et un mot de passe, qui sont évidents :
# -*- coding: utf-8 -*- import urllib import urllib2 postdata=urllib.urlencode({ 'username':'汪小光', 'password':'why888', 'continueURI':'http://www.verycd.com/', 'fk':'', 'login_submit':'登录' }) req = urllib2.Request( url = 'http://secure.verycd.com/signin', data = postdata ) result = urllib2.urlopen(req) print result.read()10. Se déguiser en navigateur pour accéder
Certains sites Web sont dégoûtés par la visite des robots, ils rejettent donc les demandes des robots
À l'heure actuelle, nous devons nous déguiser en navigateur, ce qui peut être réalisé en modifiant l'en-tête dans le package http
#… headers = { 'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6' } req = urllib2.Request( url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/', data = postdata, headers = headers ) #...11 Gérer "l'anti-hotlinking"
Certains sites l'ont fait-. appelé paramètres anti-hotlinking. En fait, pour parler franchement, c'est très simple
#... headers = { 'Referer':'http://www.cnbeta.com/articles' } #...
Par exemple, certains sites Web aiment lire le X-Forwarded-For dans l'en-tête pour voir leur véritable adresse IP. Vous pouvez directement modifier le X-Forwarde-For.
Ce qui précède est [Python] Web Crawler (5) : détails d'utilisation de urllib2 et des techniques d'exploration de sites Web. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !