Requests 使用教程

Requests 简介

Requests 作用就是让我们模拟或者(伪装)发送请求

(一) 安装


pipenv install requests

(二) 入门小 demo


# coding utf-8#
#-----------------------------------------------
# Name: demo1
# Description
# Author: 雾烟云
# Date: 2020/8/1 0001

from flask import Flask

import  requests

# 实验web地址 http://httpbin.org

url_ip = 'http://httpbin.org/ip'

url_get = 'http://httpbin.org/get'

# 直接使用

def request_simple():
    # 利用get方法得到一个response
    response = requests.get(url_ip)
    # 打印头部
    print("Response Headers:",response.headers)
    # 打印body
    print("Response body:",response.text)


# 带参数的请求

def request_params():
    params_data = {'param1':'hello','param2':'world'}
    # 发送请求
    response2 = requests.get(url_get,params=params_data)
    # 处理响应
    # 打印头部
    print("Reponse Headers",response2.headers)
    # 打印 状态码
    print("Response Code",response2.status_code)

    # 打印内容
    print("Response body",response2.json())

app = Flask(__name__)

if __name__=="__main__":
     print("____request_simple方法_____")
     request_simple()
     print("_____request_parmas方法_____")
     request_params()
     # app.run(host='127.0.0.1',debug=True,port=5000)

(三) Requsets 发送请求

  • GET 查看资源

  • POST 增加资源

  • PUT 修改资源

  • PATCH 更新资源

  • DELETE 删除资源

  • HEAD 查看响应头

  • OPTIONS 查看可以用的请求方法

我们利用 github 提供的接口来详解


import  requests
import json
url = 'https://api.github.com'

# 请求函数

def request_user():
    user_url = url+"/users/Test"
    response = requests.get(user_url)
    print(json.dumps(json.loads(response.text)))

if __name__ == "__main__":
    request_user()
  • 返回的结果
{
  "login": "test",
  "id": 383316,
  "node_id": "MDQ6VXNlcjM4MzMxNg==",
  "avatar_url": "https://avatars3.githubusercontent.com/u/383316?v=4",
  "gravatar_id": "",
  "url": "https://api.github.com/users/test",
  "html_url": "https://github.com/test",
  "followers_url": "https://api.github.com/users/test/followers",
  "following_url": "https://api.github.com/users/test/following{/other_user}",
  "gists_url": "https://api.github.com/users/test/gists{/gist_id}",
  "starred_url": "https://api.github.com/users/test/starred{/owner}{/repo}",
  "subscriptions_url": "https://api.github.com/users/test/subscriptions",
  "organizations_url": "https://api.github.com/users/test/orgs",
  "repos_url": "https://api.github.com/users/test/repos",
  "events_url": "https://api.github.com/users/test/events{/privacy}",
  "received_events_url": "https://api.github.com/users/test/received_events",
  "type": "User",
  "site_admin": false,
  "name": null,
  "company": null,
  "blog": "",
  "location": null,
  "email": null,
  "hireable": null,
  "bio": null,
  "twitter_username": null,
  "public_repos": 5,
  "public_gists": 0,
  "followers": 23,
  "following": 0,
  "created_at": "2010-09-01T10:39:12Z",
  "updated_at": "2020-04-24T20:58:44Z"
}

(四) 带参数的请求

  • URL Parameters URL 参数

例如 https://list.tmall.com/search_product.html?cat=5001&

对应的结果就是


resuqets.get(url,params={"key1":"value1"})
  • 表单参数提交

例如: Content-Type:application/x-www-form-urlencoded

内容: key1=value&key2=value2


requests.post(url,data={'key1':"value1","key2":"value2"})
  • json 提交

例如 Content-Type:application/json

内容 {“key1”:”value1”,”key2”:”value2”}


requests.post(url,json={"key1":"value1","key2":"value2"})

params 参数请求例子

请求地址类似: https://api.github.com/users?since=11


import requests

import json

url = 'https://api.github.com'

# 发送数据

def request_params():
    user_url = url+"/users"
    response = requests.get(user_url,params={'since':11})
    print(json.dumps(json.loads(response.text)))

if __name__ == "__main__":
      request_params()

json 参数请求例子

  • 用的 patch

import requests

import json

url = 'https://api.github.com'

# 发送数据

def request_json():
    user_url = url+"/user"
    response = requests.patch(user_url,auth=('此处为你的账户','此处为你的密码'),json={'name':'此处为你想要改的名字'})
    print(json.dumps(json.loads(response.text)))

if __name__ == "__main__":
      request_json()
  • 用的 post

import requests

import json

url = 'https://api.github.com'

# 发送数据

def request_json():
    user_url = url+"/user/emails"
    response = requests.post(user_url,auth=('此处为你的账户','此处为你的密码'),json=['test@qq.com'])
    print(json.dumps(json.loads(response.text)))

if __name__ == "__main__":
      request_json()

(五)请求异常处理和访问超时

设置超时时间


requests.get(url,timeout=(3,7))

requests.get(url,timeout=10)

访问一个网站是我们发送一个请求,然后网站给我们一个响应。

  • 第一种方法中的 3,7 分别对应这两个过程的超时时间限制

  • 第二种 则是对整个访问过程的时间限制


import requests

import json

url = 'https://api.github.com'

# 发送数据

def request_params():
    user_url = url+"/users"
    response = requests.get(user_url,params={'since':11},timeout=0.1)
    print(json.dumps(json.loads(response.text)))

if __name__ == "__main__":
      request_params()
  • 返回的结果就是

HTTPSConnectionPool(host='api.github.com', port=443): ..........

既然有异常了,我们就能捕获

(一) 安装 exceptions


from requests import exceptions

(二)httpserror 通过 exceptions


import requests

import json

from requests import exceptions
url = 'https://api.github.com'

# 发送数据

def request_json():
    try:
        user_url = url+"/user/emails"
        response = requests.get(user_url)
        response.raise_for_status()
    except exceptions.HTTPError as err:
        print(err)
if __name__ == "__main__":
      request_json()
  • 返回的结果

401 Client Error: Unauthorized for url: https://api.github.com/user/emails

(六) 定制请求

  • 在 headers 加入 User-Agent

  • 在头部加入 cookie


import requests

#主体函数 在代码中添加头部信息来向目标网址发送自己定制请求
def requests_header():
        cookie = {'key':'value'}
        response=requests.get('http://httpbin.org/get',headers={'User-Agent':'fake'},cookies=cookie)
        print(response.text)

if __name__=="__main__":
    requests_header()
  • 查看返回信息
{
  "args": {},
  "headers": {
    "Accept": "_/_",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "fake"
  },
  "origin": "115.51.238.17, 115.51.238.17",
  "url": "https://httpbin.org/get"
}

(七) 响应的处理

  • 响应的常用属性

response.text # 响应回去的文本(字符串)
response.content # 响应回去的内容(二进制),一般用来爬取视频,图片
response.status_code # 响应的状态码
response.url # 获取请求连接地址
response.cookies # 获取返回的cookies信息
response.cookies.get_dict() # 获取返回的cookies信息
response.request # 获取请求方式
response.headers # 查看响应头
response.history # 重定向历史 即前一次请求的地址
  • 返回结果为 json 数据处理

response.json() # 将结果进行反序列化
  • 爬取文档乱码问题

response.apparent_encoding # 文档的编码的方式(从HTML文档找)
response.encoding # 响应体编码方式
eg: response.encoding = response.apparent_encoding # 文档的声明方式
eg: print(response.text.encode('utf-8'))

注意:response.headers 是服务器发送给我们的头部信息,response.request.headers 才是我们这个客服端向服务器发请求的头部信息(即自己的信息)

(七)下载文件

  • 比如下载百度 logo

https://www.baidu.com/img/bd_logo1.png


import requests

url='https://www.baidu.com/img/bd_logo1.png'

def download_img():
    response=requests.get(url)
    with open('logo.png','wb') as img:#此步骤涉及文件读写操作 图片是二进制,所以要用二进制写文件 用参数 'wb'
        img.write(response.content)

if __name__=='__main__':
    download_img()
  • 但有的时候视频或者图片非常大会出现内存不足的情况

当下载大的文件的时候,我们可以在 requests.get()中使用 stream 参数.
默认情况下是 false,他会立即开始下载文件并存放到内存当中,倘若文件过大就会导致内存不足的情况.
当把 get 函数的 stream 参数设置成 True 时,它不会立即开始下载,当你使用 iter_content 或 iter_lines 遍历内容或访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。
iter_content:一块一块的遍历要下载的内容
iter_lines:一行一行的遍历要下载的内容
使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。


import requests

url='https://www.baidu.com/img/bd_logo1.png'

def download_img():
    response=requests.get(url,stream=True)#stream参数记得选为True
    with open('logo.png','wb') as img:#图片是二进制,所以要用二进制写文件 用参数 'wb'
        for chunk in response.iter_content(1024):#规定一次读取写入大小 单位为字节
            img.write(chunk)
        response.close()#关闭数据流连接

if __name__=='__main__':
    download_img()

(八) OAuth 认证


import requests

url='https://api.github.com'

#构建url函数  我们需要提交的url是原api网址加上我们自己额外添加的参数
# 所以简单写一个组成url的函数 即添加 '/' 号
def build_url(conend):
    return '/'.join([url,conend])

#基础oauth认证
def http_oauth():
    #构建头部数据 加上token信息
    header={'Authorization':'token 62646e55689b597eb076cb08c5e020e3762bc84f '}
    response=requests.get(url+'/user',headers=header)
    print(response.text)

http_oauth()

(九) Session


s = requests.session()
s.auth = ('auth','passwd')
s.headers = {'key':'value'}
r = s.get('url')
r1 = s.get('url1'

(十) 代理


proxies = {'http':'ip1','https':'ip2' }
requests.get('url',proxies=proxies)

(十一) 汇总


# HTTP请求类型
# get类型
r = requests.get('https://github.com/timeline.json')
# post类型
r = requests.post("http://m.ctrip.com/post")
# put类型
r = requests.put("http://m.ctrip.com/put")
# delete类型
r = requests.delete("http://m.ctrip.com/delete")
# head类型
r = requests.head("http://m.ctrip.com/head")
# options类型
r = requests.options("http://m.ctrip.com/get")

# 获取响应内容
print(r.content) #以字节的方式去显示,中文显示为字符
print(r.text) #以文本的方式去显示

#URL传递参数
payload = {'keyword': '香港', 'salecityid': '2'}
r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload)
print(r.url) #示例为http://m.ctrip.com/webapp/tourvisa/visa_list?salecityid=2&keyword=香港

#获取/修改网页编码
r = requests.get('https://github.com/timeline.json')
print (r.encoding)


#json处理
r = requests.get('https://github.com/timeline.json')
print(r.json()# 需要先import json

# 定制请求头
url = 'http://m.ctrip.com'
headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
r = requests.post(url, headers=headers)
print (r.request.headers)

#复杂post请求
url = 'http://m.ctrip.com'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload)) #如果传递的payload是string而不是dict,需要先调用dumps方法格式化一下

# post多部分编码文件
url = 'http://m.ctrip.com'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)

# 响应状态码
r = requests.get('http://m.ctrip.com')
print(r.status_code)

# 响应头
r = requests.get('http://m.ctrip.com')
print (r.headers)
print (r.headers['Content-Type'])
print (r.headers.get('content-type')) #访问响应头部分内容的两种方式

# Cookies
url = 'http://example.com/some/cookie/setting/url'
r = requests.get(url)
r.cookies['example_cookie_name']    #读取cookies

url = 'http://m.ctrip.com/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies) #发送cookies

#设置超时时间
r = requests.get('http://m.ctrip.com', timeout=0.001)

#设置访问代理
proxies = {
           "http": "http://10.10.1.10:3128",
           "https": "http://10.10.1.100:4444",
          }
r = requests.get('http://m.ctrip.com', proxies=proxies)


#如果代理需要用户名和密码,则需要这样:
proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}

文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录