Python的requests库详解

requests库快速学习

requests库的作者是大名鼎鼎的kennethreitz,它口号是“HTTP For Humans”,为人类使用HTTP而生。

requests常用来进行接口请求,爬取网页等,相对于原生的urllib,它发起请求更加简洁和容易理解,支持HTTP连接保持和连接池、cookie保持会话、文件上传和支持自动确定响应内容的编码等。

开源地址:https://github.com/kennethreitz/requests

安装

pip install requests

Requests库提供了7种请求方法:

方法 说明
requests.request() 构造一个请求,支撑以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTML网页提交删除请求,对应于HTTP的DELETE

通过查看源码我们可以发现,后面6种方法都是在调用request()方法。

def get(url, params=None, **kwargs):
    return request('get', url, params=params, **kwargs)

def post(url, data=None, json=None, **kwargs):
    return request('post', url, data=data, json=json, **kwargs)

request()方法参数说明:

requests.request(method, url, **kwagrs)
  • method: 请求方式,对应get/post等6种方法

  • url: 获取页面的url链接

  • **kwargs: 控制访问的参数,共有13个:

    params: 字典或字节序列,作为参数增加到url中

    data:字典,字节序列或文件对象,作为Request的内容

    json: JSON格式的数据,作为Request的内容

    headers: 字典, HTTP定制头

    cookie: 字典或CooKiJar, Request中的cookie

    auth: 元祖,支持HTTP认证功能

    files: 字典类型,传输文件

    timeout: 设定超时时间,秒为单位

    proxies: 字典类型,设定访问代理服务器,可以增加登录认证

    allow_redirects: True/False,默认为True,重定向开关
    stream: True/False,默认为True,获取内容立即下载开关
    verity: True/False默认Ture,认证ssl证书开关
    cert: 本地ssl证书路径

模拟get请求

import requests
#构造get请求
r = requests.get('http://www.baidu.com')
print('响应码',r.status_code) #返回接口响应码
print('响应信息',r.text) #返回html

输出
响应码 200
响应信息 <!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always........................>
import requests
data = {'name': 'xiaoming', 'age': '22'}
response = requests.get("http://httpbin.org/get", params=data)
print(response.json())

模拟post请求

#随机获取图片地址
#请求方式:POST
#请求地址:https://api.apiopen.top/getImages
data= {'page':'1','count':'2'}
r = requests.post('https://api.apiopen.top/getImages',data=data)
print('响应码',r.status_code)
print('响应信息',r.text)

输出
响应码 200
响应信息 {"code":200,"message":"成功!","result":[{"id":674,"time":"2020-02-16 04:00:00","img":"https://img.lijinshan.site/images/70def23833844b0fa0e6e74041421e37"},{"id":675,"time":"2020-02-16 04:00:00","img":"https://img.lijinshan.site/images/999cf7f9728b45deacc0740de53aaff1"}]}

http请求的基本属性

print('请求url',r.request.url)
print('请求参数',r.request.body)
print('请求header',r.request.headers)

http响应的基本属性

print(r.content)#获取bytes类型的响应
print('响应码',r.status_code)
print('响应信息',r.text) #响应信息,文本,字符串
print('响应信息字典',r.json())#响应信息,json
print('响应信息字典值',r.json()['xxx'])
print('响应cookies',r.cookies)
print('响应headers',r.headers)

常见请求操作

添加headers

服务器反爬虫机制会判断客户端请求头中的User-Agent是否来源于真实浏览器,可以指定UA伪装成浏览器发起请求

import requests

data = {'name': 'xiaoming', 'age': '22'}
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
response = requests.post("http://httpbin.org/post", data=data, headers=headers)
print(response.json())

文件上传:

import requests
files = {'file': open('test.txt', 'rb')}
response = requests.post("http://httpbin.org/post", files=files)
print(response.text)

设置超时

当发起一个请求遇到服务器响应非常缓慢时,可以指定 timeout 来设置请求超时时间,单位是秒,超过该时间还没有连接服务器成功时,请求将强行终止。

r = requests.get('http://www.baidu.com', timeout=5)

设置代理

通过同一时间请求太多会被服务器判定为爬虫,所以很多时候我们使用代理IP来伪装客户端的真实IP,代理服务器就是用来转发请求和响应。可以让代理服务器转发请求从而更换请求的原始ip地址。

import requests

proxies = {
    'http': 'http://127.0.0.1:1080',
    'https': 'http://127.0.0.1:1080',
}

r = requests.get('http://www.kuaidaili.com/free/', proxies=proxies, timeout=2)

HTTP请求处理cookie的三种方式

一般登录后,需要保持会话状态,需要每次都指定 cookies,有如下三种处理方式:

  • cookie放到headers中

    将cookie封装到headers字典中,将该字典作用到get/post方法的headers参数中

    import requests
    url= ‘http://httpbin.org/post'
    headers = {
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
    "Cookie":"XXXXX"}
    }
    requests.get(url,headers=headers)
  • cookie字典传给cookies参数

    res=requests.get(url,headers=headers,cookies=cookies)
  • 使用session对象

    在使用session进行请求发送的过程中,如果产生了cookie,则cookie会被自动存储到session对象中,后续直接使用该对象进行请求即可。

    Session对象的创建:requests.Session()

    import requests
    session = requests.session()
    response = session.get(url)

更多requests库的用法,大家可以学习下官方文档:

http://docs.python-requests.org/zh_CN/latest/index.html

原创内容,禁止转载
程序员知识精选 » Python的requests库详解