httperror forbidden error cliente python http web http-status-code-403

forbidden - Error de HTTP 403 en Python 3 Web Scraping



python http server (4)

"Esto es probablemente debido a mod_security o alguna característica similar de seguridad del servidor que bloquea

araña / bot

agentes de usuario (urllib usa algo como python urllib / 3.3.0, se detecta fácilmente) "- como ya lo mencionó Stefano Sanfilippo

from urllib.request import Request, urlopen url="https://stackoverflow.com/search?q=html+error+403" req = Request(url, headers={''User-Agent'': ''Mozilla/5.0''}) web_byte = urlopen(req).read() webpage = web_byte.decode(''utf-8'')

El web_byte es un objeto de bytes devuelto por el servidor y el tipo de contenido presente en la página web es principalmente utf-8 . Por lo tanto, necesita decodificar web_byte usando el método de decodificación.

Esto resuelve un problema completo mientras estaba intentando eliminar un sitio web usando PyCharm

PD -> Yo uso Python 3.4

Estaba intentando eliminar un sitio web para practicar, pero seguí recibiendo el HTTP Error 403 (¿cree que soy un bot)?

Aquí está mi código:

#import requests import urllib.request from bs4 import BeautifulSoup #from urllib import urlopen import re webpage = urllib.request.urlopen(''http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1'').read findrows = re.compile(''<tr class="- banding(?:On|Off)>(.*?)</tr>'') findlink = re.compile(''<a href =">(.*)</a>'') row_array = re.findall(findrows, webpage) links = re.finall(findlink, webpate) print(len(row_array)) iterator = []

El error que recibo es:

File "C:/Python33/lib/urllib/request.py", line 160, in urlopen return opener.open(url, data, timeout) File "C:/Python33/lib/urllib/request.py", line 479, in open response = meth(req, response) File "C:/Python33/lib/urllib/request.py", line 591, in http_response ''http'', request, response, code, msg, hdrs) File "C:/Python33/lib/urllib/request.py", line 517, in error return self._call_chain(*args) File "C:/Python33/lib/urllib/request.py", line 451, in _call_chain result = func(*args) File "C:/Python33/lib/urllib/request.py", line 599, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbidden


Dado que la página funciona en el navegador y no cuando se realiza una llamada dentro del programa de Python, parece que la aplicación web que sirve esa url reconoce que usted solicita el contenido, no el navegador.

Demostración:

curl --dump-header r.txt http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1 ... <HTML><HEAD> <TITLE>Access Denied</TITLE> </HEAD><BODY> <H1>Access Denied</H1> You don''t have permission to access ... </HTML>

y el contenido en r.txt tiene línea de estado:

HTTP/1.1 403 Forbidden

Intenta publicar el encabezado ''User-Agent'' que falsifica al cliente web.

NOTA: la página contiene una llamada Ajax que crea la tabla que probablemente quiera analizar. Deberá verificar la lógica de JavaScript de la página o simplemente usar el depurador del navegador (como la pestaña Firebug / Net) para ver a qué url necesita llamar para obtener el contenido de la tabla.


Definitivamente está bloqueando debido a su uso de urllib basado en el agente de usuario. Esto mismo me está pasando con OfferUp. Puede crear una nueva clase llamada AppURLopener que anula el agente de usuario con Mozilla.

import urllib.request class AppURLopener(urllib.request.FancyURLopener): version = "Mozilla/5.0" opener = AppURLopener() response = opener.open(''http://httpbin.org/user-agent'')

Source


Esto es probablemente debido a mod_security o alguna característica similar de seguridad del servidor que bloquea los agentes de usuario spider / bot conocidos ( urllib usa algo así como python urllib/3.3.0 , se detecta fácilmente). Intente configurar un agente de usuario del navegador conocido con:

from urllib.request import Request, urlopen req = Request(''http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1'', headers={''User-Agent'': ''Mozilla/5.0''}) webpage = urlopen(req).read()

Esto funciona para mí

Por cierto, en tu código te falta el () después de .read en la línea urlopen , pero creo que es un error tipográfico.

CONSEJO: dado que se trata de un ejercicio, elija un sitio diferente y no restrictivo. Tal vez están bloqueando a urllib por alguna razón ...