美文网首页
python(requests详解)2018-06-13

python(requests详解)2018-06-13

作者: 我是帅气的石头 | 来源:发表于2018-06-13 11:13 被阅读0次

requests详解

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。

一、安装 Requests

通过pip安装

pip install requests

二、发送请求与传递参数

一个简单的例子:

import requests
 
r = requests.get(url='http://www.apelearn.com/study_v2/')    # 最基本的GET请求
print(r.status_code)    # 获取返回状态

params = {
    'callback':'jQuery1102010608412711672677_1528858301536',
    'num':'8',
    '_req_seqid':'',
    'sid':'',
    '_':'1528858301537'
}
r = requests.get(url='https://www.baidu.com/home/msg/data/personalcontent',params=params)   #带参数的GET请求

print(r.url)
print(r.text)   #打印解码后的返回数据

很简单吧!不但GET方法简单,其他方法都是统一的接口样式哦!

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请求

PS:以上的HTTP方法,对于WEB系统一般只支持 GET 和 POST,有一些还支持 HEAD 方法。

带参数的请求实例:

params = {
    'callback':'jQuery1102010608412711672677_1528858301536',
    'num':'8',
    '_req_seqid':'',
    'sid':'',
    '_':'1528858301537'
}
url = 'https://www.baidu.com/home/msg/data/personalcontent'
r = requests.get(url=url,params=params)   #带参数的GET请求
r = requests.post(url=url,params=params)   #带参数的POST请求

POST发送JSON数据:

import requests
import json

params = {
    'callback':'jQuery1102010608412711672677_1528858301536',
    'num':'8',
    '_req_seqid':'',
    'sid':'',
    '_':'1528858301537'
}
url = 'https://www.baidu.com/home/msg/data/personalcontent'
r = requests.post(url=url,params=json.dumps(params))   #带参数的POST请求

定制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)

三、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响应)抛出异常

案例之一:

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')

Cookie的常用属性:

Cookie常用的一些属性:

  1. Domain 域
  2. Path 路径
  3. Expires 过期时间
  4. name 对应的key值
  5. value key对应的value值
    cookie中的domain代表的是cookie所在的域,默认情况下就是请求的域名,例如请求http://www.server1.com/files/hello, 那么响应中的set-Cookie默认会使用www.server1.com作为cookie的domain,在浏览器中也是按照domain来组织cookie的。 我们可以在响应中设置cookie的domain为其他域,但是浏览器并不会去保存这些domain为其他域的cookie。
    cookie中的path能够进一步的控制cookie的访问,当path=/; 当前域的所有请求都可以访问到这个cookie。 如果path设为其他值,比如path=/test,那么只有/test下面的请求可以访问到这个cookie

Requests通过会话信息来获取cookie信息
Cookie的五要素:
Name value domain path expires

代理访问:

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

import requests
proxies = {
  "http": "http://182.108.5.246:8118",
  # "https": "http://112.117.184.219:9999",
}
r1 = requests.get("http://2017.ip138.com/ic.asp", proxies=proxies)
r2 = requests.get("http://2017.ip138.com/ic.asp")
print(r1.text)
print(r2.text)
[182.108.5.246]
[106.38.115.34]
如果代理需要账户和密码,则需这样:
proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}

requests的中文乱码问题:

import requests

param = {"key1": "hello", "key2": "world"}
url = 'https://www.baidu.com/'
r = requests.get(url=url)
print(r.encoding)              #ISO-8859-1默认使用的是这个
r.encoding = "utf-8"
print(r.text)

这样就可以正常显示了

相关文章

网友评论

      本文标题:python(requests详解)2018-06-13

      本文链接:https://www.haomeiwen.com/subject/cvxjeftx.html