Envío de "User-agent" utilizando la biblioteca de solicitudes en Python

216

Quiero enviar un valor "User-agent"mientras solicito una página web usando Python Requests. No estoy seguro de si está bien enviar esto como parte del encabezado, como en el código a continuación:

debug = {'verbose': sys.stderr}
user_agent = {'User-agent': 'Mozilla/5.0'}
response  = requests.get(url, headers = user_agent, config=debug)

La información de depuración no muestra los encabezados que se envían durante la solicitud.

¿Es aceptable enviar esta información en el encabezado? Si no, ¿cómo puedo enviarlo?

charleslparker
fuente

Respuestas:

323

El user-agentdebe especificarse como un campo en el encabezado.

Aquí hay una lista de campos de encabezado HTTP , y probablemente le interesarían los campos específicos de solicitud , que incluye User-Agent.

Si está utilizando solicitudes v2.13 y posteriores

La forma más sencilla de hacer lo que quiere es crear un diccionario y especificar sus encabezados directamente, de esta manera:

import requests

url = 'SOME URL'

headers = {
    'User-Agent': 'My User Agent 1.0',
    'From': '[email protected]'  # This is another valid field
}

response = requests.get(url, headers=headers)

Si está utilizando solicitudes v2.12.xy anteriores

Las versiones anteriores de requestslos encabezados predeterminados con capa, por lo que querrá hacer lo siguiente para conservar los encabezados predeterminados y luego agregar los suyos.

import requests

url = 'SOME URL'

# Get a copy of the default headers that requests would use
headers = requests.utils.default_headers()

# Update the headers with your custom ones
# You don't have to worry about case-sensitivity with
# the dictionary keys, because default_headers uses a custom
# CaseInsensitiveDict implementation within requests' source code.
headers.update(
    {
        'User-Agent': 'My User Agent 1.0',
    }
)

response = requests.get(url, headers=headers)
wkl
fuente
66
También puede acceder a los encabezados que envió response.request.headers, esto funciona porque el objeto de solicitud original es un atributo del objeto de respuesta. Ver también http://docs.python-requests.org/en/latest/user/advanced/#request-and-response-objects
aquí
3
El valor predeterminado también está disponible como request.utils.default_user_agent () si solo desea aumentarlo con su propia información.
nealmcb
3
No es correcto. Golpea el resto de los encabezados. Debería obtener una copia de los valores predeterminados de request.utils.default_user_agent () y actualizarla y enviarla.
Chad Miller
1
para simplificar, en httpbin.org/headers (material descargable) puede obtener los encabezados del navegador y luego hacer que su consulta aparezca
m3nda
1
Al menos en 2.13.0, las cabeceras no están cubiertas y los documentos solo te dicen que uses el headerskwarg.
Jmills
62

Es más conveniente usar una sesión , de esta manera no tiene que recordar configurar los encabezados cada vez:

session = requests.Session()
session.headers.update({'User-Agent': 'Custom user agent'})

session.get('https://httpbin.org/headers')

Por defecto, la sesión también gestiona las cookies por usted. En caso de que desee desactivar eso, consulte esta pregunta .

usuario
fuente