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 提供的接口来详解
- 查看某个用户的公开信息(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": "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 认证
- 我们可以通过 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/",
}