Resuelva el mensaje prohibido Urllib HTTP Error 403 en Python
-
el módulo
urllib
en Python -
Compruebe
robots.txt
para evitarurllib
HTTP Error 403 Mensaje prohibido -
Adición de cookies a los encabezados de solicitud para resolver el mensaje prohibido de error HTTP 403
urllib
-
Use el objeto de sesión para resolver el mensaje prohibido de error HTTP 403
urllib
El artículo de hoy explica cómo lidiar con un mensaje de error (excepción), urllib.error.HTTPError: HTTP Error 403: Forbidden
, producido por la clase error
en nombre de las clases request
cuando se enfrenta a un recurso prohibido.
el módulo urllib
en Python
El urllib
módulo de Python maneja las URL para Python a través de diferentes protocolos. Es famoso por los web scrapers que quieren obtener datos de un sitio web en particular.
El urllib
contiene clases, métodos y funciones que realizan ciertas operaciones como lectura, análisis de URL y robots.txt
. Hay cuatro clases, solicitud, error, analizar y robotparser.
Compruebe robots.txt
para evitar urllib
HTTP Error 403 Mensaje prohibido
Cuando usamos el módulo urllib
para interactuar con clientes o servidores a través de la clase request
, podemos experimentar errores específicos. Uno de esos errores es el error HTTP 403
.
Obtenemos el mensaje de error urllib.error.HTTPError: HTTP Error 403: Forbidden
en el paquete urllib
al leer una URL. El HTTP 403
, el Error Prohibido, es un código de estado HTTP que indica que el cliente o servidor prohíbe el acceso a un recurso solicitado.
Por lo tanto, cuando vemos este tipo de mensaje de error, urllib.error.HTTPError: HTTP Error 403: Forbidden
, el servidor entiende la solicitud pero decide no procesar o autorizar la solicitud que enviamos.
Para comprender por qué el sitio web al que accedemos no está procesando nuestra solicitud, debemos verificar un archivo importante, robots.txt
. Antes de raspar la web o interactuar con un sitio web, a menudo se recomienda revisar este archivo para saber qué esperar y no enfrentar más problemas.
Para comprobarlo en cualquier sitio web, podemos seguir el siguiente formato.
https://<website.com>/robots.txt
Por ejemplo, verifique los archivos robots.txt
de YouTube, Amazon y Google.
https://www.youtube.com/robots.txt
https://www.amazon.com/robots.txt
https://www.google.com/robots.txt
Verificando YouTube robots.txt
da el siguiente resultado.
# robots.txt file for YouTube
# Created in the distant future (the year 2000) after
# the robotic uprising of the mid-'90s wiped out all humans.
User-agent: Mediapartners-Google*
Disallow:
User-agent: *
Disallow: /channel/*/community
Disallow: /comment
Disallow: /get_video
Disallow: /get_video_info
Disallow: /get_midroll_info
Disallow: /live_chat
Disallow: /login
Disallow: /results
Disallow: /signup
Disallow: /t/terms
Disallow: /timedtext_video
Disallow: /user/*/community
Disallow: /verify_age
Disallow: /watch_ajax
Disallow: /watch_fragments_ajax
Disallow: /watch_popup
Disallow: /watch_queue_ajax
Sitemap: https://www.youtube.com/sitemaps/sitemap.xml
Sitemap: https://www.youtube.com/product/sitemap.xml
Podemos notar muchas etiquetas Disallow
allí. Esta etiqueta Disallow
muestra el área del sitio web, que no es accesible. Por lo tanto, cualquier solicitud a esas áreas no será procesada y está prohibida.
En otros archivos robots.txt
, es posible que veamos una etiqueta Permitir
. Por ejemplo, http://youtube.com/comment
está prohibido para cualquier solicitud externa, incluso con el módulo urllib
.
Escribamos un código para extraer datos de un sitio web que devuelve un error HTTP 403
cuando se accede.
Código de ejemplo:
import urllib.request
import re
webpage = urllib.request.urlopen(
"https://www.cmegroup.com/markets/products.html?redirect=/trading/products/#cleared=Options&sortField=oi"
).read()
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')
row_array = re.findall(findrows, webpage)
links = re.findall(findlink, webpage)
print(len(row_array))
Producción :
Traceback (most recent call last):
File "c:\Users\akinl\Documents\Python\index.py", line 7, in <module>
webpage = urllib.request.urlopen('https://www.cmegroup.com/markets/products.html?redirect=/trading/products/#cleared=Options&sortField=oi').read()
File "C:\Python310\lib\urllib\request.py", line 216, in urlopen
return opener.open(url, data, timeout)
File "C:\Python310\lib\urllib\request.py", line 525, in open
response = meth(req, response)
File "C:\Python310\lib\urllib\request.py", line 634, in http_response
response = self.parent.error(
File "C:\Python310\lib\urllib\request.py", line 563, in error
return self._call_chain(*args)
File "C:\Python310\lib\urllib\request.py", line 496, in _call_chain
result = func(*args)
File "C:\Python310\lib\urllib\request.py", line 643, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
La razón es que tenemos prohibido acceder al sitio web. Sin embargo, si revisamos el archivo robots.txt
, notaremos que https://www.cmegroup.com/markets/
no tiene la etiqueta Disallow
. Sin embargo, si bajamos al archivo robots.txt
del sitio web que queríamos raspar, encontraremos lo siguiente.
User-agent: Python-urllib/1.17
Disallow: /
El texto anterior significa que el agente de usuario llamado Python-urllib
no puede rastrear ninguna URL dentro del sitio. Eso significa que no se permite usar el módulo urllib
de Python para rastrear el sitio.
Por tanto, comprobar o analizar el robots.txt
para saber a qué recursos tenemos acceso. podemos analizar el archivo robots.txt
usando la clase robotparser. Esto puede evitar que nuestro código experimente un mensaje de error urllib.error.HTTPError: HTTP Error 403: Forbidden
.
Adición de cookies a los encabezados de solicitud para resolver el mensaje prohibido de error HTTP 403 urllib
Pasar un agente de usuario válido como parámetro de encabezado solucionará rápidamente el problema. El sitio web puede utilizar cookies como medida anti-raspado.
El sitio web puede configurar y solicitar que se reproduzcan las cookies para evitar el raspado, lo que tal vez vaya en contra de su política.
from urllib.request import Request, urlopen
def get_page_content(url, head):
req = Request(url, headers=head)
return urlopen(req)
url = "https://example.com"
head = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
"Accept-Encoding": "none",
"Accept-Language": "en-US,en;q=0.8",
"Connection": "keep-alive",
"refere": "https://example.com",
"cookie": """your cookie value ( you can get that from your web page) """,
}
data = get_page_content(url, head).read()
print(data)
Producción :
<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n <meta
'
'
'
<p><a href="https://www.iana.org/domains/example">More information...</a></p>\n</div>\n</body>\n</html>\n'
Pasar un agente de usuario válido como parámetro de encabezado solucionará rápidamente el problema.
Use el objeto de sesión para resolver el mensaje prohibido de error HTTP 403 urllib
A veces, incluso el uso de un agente de usuario no evitará que ocurra este error. Entonces se puede utilizar el objeto Sesión
del módulo solicitudes
.
from random import seed
import requests
url = "https://stackoverflow.com/search?q=html+error+403"
session_obj = requests.Session()
response = session_obj.get(url, headers={"User-Agent": "Mozilla/5.0"})
print(response.status_code)
Producción :
200
El artículo anterior encuentra la causa del urllib.error.HTTPError: HTTP Error 403: Forbidden
y la solución para manejarlo. mod_security
básicamente causa este error ya que diferentes páginas web usan diferentes mecanismos de seguridad para diferenciar entre computadoras humanas y automatizadas (bots).
Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.
LinkedInArtículo relacionado - Python Error
- Administrar fallas de segmentación en Python
- Archivo <Stdin>, Línea 1, en <Módulo> Error en Python
- Arreglar AttributeError: el objeto 'generador' no tiene atributo 'siguiente' en Python
- Arreglar el comando cl.exe falló: no existe tal archivo o directorio en Windows
- Arreglar NameError: la variable no está definida en Python
- Arreglar Socket.Gaierror: [Errno 8] Nodename ni Servname proporcionado, o desconocido en Python