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'')
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 ...