Requests 简介
Requests 作用就是让我们模拟或者(伪装)发送请求
(一) 安装
pipenv install requests
(二) 入门小 demo
# coding utf-8#
#-----------------------------------------------
# Name: demo1
# Description
# Author: 雾烟云
# Date: 2024/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 提供的接口来详解
- 查看某个用户的公开信息(https://developer.github.com/v3/users/)
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": "2024-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 认证
- 我们可以通过 https://github.com/settings/tokens/new 简单来申请一个令牌
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/",
}
 
                        
                        