Cómo el rastreador de Python maneja solicitudes anormales en páginas de Douban
1.URLError
Primero, explique las posibles causas de URLError:
No se puede conectar a la red, es decir, la máquina no puede acceder a Internet
No se puede conectar al servidor específico
El servidor no existe
En el código, necesitamos usar declaraciones try-except para rodear y capturar el correspondiente excepción. El siguiente es un ejemplo, siéntalo primero
Python
1
2
3
4
5
6
7
importar urllib2
requset = urllib2.Request('')< / p>
pruebe:
urllib2.urlopen(requset)
excepto urllib2.URLError, e:
imprima
<. p >Utilizamos el método urlopen para acceder a una URL inexistente y los resultados son los siguientes:Python
1
[Errno 11004] getaddrinfo falló
Explica que el código de error es 11004 y el motivo es que getaddrinfo falló
2 HTTPError
HTTPError es una subclase de URLError. Cuando realiza una solicitud utilizando el método urlopen, el servidor responde con un objeto de respuesta que contiene un "código de estado" numérico. Por ejemplo, si la respuesta es "redirigir" el documento a una ubicación diferente, urllib2 se encargará de esto.
De lo contrario, urlopen generará un HTTPError, que corresponde al estado de respuesta devuelto por el protocolo HTTP. Los siguientes códigos de estado se resumen a continuación:
100: Continuar El cliente debe continuar enviando la solicitud. El cliente debe continuar enviando el resto de la solicitud o ignorar esta respuesta si la solicitud está completa.
101: Cambiar protocolo Después de enviar la última línea en blanco de esta respuesta, el servidor cambiará al protocolo definido en el encabezado del mensaje de actualización. Sólo se deberían tomar medidas similares si cambiar a un nuevo protocolo resulta más ventajoso.
102: El procesamiento continúa Un código de estado extendido por WebDAV (RFC 2518) que indica que el procesamiento continuará.
200: La solicitud es exitosa. Procesamiento: Obtenga el contenido de la respuesta y procéselo.
201: La solicitud se completa y se crea un nuevo recurso. El URI del recurso recién creado está disponible en la entidad de la respuesta Manejo: No encontrado en el rastreador
202: Solicitud aceptada, pero el procesamiento aún no se ha completado Manejo: Bloqueo y espera
204: Solicitud completada en el servidor: la solicitud se completó en el lado del servidor, pero no se devolvió información nueva. Si el cliente es un agente de usuario, no es necesario actualizar su vista de documento para ello. Manejo: Descartar
300: las aplicaciones HTTP/1.0 no usarán este código de estado directamente, sino que solo lo usarán como interpretación predeterminada de las respuestas de tipo 3XX. Se solicitó más de un recurso disponible. Procesamiento: si el programa puede manejarlo, procéselo más; si el programa no puede manejarlo, deséchelo
301: al recurso solicitado se le asigna una URL permanente para que se pueda acceder a él a través de esa URL en el Procesamiento futuro: Redirigir a la URL de distribución
302: El recurso solicitado se almacena temporalmente en una URL diferente.
Método de procesamiento: Redirigir a URL temporal
304: El recurso solicitado no se ha actualizado Método de procesamiento: Descartar
400: Método de procesamiento de solicitud ilegal: Descartar
401: Método de procesamiento no autorizado: descartar
403: Método de procesamiento prohibido: descartar
404: Método de procesamiento no encontrado: descartar
500: El servidor no encontró el recurso. p>
500: Error interno del servidor El servidor encontró una condición inesperada y no pudo completar el procesamiento de la solicitud. Normalmente, este problema ocurre cuando hay un error en el código fuente del lado del servidor.
501: Servidor no reconocido El servidor no admite la funcionalidad específica requerida por la solicitud actual. Cuando el servidor no reconoce el método solicitado y no puede soportar su solicitud de ningún recurso.
502: Puerta de enlace incorrecta El servidor que actúa como puerta de enlace o proxy recibió una respuesta no válida de un servidor ascendente al intentar realizar una solicitud.
503: Error de servicio Debido a un mantenimiento temporal del servidor o a una sobrecarga, el servidor actualmente no puede procesar la solicitud. Esta condición es temporal y se recuperará después de un tiempo.
Las instancias HTTPError se generan con un atributo de código, que es el número de error relevante enviado por el servidor.
Dado que urllib2 maneja las redirecciones por usted, esto significa que los códigos que comienzan con 3 pueden procesarse y los números en el rango 100-299 indican éxito, por lo que solo verá aquellos en el rango de código de error 400-599. .
Escribamos un ejemplo para tener una idea, la excepción detectada es HTTPError, tendrá un atributo de código, que es el código de error, además también imprimiremos el atributo de motivo, que es su clase principal URLError una propiedad.
Python
1
2
3
4
5 p>
5
p>
6
7
8
importar urllib2
req = urllib2.Request('httt/ cqcre')
intenta:
urllib2.urlopen(req)
excepto urllib2.HTTPError, e:
imprimir e.code
imprimir e.reason
Los resultados de ejecución son los siguientes<
Python
1
2
403
Prohibido
El código de error es 403 y el motivo del error es Prohibido, lo que significa acceso al servidor. está prohibido.
Sabemos que la clase principal de HTTPError es URLError. Según la experiencia en programación, la excepción de la clase principal debe escribirse después de la excepción de la subclase. Si la subclase no puede detectarla, entonces la excepción de. la clase principal se puede capturar, por lo que el código anterior se puede reescribir así
Python
1
2
3 p>
4
5
6
7
8
9
10
11
importar urllib2
req = urllib2.Request('hcqcre')
prueba:
urllib2.urlopen(req)
excepto urllib2.HTTPError, e:
imprimir e.code
excepto urllib2.URLError, e:
imprimir e.
else:
imprimir "OK"
Si se detecta HTTPError, se genera el código y no hay excepciones de URLError. manejado por más tiempo. Si se produce una excepción distinta de HTTPError, la excepción URLError ya no se detecta y se genera el motivo del error.
Además, puede agregar el atributo hasattr para predeterminar los atributos y reescribir el código de la siguiente manera
Python
1
2
3
4
5
6
7
8
9
10
11
12
importar urllib2
req = urllib2.Request ('httcqcre')
pruebe:
urllib2.urlopen(req)
excepto urllib2.URLError, e:
if hasattr (e, "código"):
imprimir e.código
if hasattr(e, "razón"):
imprimir e.razón
else:
imprimir "OK"
Primero determine el atributo de la excepción para evitar informar errores en la salida del atributo.
¡Lo anterior es la introducción relevante a URLError y HTTPError, así como los métodos de manejo de errores correspondientes!