> Modules standards > Modules pour internet > requests
requests
import requests
requête d'une page :
- pour un get response = requests.get('https://www.google.com')
- pour un post : response = requests.post('http://www.example.com', data = {'param1': value1, 'param2': value2})
- si on veut passer des paramètres dans l'URL (?param1=value1) : response = requests.get('http://www.example.com', params = {'param1': value1}).
- On peut alors voir l'URL construite en faisant : print(response.url) (notamment utile quand redirection, permet de voir les différentes URL requêtées).
- si la valeur associée à un paramètre est None, il ne sera pas rajouté dans l'URL.
- response.status_code : le statut http de retour.
- response.ok : True si le statut est < 400.
- response.encoding : l'encoding de la pate, par exemple UTF-8.
- response.content : le contenu de la page (en bytes)
- response.text : si la réponse est du texte, gère comme il faut par rapport à l'encoding (alors que response.content renvoie le contenu de type bytes).
- on peut changer l'encoding d'une page reçue ! Faire response.encoding = 'ISO-8859-1' et l'appel de response.text renverra cet encoding !
- response.json() : réponse sous forme de json, si la réponse est du json.
- si on veut faire un post avec une variable qui a plusieurs valeurs :
- response = requests.post(myUrl, data = {'param1': [value1, value2]})
- ou alors aussi : response = requests.post(myUrl, data = [('param1', value1), ('param1', value2)])
- si on veut envoyer un data non encodé pour les formes, utiliser pour data une chaine de caractère plutôt qu'un dictionnaire : import json; response = requests.post(myUrl, json.dumps({'param1': value1}))
- dans le cas de json, on peut faire directement : response = requests.post(myUrl, json = {'param1': value1})
- on peut passer des paramètres au header de la requête :
response = requests.get(myUrl,
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0',
'connection': 'keep-alive'})
- response.headers : renvoie un dictionnaire du header de la réponse, mais ce dictionnaire est special car les clef sont case-insensitives (comme le veut le protocole http).
- on peut aussi voir le header de la requête : response.request.headers
- pour télécharger du contenu de grande taille :
response = session.get(myUrl, stream = True)
chunkSize = 100000000
with open('myFile', 'wb') as fhOut:
for chunk in response.iter_content(chunk_size = chunkSize):
fhOut.write(chunk)
Multipart post :
- response = requests.post(myUrl, files = {'file': open('myImage.png', 'rb')})
- on peut fixer le nom de fichier, le content-type et des headers : response = requests.post(myUrl, files = {'file': (myFile.png', open('myImage.png', 'rb'), 'application/png, {'Expires': '0'})})
Par défaut, requests suit automatiquement les redirections, et on peut avoir l'historique des réponses dans response.history : liste des responses précédentes.
Timeout :
- il faut utiliser pour chaque requête un timeout, sous peine qu'une requête bloque tout le programme.
- response = request.get(myUrl, timeout = 1) : le timeout est en secondes.
- si le timeout est dépassé, une exception est lancée.
On peut décomposer la requête faite avec une session :
- request = requests.Request('get', 'http://www.example.com', ...)
- preparedRequest = session.prepare_request(request)
- response = session.send(preparedRequest) (c'est à ce niveau que l'on peut rajouter des parameètres comme headers, cookies, etc ...)
ça permet d'afficher le contenu envoyé par :
print(preparedRequest.body.decode('utf8'))
https :
- par défaut, requests vérifie les certificats.
- on peut inactiver cette vérification en faisant : requests.get('https://www.example.com', verify = False)
- on peut donner un fichier comportant toute la chaîne des certificats avec requests.get(..., verify = 'myChain.pem')
- sinon, on peut aussi donner le fichier dans la variable d'environnement : export REQUESTS_CA_BUNDLE=myChain.pem
- les certificats utilisés par requests se situent dans : python3 -c 'import certifi; print(certifi.where())', mais apparemment, il y a aussi des certificats pour l'installation via pip
Parsing d'un document html : tree = html.fromstring(htmlTextContent) : renvoie un objet lxml.html.HtmlElement
Méthodes applicables aux objets HtmlElement :
- elt.tag : le tag de l'élément.
- elt.text le texte contenu dans l'élément.
- elt.attrib : dictionnaire des attributs de l'élément.
- for subelt in elt: : boucle directement sur les fils de l'élément.
- list(elt) : la liste des fils de l'élément.
- elt.findall('td') : tous les fils <td> de l'élément.
- elt.find('td') : le premier fils <td> de l'élément (renvoie None si non trouvé)
- elt.get_element_by_id('myId') : récupère l'élément dont l'id est donné.
- elt.getparent() : le parent de l'élément.
- elt.xpath(xpathExpression) : renvoie les éléments correspondant à l'expression xpath
- elt.iter('span') : renvoie un itérateur sur tous les sous éléments <span> directs ou indirects.
- elt.text_content() : renvoie le contenu en texte (sans les tags html) de l'élément.
- etree.tostring(elt).decode() : pour avoir le contenu d'un élément (sous forme html). Faire from lxml import etree.
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert