python第三方库requests学习笔记详解编程语言

废话不多说,直接上代码!

简单应用:

import requests 
  
r = requests.get(url='http://www.itwhy.org')    # 最基本的GET请求 
print(r.status_code)    # 获取返回状态 
 
r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'})   #带参数的GET请求 
print(r.url)     #打印出https://dict.baidu.com/s?wd=python 
print(r.text)   #打印解码后的返回数据

其他方法接口:

requests.get(‘https://github.com/timeline.json’) #GET请求 
requests.post(“http://httpbin.org/post”) #POST请求 
requests.put(“http://httpbin.org/put”) #PUT请求 
requests.delete(“http://httpbin.org/delete”) #DELETE请求 
requests.head(“http://httpbin.org/get”) #HEAD请求 
requests.options(“http://httpbin.org/get”) #OPTIONS请求

带参数的请求实例:

import requests 
requests.get('http://www.dict.baidu.com/s', params={'wd': 'python'})    #GET参数实例,GEI参数是params 
 
requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '测试POST'})    #POST参数实例 POST参数是data

POST发送JSON数据:

import requests 
import json 
  
r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'})) 
print(r.json())

定制header:

import requests 
import json 
  
data = {'some': 'data'} 
headers = {'content-type': 'application/json', 
           'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'} 
  
r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers) 
print(r.text)

使用requests方法后,会返回一个response对象:

使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……

获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。

r = requests.get('http://www.itwhy.org') 
print(r.text, '/n{}/n'.format('*'*79), r.encoding) 
r.encoding = 'GBK' 
print(r.text, '/n{}/n'.format('*'*79), r.encoding)

其他响应:

r.status_code #响应状态码 
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取 
r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩 
r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码 
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None 
#*特殊方法*# 
r.json() #Requests中内置的JSON解码器 
r.raise_for_status() #失败请求(非200响应)抛出异常
r.status_code  # 返回码 200 
r.headers['content-type']  # 返回头部信息 'text/html; charset=utf8' 
r.encoding  # 编码信息 'utf-8' 
r.text  #内容部分(PS,由于编码问题,建议这里使用r.content)

例子:

import requests 
  
URL = 'http://ip.taobao.com/service/getIpInfo.php'  # 淘宝IP地址库API 
try: 
    r = requests.get(URL, params={'ip': '8.8.8.8'}, timeout=1) 
    r.raise_for_status()    # 如果响应状态码不是 200,就主动抛出异常 
except requests.RequestException as e: 
    print(e) 
else: 
    result = r.json() 
    print(type(result), result, sep='/n')

利用requests上传文件:

使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理:

import requests 
  
url = 'http://127.0.0.1:5000/upload' 
files = {'file': open('/home/lyb/sjzl.mpg', 'rb')} 
#files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))}     #显式的设置文件名 
  
r = requests.post(url, files=files) 
print(r.text)

更加方便的是,你可以把字符串当着文件进行上传:

import requests 
  
url = 'http://127.0.0.1:5000/upload' 
files = {'file': ('test.txt', b'Hello Requests.')}     #必需显式的设置文件名 
  
r = requests.post(url, files=files) 
print(r.text)

身份验证:

基本身份认证(HTTP Basic Auth):

import requests 
from requests.auth import HTTPBasicAuth 
  
r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd')) 
# r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd'))    # 简写 
print(r.json())

另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:

requests.get(URL, auth=HTTPDigestAuth('user', 'pass'))

Cookies与会话对象:

如果某个响应中包含一些Cookie,你可以快速访问它们:

import requests 
  
r = requests.get('http://www.google.com.hk/') 
print(r.cookies['NID']) 
print(tuple(r.cookies))

要想发送你的cookies到服务器,可以使用 cookies 参数:

import requests 
  
url = 'http://httpbin.org/cookies' 
cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'} 
# 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。 
r = requests.get(url, cookies=cookies) 
print(r.json())

会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。
下面就来一个真正的实例,如下是快盘签到脚本:

import requests 
  
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
           'Accept-Encoding': 'gzip, deflate, compress', 
           'Accept-Language': 'en-us;q=0.5,en;q=0.3', 
           'Cache-Control': 'max-age=0', 
           'Connection': 'keep-alive', 
           'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'} 
  
s = requests.Session() 
s.headers.update(headers) 
# s.auth = ('superuser', '123') 
s.get('https://www.kuaipan.cn/account_login.htm') 
  
_URL = 'http://www.kuaipan.cn/index.php' 
s.post(_URL, params={'ac':'account', 'op':'login'}, 
       data={'username':'[email protected]', 'userpwd':'********', 'isajax':'yes'}) 
r = s.get(_URL, params={'ac':'zone', 'op':'taskdetail'}) 
print(r.json()) 
s.get(_URL, params={'ac':'common', 'op':'usersign'})

超时与异常:

timeout 仅对连接过程有效,与响应体的下载无关。

>>> requests.get('http://github.com', timeout=0.001) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException:ConnectionError、HTTPError、Timeout、TooManyRedirects。

转自:http://www.itwhy.org/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/Python/python-%E7%AC%AC%E4%B8%89%E6%96%B9-http-%E5%BA%93-requests-%E5%AD%A6%E4%B9%A0.html

代理访问:

采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。

import requests 
 
proxies = { 
  "http": "http://10.10.1.10:3128", 
  "https": "http://10.10.1.10:1080", 
} 
 
requests.get("http://www.zhidaow.com", proxies=proxies)

如果代理需要账户和密码,则需这样:

proxies = { 
    "http": "http://user:[email protected]:3128/", 
}

请求头内容:

请求头内容可以用r.request.headers来获取。

>>> r.request.headers 
{'Accept-Encoding': 'identity, deflate, compress, gzip', 
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.3 CPython/2.7.3 Windows/XP'}

自定义请求头部:

伪装请求头部是采集时经常用的,我们可以用这个方法来隐藏:

r = requests.get('http://www.zhidaow.com') 
print r.request.headers['User-Agent'] 
#python-requests/1.2.3 CPython/2.7.3 Windows/XP 
 
headers = {'User-Agent': 'alexkh'} 
r = requests.get('http://www.zhidaow.com', headers = headers) 
print r.request.headers['User-Agent'] 
#alexkh

持久连接keep-alive:

requests的keep-alive是基于urllib3,同一会话内的持久连接完全是自动的。同一会话内的所有请求都会自动使用恰当的连接

也就是说,你无需任何设置,requests会自动实现keep-alive。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/18180.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论