关于requests:
官方的解释是:Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
作用:
Requests 完全满足今日 web 的需求。
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持?
.netrc
安装:
pip instsall requests ? ? #适用Python3
Requests的使用方法:
实例说明:
import requests
response=requests.get('https://www.baidu.com')
print(type(response))
print(response.status_code)
print(type(response.text))
print(response.text)
print(response.cookies)
返回结果:
?
各种请求方式:
import requests
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
基本的get请求:
import requests
response=requests.get('http://httpbin.org/get')#用get方式发送请求并获得响应
print(response.text)#用text查看响应内容
返回结果:
?
?
?
带参数的get请求:
import requests
data={
'name':'zhuzhu',
'age':23
}
response=requests.get('http://httpbin.org/get',params=data)
#用字典的形式传递给params参数,不需要自己写url编码
print(response.text)
返回结果:
?
?解析json:
import requests
response=requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())#把返回结果编码成一个json对象
print(type(response.json()))
返回结果:
?
备注:使用于返回一些AJEX请求时是比较常用的。?
获取二进制数据:
在下载一些内容(图片、视频)的时候常用的一个方法。 试试看,我们想要获取一个github的图标:
import requests
response=requests.get("https://github.com/favicon.ico")
print(type(response.text),type(response.content))
print(response.text)
print(response.content)#可以使用content属性来获取二进制内容
返回结果:
?
可以看到,在响应中,text的类型是string,而content的内容是bytes,也就是二进制形式。 怎么把这个图标保存到本地呢?我们已经知道怎么获取它的二进制内容,现在只需要写入文件就可以了?
?
import requests
response=requests.get("https://github.com/favicon.ico")
with open('favicon.ico','wb')as f:
f.write(response.content)
f.close()
运行后就可以看到favicon.ico 的文件了
?基本POST请求:
用字典的形式构建一个data,并将方法传入,来实现post请求(类似get在url中加入parmes一样)
import requests
data={'name':'zhuzhu','age':'23'}
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())
可以看到,返回的json形式的响应中,我们成功添加了data和headers的信息。?
添加headers头:
为了防爬虫,很多网址通常会对headers头进行识别,因此我们需要增加Headers头进行伪装。比如说:
import requests
response=requests.get("https://www.zhihu.com/explore")
print(response.text)
返回的结果:
?现在我们来加入HEADERS头进行伪装:
import requests
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.get("https://www.zhihu.com/explore",headers=headers)
print(response.text)
返回的结果:
?响应:
import requests
response=requests.get("http://www.baidu.com")
if not response.status_code==200:
print('请求响应失败')
else:
print("Requests 请求成功")
运行后成功,说明响应是200,是成功获取了。
?文件上传
import requests
files={'file':open('favicon.ico','rb')}
#通过files参数传入post方法中,实现文件的上传
response=requests.post("http://httpbin.org/post",files=files)
print(response.text)
?这样通过post请求,我们就完成了文件的上传,下图file显示的就是文件的字节流了:
?获取cookie:
import requests
response=requests.get("http://www.baidu.com")
print(response.cookies)
for key,value in response.cookies.items():
print(key+'='+value)
返回结果:
?
会话保持:?
作用:基本上为了实现“模拟登录”的功能。
例子:
import requests
requests.get('http://httpbin.org/cookies/set/number/123456789')
#通过cookies/set方法来设置cookie
response=requests.get('http://httpbin.org/cookies')
print(response.text)
返回空cookie
?
cookies为空,这是因为上面那段代码中发起了两次get请求,相当于两个浏览器,相互独立,所以第二次get并不能得到第一次的cookie。 可以通过声明Session对象来发起两次get请求,视为一个浏览器中进行的操作:?
import requests
s=requests.Session() #定义一个变量s
s.get('http://httpbin.org/cookies/set/number/123456789')
#通过cookies/set方法来设置cookie
response=s.get('http://httpbin.org/cookies')
print(response.text)
证书验证
如果我们要爬取的是一个https协议的网站,那么网站首先会检查证书是否是合法的,若非法,会直接抛出SSLError错误。如果要避免这种错误的话,可以把这个参数:verify设置为False就可以了(默认是True)。 ?
import requests
response=requests.get('https://www.12306.cn',verify=False)#把verify参数置否
print(response.status_code)
代理设置
可以通过字典形式构造一个参数,字典里是你已经开通的代理ip。再把参数传入get方法即可。
?
import requests
proxies={
"http":"http://127.0.0.1:9743",
"https":"https://127.0.0.1:9743"
}
response=requests.get("https://www.taobao.com",proxies=proxies)
print(response.status_code)
如果代理需要用户名和密码的时候怎么办呢? 我们可以在代理的url前面直接传一个user:password,后面加个@符号,这样我们就能传入用户名和密码这个认证信息了:
proxies={
"http":"http://uesr:password@127.0.0.1:9743/",
}
?那如果代理方式不是https,而是一个socks类型的呢? 首先需要安装,在命令行执行(windows环境下): pip3 install request[socks] 安装之后就可以使用这种形式的代理了。
import requests
proxies={
"http":"sock5://127.0.0.1:9743",
"https":"socks5://127.0.0.1:9743"
}
response=requests.get("https://www.taobao.com",proxies=proxies)
print(response.status_code)
超时设置:
import requests
response=requests.get("https://www.taobao.com",timeout=1)
#设置一个时间限制,必须在1秒内得到应答
print(response.status_code)
?如果时间超出了限制,就会抛出异常。怎么捕获这个异常呢?
import requests
from requests.exceptions import ReadTimeout
try:
response=requests.get("https://httpbin.org/get",timeout=0.5)
print(response.status_code)
except ReadTimeout:
print('Timeout')
认证设置:
作用:有的网站在访问时需要输入用户名和密码,输入之后才能看到网站的内容。 如果遇到这种网站,我们可以通过auth参数,把用户名和密码传入。
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('http://120.27.34.24:9001',auth=HTTPBasicAuth('user','123'))
#通过auth参数传入。
print(r.status_code)
这样就可以完成一个正常的请求,如果把auth参数去掉,那么就会返回401参数(请求被禁止)。?
异常处理
异常处理的部分还是比较重要的,它可以保证你的爬虫不间断地运行。 原则还是先捕获子类异常,再捕捉父类异常(RequestException)。
import requests
from requests.exceptions import ReadTimeout,HTTPError,RequestException
try:
response=requests.get('http://httpbin.org/get',timeout=0.1)
print(response.status_code)
except ReadTimeout:#捕获超时异常
print('Timeout')
except HTTPError:#捕获HTTP异常
print('Http error')
except ConnectionError:#捕获连接异常
print('Connection error')
except RequestException:#捕获父类异常
print('Error')
|