Envoi de «User-agent» à l'aide de la bibliothèque de requêtes en Python

216

Je souhaite envoyer une valeur pour "User-agent"tout en demandant une page Web à l'aide de requêtes Python. Je ne sais pas si c'est correct d'envoyer cela comme une partie de l'en-tête, comme dans le code ci-dessous:

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

Les informations de débogage ne montrent pas les en-têtes envoyés lors de la demande.

Est-il acceptable d'envoyer ces informations dans l'en-tête? Sinon, comment puis-je l'envoyer?

charleslparker
la source

Réponses:

323

Le user-agentdoit être spécifié sous forme de champ dans l'en-tête.

Voici une liste des champs d'en-tête HTTP , et vous seriez probablement intéressé par les champs spécifiques à la demande , ce qui inclut User-Agent.

Si vous utilisez des requêtes v2.13 et plus récentes

La façon la plus simple de faire ce que vous voulez est de créer un dictionnaire et de spécifier directement vos en-têtes, comme ceci:

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 vous utilisez des requêtes v2.12.x et antérieures

Versions plus anciennes d'en- requeststêtes par défaut encombrées, vous devez donc procéder comme suit pour conserver les en-têtes par défaut, puis leur ajouter les vôtres.

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
la source
6
Vous pouvez également accéder aux en-têtes que vous avez envoyés avec response.request.headers, cela fonctionne parce que l'objet de demande d'origine est un attribut de l'objet de réponse. Voir aussi http://docs.python-requests.org/en/latest/user/advanced/#request-and-response-objects
ici
3
La valeur par défaut est également disponible en tant que request.utils.default_user_agent () si vous souhaitez simplement augmenter cela avec vos propres informations.
nealmcb du
3
Ce n'est pas correct. Il frappe le reste des en-têtes. Il devrait obtenir une copie des valeurs par défaut de requests.utils.default_user_agent () et la mettre à jour, puis les envoyer.
Chad Miller
1
pour plus de facilité, sur httpbin.org/headers (trucs téléchargeables), vous pouvez obtenir les en-têtes du navigateur, puis faire apparaître votre requête
m3nda
1
Au moins dans 2.13.0, les en-têtes ne sont pas encombrés et les documents vous disent simplement d'utiliser le headerskwarg.
Jmills
62

Il est plus pratique d'utiliser une session , de cette façon, vous n'avez pas à vous souvenir de définir des en-têtes à chaque fois:

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

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

Par défaut, la session gère également les cookies pour vous. Si vous souhaitez désactiver cela, consultez cette question .

utilisateur
la source