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

[Python] Web Crawler (5) : détails d'utilisation de urllib2 et des techniques d'exploration de sites Web

黄舟
黄舟original
2017-01-21 14:04:031155parcourir

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



4.Redirect

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 redirected
Si 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. Cookie

urllib2 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.value
Après l'exécution, la valeur du cookie pour visiter Baidu sera affichée :

[Python] Web Crawler (5) : détails dutilisation de urllib2 et des techniques dexploration de sites Web

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.code
8. Journal de débogage

Lorsque 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 :

[Python] Web Crawler (5) : détails dutilisation de urllib2 et des techniques dexploration de sites Web


9. Traitement du formulaire

Il est nécessaire de remplir le formulaire lorsque connexion. Comment remplir le formulaire ?

Utilisez d'abord l'outil pour intercepter le contenu du formulaire à remplir.

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


c'est de vérifier si le site référent est le sien dans l'en-tête de la requête. vous avez envoyé.

Il suffit donc de mettre les en-têtes comme Changez simplement le référent vers le site Web. Prenez cnbeta comme exemple :

#...
headers = {
    'Referer':'http://www.cnbeta.com/articles'
}
#...


. Les en-têtes sont une structure de données dict. Vous pouvez insérer n'importe quel en-tête.

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) !


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