headers - Cambio de User Agent en Python 3 para urrlib.request.urlopen
urllib python install (4)
Quiero abrir una url usando urllib.request.urlopen(''someurl'')
:
with urllib.request.urlopen(''someurl'') as url:
b = url.read()
Sigo recibiendo el siguiente error:
urllib.error.HTTPError: HTTP Error 403: Forbidden
Entiendo que el error se debe a que el sitio no permite que python acceda a él, para evitar que los bots desperdicien sus recursos de red, lo que es comprensible. Fui a buscar y descubrí que necesita cambiar el agente de usuario para urllib. Sin embargo, todas las guías y soluciones que he encontrado para este problema sobre cómo cambiar el agente de usuario han sido con urllib2, y estoy usando python 3 para que todas las soluciones no funcionen.
¿Cómo puedo solucionar este problema con python 3?
Acabo de responder una pregunta similar aquí: https://.com/a/43501438/206820
En caso de que no solo desee abrir la URL, sino también descargar el recurso (por ejemplo, un archivo PDF), puede usar el código de la siguiente manera:
# proxy = ProxyHandler({''http'': ''http://192.168.1.31:8888''})
proxy = ProxyHandler({})
opener = build_opener(proxy)
opener.addheaders = [(''User-Agent'',''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30'')]
install_opener(opener)
result = urlretrieve(url=file_url, filename=file_name)
La razón por la que agregué el proxy es para controlar el tráfico en Charles, y aquí está el tráfico que obtuve:
De los documentos de Python :
import urllib.request
req = urllib.request.Request(
url,
data=None,
headers={
''User-Agent'': ''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36''
}
)
f = urllib.request.urlopen(req)
print(f.read().decode(''utf-8''))
El rechazo del sitio host proviene de las reglas básicas ModSecurity de OWASP para la seguridad de mods Apache. La regla 900002 tiene una lista de agentes de usuario "malos", y uno de ellos es "python-urllib2". Es por eso que fallan las solicitudes con el agente de usuario predeterminado.
Desafortunadamente, si usas la función "robotparser" de Python,
usa el agente de usuario predeterminado de Python, y no hay ningún parámetro para cambiar eso. Si el intento de "robotparser" para leer "robots.txt" es rechazado (no solo no se encuentra la URL), entonces trata todas las URL de ese sitio como no permitidas.
from urllib.request import urlopen, Request
urlopen(Request(url, headers={''User-Agent'': ''Mozilla''}))