Requests库是python实现的简单易用的HTTP库
请求
基本的GET请求:requests.get()
写一个实例:
import requests
response = requests.get("http://www.baidu.com")
print(type(response))
print(response.status_code)
print(response.text)
print(type(response.text))
其中,response.text 和urllib中的 .read()方法效果是一样的
各种请求方法
常见的HTTP请求的方法如: get post put delete 等,都可以直观的调用同名的方法就可以,如:
import requests
url = '....'
requests.get(url)
requests.post(url)
requests.put(url)
requests.delete(url)
requests.head(url)
requests.options(url)
关于这几种方法的区别,可以参考网上许多博文资料:
HTTP POST GET 本质区别详解
GET,POST,PUT,DELETE的区别
http协议中:GET/POST/PUT/DELETE/INPUT/TRACE/OPTIONS/HEAD方法
GET请求
最简单的请求就是
import requests
url = '…………'
response = requests.get(url)
print(response.text)
如果我们要使用带有参数的GET请求的话,具有两种方式:
把传入的参数(通常是key-value型)拼接到url中,格式: url?key1=value1&key2=value2
(推荐)命名一个参数对象(字典),然后把这个对象传入requests.get()方法中的params 参数中,举个例子:
import requests
url = "..."
data = {
"key1":"value1"
"key2":"value2"
}
response = requests.get(url,params=data)
print(response.text)
解析json
当我们的get请求返回的是一个json字符串,那么我们通过import json ,调用json方法可以把json字符串变成json格式的数据
import requests
import json
url = "..."
response = requests.get(url)# 假如说返回一个json字符串
print(response.json())
print(json.loads(response.text))
其实上面代码中,最后两行出来的结果是一样的,这里仅仅做一个”科普“。这两个方法在解析Ajex请求的时候是比较常用的。
获取一些二进制数据(图片,视频等等)
下载图片、视频是使用爬虫最常见的目的之一。这些都是二进制数据,在获取二进制数据的时候,我们可以调用content()方法获得二进制内容 .
import requests
url = '...'# 这个url是保存某张图片或视频的url
response = requests.get(url)
print(response.text) # 不出意外,这将打印一堆“乱码”
print(response.content)# 将会打印出一堆二进制数据流bytes
对于获得的二进制数据,只有我们保存下来才会得到我们想要的图片、视频,保存数据的方法就比较简单:
with open("path/file_name",'wb') as f:
f.write(response.content)
f.close()
这样就可以顺利的保存下我们想要的二进制资源了。
给请求添加headers
如果不给我们的请求添加headers,我们可能会被网站管理者禁掉,或者出现服务器错误。例如像这样:
500 Server Error
An internal server error occured.
添加headers的方法也很简单,直接在get()方法中传入headers就可以了,不过多累述
基本的POST请求
既然是POST那就必然要传入一些数据,直接传入dict 类型的form-data就可以。
import requests
data = {"key1":"value1","key2":"value2"}
headers = {"User-Agent":"....."}
response = requests.post("url",data=data,headers=headers)
print(response.json())
response属性
response属性常见的包括status_code, headers, cookies, url, history,可以自己尝试调用这些方法来实践。
一些高级操作
文件上传操作:
文件上传则需要用到post方法,这里可以使用post方法中传入files参数,实现文件的上传。注意这里的files参数是一个字典。
比方说上传一张图片的话,已知本地图片的路径path和要上传的网站url:
import requests
files = {"files":open('path':‘rb’)}
response = requests.post(url,files=files)
获取cookies
import requests
response = requests.get(url)
print(response.cookies)# 有可能返回的是一个cookieJar类型的cookie列表,我们可以用for循环打印出来
for key,value in response.cookies.item():
print(key + ' = ' + value)
这样我们就可以直观的获得我们想要的所有cookies,这样的方法比urllib容易多了,不用设置什么opener,什么handler之类的。
有了cookies,我们就可以利用它进行会话维持,模拟登陆。(常用Session()方法)
证书验证
我们在requests请求一个网站时,如果网站是一个HTTPS协议的话
,程序将默认首先检测证书是否合法,当证书不合法时,将会抛出一个SSLError。
我们可以给get()方法中的verify参数设置为False`
import requests
# from requests.packages import urllib3
# urllib3.disable_warnings()
response = requests.get(url,verify=False)
print(response.status_code)
这样就可以避免SSL验证错误了,不过程序会报一个warning,告诉你没有验证,这里去除第二、三行的注释号‘#’ ,可以排除这个warning。
在get() 方法中还有一个cert参数,可以传递本地的证书文件,一般我们非网站开发不会用到。
设置代理
用requests库设置代理也很容易,直接创建一个dict然后作proxies参数传入get()方法就可以了。
import requests
proxies={'http':'http://代理IP号码',
'https':'https://代理IP号码'
}
response = requests.get(url,proxies=proxies)
如果代理是socks代理,那么我们需要安装requests.socks模块,然后像上述代码一样类似设置就可以啦
proxies={'http':'socks5://代理IP号码',
'https':'socks5://代理IP号码'
}
设置超时
用来限制服务应答的速度。直接设置get方法里面的timeout参数就好。
认证设置
遇到要登录验证的网站,则可以利用auth参数进行登录验证,传入登录用户名,密码。
import requests
from requests.auth import HTTPBasicAuth
r = requests.get(url,auth = HTTPBasicAuth('用户名',‘密码’))
print(r.status_code)
也可以直接输入auth参数进行设置
错误与异常
在requests库中,常见的错误主要有 HTTPError, ConnectionError, readtimeout 等,在这里要想在try - except 中捕获异常进行处理也是相当便捷的,这里附上其官方文档的链接,方便需要时查看: