Resuelva el mensaje prohibido Urllib HTTP Error 403 en Python

Olorunfemi Akinlua 21 junio 2023
  1. el módulo urllib en Python
  2. Compruebe robots.txt para evitar urllib HTTP Error 403 Mensaje prohibido
  3. Adición de cookies a los encabezados de solicitud para resolver el mensaje prohibido de error HTTP 403 urllib
  4. Use el objeto de sesión para resolver el mensaje prohibido de error HTTP 403 urllib
Resuelva el mensaje prohibido Urllib HTTP Error 403 en Python

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 Akinlua avatar Olorunfemi Akinlua avatar

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.

LinkedIn

Artículo relacionado - Python Error