Explication détaillée de l'utilisation de la bibliothèque Requests en Python

高洛峰
Libérer: 2017-03-17 17:34:09
original
2150 Les gens l'ont consulté

J'ai parlé de l'utilisation et des méthodes de la bibliothèque urllib de Python, de l'utilisation de base de la bibliothèque Urllib de collecte de données réseau Python et de l'utilisation avancée de l'urllib de Python.

Aujourd'hui, nous allons apprendre à utiliser la bibliothèque Requests en Python.

Installation de la bibliothèque Requests

Utilisez pip pour installer, si vous avez installé le package pip (un outil de gestion de packages Python, je ne sais pas si vous pouvez utilisez Baidu), ou l'environnement intégré, tel que Python (x, y) ou anaconda, vous pouvez directement utiliser pip pour installer la bibliothèque Python.

$ pip install requests
Copier après la connexion

Une fois l'installation terminée, jetons un coup d'œil à la méthode de base :

    #get请求方法
    >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
#打印get请求的状态码
    >>> r.status_code
200
#查看请求的数据类型,可以看到是json格式,utf-8编码
    >>> r.headers['content-type']
'application/json; charset=utf8'
    >>> r.encoding
'utf-8'
#打印请求到的内容
    >>> r.text
u'{"type":"User"...'
#输出json格式数据
    >>> r.json()
    {u'private_gists': 419, u'total_private_repos': 77, ...}
Copier après la connexion

Jetons un coup d'œil à un petit châtaignier :

#小例子
import requests

r = requests.get('http://www.baidu.com')
print type(r)
print r.status_code
print r.encoding
print r.text
print r.cookies
'''请求了百度的网址,然后打印出了返回结果的类型,状态码,编码方式,Cookies等内容
输出:'''
<class &#39;requests.models.Response&#39;>
200
UTF-8
<RequestsCookieJar[]>
Copier après la connexion

Requête de base http

La bibliothèque de requêtes fournit toutes les méthodes de requête de base de http. Par exemple :

r = requests.post("http://httpbin.org/post")
r = requests.put("http://httpbin.org/put")
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
r = requests.options("http://httpbin.org/get")
Copier après la connexion

Requête GET de base

r = requests.get("http://httpbin.org/get")
#如果想要加参数,可以利用 params 参数:
import requests
payload = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
r = requests.get("http://httpbin.org/get", params=payload)
print r.url

#输出:http://httpbin.org/get?key2=value2&key1=value1
Copier après la connexion

Si vous souhaitez demander un fichier JSON, vous pouvez utiliser la méthode json() pour l'analyser. Par exemple, écrivez un. Fichier JSON vous-même et nommez-le a.json. Le contenu Comme suit :

["foo", "bar", {
"foo": "bar"
}]
#利用如下程序请求并解析:
import requests
r = requests.get("a.json")
print r.text
print r.json()
&#39;&#39;&#39;运行结果如下,其中一个是直接输出内容,另外一个方法是利用 json() 方法
解析,感受下它们的不同:&#39;&#39;&#39;
["foo", "bar", {
"foo": "bar"
}]
[u&#39;foo&#39;, u&#39;bar&#39;, {u&#39;foo&#39;: u&#39;bar&#39;}]
Copier après la connexion

Si vous souhaitez obtenir la réponse brute du socket du serveur, vous pouvez obtenir r.raw. Cependant, stream=True doit être défini dans la requête initiale.

r = requests.get(&#39;https://github.com/timeline.json&#39;, stream=True)
r.raw
#输出
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
r.raw.read(10)
&#39;\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03&#39;
Copier après la connexion

De cette manière, le contenu original du socket de la page Web est obtenu.

Si vous souhaitez ajouter des en-têtes, vous pouvez passer les paramètres des en-têtes :

import requests

payload = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
headers = {&#39;content-type&#39;: &#39;application/json&#39;}
r = requests.get("http://httpbin.org/get", params=payload, headers=headers)
print r.url
#通过headers参数可以增加请求头中的headers信息
Copier après la connexion

BasiqueRequête POST

Pour une requête POST, nous avons généralement besoin à Il ajoute quelques paramètres. Ensuite, la méthode de transmission de paramètres la plus élémentaire peut utiliser le paramètre data.

import requests

payload = {&#39;key1&#39;: &#39;value1&#39;, &#39;key2&#39;: &#39;value2&#39;}
r = requests.post("http://httpbin.org/post", data=payload)
print r.text
#运行结果如下:
{
"args": {}, 
"data": "", 
"files": {}, 
"form": {
"key1": "value1", 
"key2": "value2"
}, 
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Content-Length": "23", 
"Content-Type": "application/x-www-form-urlencoded", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1"
}, 
"json": null, 
"url": "http://httpbin.org/post"
}
Copier après la connexion

Vous pouvez voir que les paramètres ont été transmis avec succès, puis le serveur a renvoyé les données que nous avons transmises.

Parfois, les informations que nous devons envoyer ne se présentent pas sous la forme d'un formulaire. Nous devons envoyer des données au format JSON, nous pouvons donc utiliser la méthode json.dumps() pour sérialiser les données du formulaire.

import json
import requests

url = &#39;http://httpbin.org/post&#39;
payload = {&#39;some&#39;: &#39;data&#39;}
r = requests.post(url, data=json.dumps(payload))
print r.text

#运行结果:
{
"args": {}, 
"data": "{\"some\": \"data\"}", 
"files": {}, 
"form": {}, 
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Content-Length": "16", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1"
}, 
"json": {
"some": "data"
}, 
"url": "http://httpbin.org/post"
}
Copier après la connexion

Grâce à la méthode ci-dessus, nous pouvons POST des données au format JSON

Si vous souhaitez télécharger un fichier, utilisez simplement le paramètre file directement :

#新建一个 test.txt 的文件,内容写上 Hello World!
import requests

url = &#39;http://httpbin.org/post&#39;
files = {&#39;file&#39;: open(&#39;test.txt&#39;, &#39;rb&#39;)}
r = requests.post(url, files=files)
print r.text

{
"args": {}, 
"data": "", 
"files": {
"file": "Hello World!"
}, 
"form": {}, 
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Content-Length": "156", 
"Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1"
}, 
"json": null, 
"url": "http://httpbin.org/post"
}
Copier après la connexion

De cette façon, nous avons terminé avec succès le téléchargement d'un fichier.

Les requêtes prennent en charge les téléchargements en streaming, ce qui vous permet d'envoyer des flux de données ou des fichiers volumineux sans les lire au préalable en mémoire. Pour utiliser le streaming upload, fournissez simplement un fichier de classe Objet pour le corps de votre requête, ce qui est très pratique :

with open(&#39;massive-body&#39;) as f:
requests.post(&#39;http://some.url/streamed&#39;, data=f)
Copier après la connexion

Cookies

Si une réponse contient des cookies, alors nous pouvons utiliser la variable cookies pour obtenir :

import requests

url = &#39;Example Domain&#39;
r = requests.get(url)
print r.cookies
print r.cookies[&#39;example_cookie_name&#39;]
Copier après la connexion

Le programme ci-dessus n'est qu'un exemple, vous pouvez utiliser la variable cookies pour obtenir les cookies du site

Dans De plus, vous pouvez utiliser des variables de cookies pour envoyer des informations sur les cookies au serveur :

import requests

url = &#39;http://httpbin.org/cookies&#39;
cookies = dict(cookies_are=&#39;working&#39;)
r = requests.get(url, cookies=cookies)
print r.text
#输出:
&#39;{"cookies": {"cookies_are": "working"}}&#39;
Copier après la connexion

Configuration du délai d'attente

Vous pouvez utiliser des variables de délai d'attente pour configurer le temps maximum de requête

requests.get(‘Build software better, together’, timeout=0.001)
Copier après la connexion

Remarque : le délai d'attente n'est valable que pour le processus de connexion et n'a rien à voir avec le téléchargement du corps de la réponse.

Autrement dit, ce délai ne fait que limiter le temps demandé. Même si la réponse renvoyée contient une grande quantité de contenu, le téléchargement prendra un certain temps.

Objet Session

Dans les requêtes ci-dessus, chaque requête équivaut en fait à lancer une nouvelle requête. Cela équivaut à l’utilisation d’un navigateur différent pour ouvrir chaque requête séparément. Autrement dit, il ne fait pas référence à une session, même si la même URL est demandée. Par exemple :

import requests

requests.get(&#39;http://httpbin.org/cookies/set/sessioncookie/123456789&#39;)
r = requests.get("http://httpbin.org/cookies")
print(r.text)
#结果是:
{
"cookies": {}
}
Copier après la connexion

Évidemment, ce n'est pas en session et les cookies ne peuvent pas être obtenus. Alors que devons-nous faire si nous devons maintenir une session persistante sur certains sites ? Tout comme utiliser un navigateur pour parcourir Taobao, sauter entre différents onglets crée en fait une session à long terme.

La solution est la suivante :

import requests

s = requests.Session()
s.get(&#39;http://httpbin.org/cookies/set/sessioncookie/123456789&#39;)
r = s.get("http://httpbin.org/cookies")
print(r.text)
#在这里我们请求了两次,一次是设置 cookies,一次是获得 cookies
{
"cookies": {
"sessioncookie": "123456789"
}
}
Copier après la connexion

On constate que les cookies peuvent être obtenus avec succès, ce qui consiste à établir une session.

Donc, puisque session est une variable globale, nous pouvons certainement l'utiliser pour une configuration globale.

import requests

s = requests.Session()
s.headers.update({&#39;x-test&#39;: &#39;true&#39;})
r = s.get(&#39;http://httpbin.org/headers&#39;, headers={&#39;x-test2&#39;: &#39;true&#39;})
print r.text
&#39;&#39;&#39;通过 s.headers.update 方法设置了 headers 的变量。然后我们又在请求中
设置了一个 headers,那么会出现什么结果?很简单,两个变量都传送过去了。
运行结果:&#39;&#39;&#39;
{
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1", 
"X-Test": "true", 
"X-Test2": "true"
}
}
Copier après la connexion

Et si les en-têtes passés par la méthode get étaient également des x-test ?

r = s.get(&#39;http://httpbin.org/headers&#39;, headers={&#39;x-test&#39;: &#39;true&#39;})

#它会覆盖掉全局的配置:
{
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1", 
"X-Test": "true"
}
}
Copier après la connexion

Et si vous ne souhaitez pas de variable dans la configuration globale ? C'est simple, il suffit de le régler sur Aucun.

r = s.get(&#39;http://httpbin.org/headers&#39;, headers={&#39;x-test&#39;: None})
{
"headers": {
"Accept": "*/*", 
"Accept-Encoding": "gzip, deflate", 
"Host": "http://httpbin.org", 
"User-Agent": "python-requests/2.9.1"
}
}
Copier après la connexion

Ce qui précède est l'utilisation de base de session session.

Vérification des certificats SSL

Désormais disponible partout sur les sites Web commençant par https, les requêtes peuvent vérifier les certificats SSL pour les requêtes HTTPS, tout comme un navigateur Web. Pour vérifier le certificat SSL d'un certain hôte, vous pouvez utiliser le paramètre verify, car le certificat 12306 n'était pas invalide il y a quelque temps :

import requests

r = requests.get(&#39;https://kyfw.12306.cn/otn/&#39;, verify=True)
print r.text
#结果:
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)
Copier après la connexion

Github. :

import requests

r = requests.get(&#39;Build software better, together&#39;, verify=True)
print r.text
Copier après la connexion

Eh bien, demande normale, car il y a trop de contenu, je ne collerai pas la sortie.

Si nous voulons ignorer la vérification du certificat de 12306 tout à l'heure, définissez simplement verify sur False :

import requests

r = requests.get(&#39;https://kyfw.12306.cn/otn/&#39;, verify=False)
print r.text
Copier après la connexion

Une fois trouvée, la demande peut être faite normalement. Par défaut, verify est True, vous devez donc définir cette variable manuellement si nécessaire.

Proxies

Si vous devez utiliser un proxy, vous pouvez configurer des requêtes individuelles en fournissant le paramètre proxys à n'importe quelle méthode de requête.

import requests

proxies = {
"https": "http://41.118.132.69:4433"
}
r = requests.post("http://httpbin.org/post", proxies=proxies)
print r.text
#也可以通过环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理
export HTTP_PROXY="http://10.10.1.10:3128"
export HTTPS_PROXY="http://10.10.1.10:1080"
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal