python内置的urllib在某些高级应用时存在很多不方便的地方且功能似乎也没有想象的那么强大,于是更为强大第三方库requests库应运而生,有了它,cookies,代理,登陆操作都是简化很多。
首先确认安装requests库:
pip install requests
1.类比于urllib的urlopen()方法发送请求,requests对应的方法是get(),实例如下:
r=requests.get('http://httpbin.org/get')
print(r.status_code)#输出状态码
print(r.text)#输出文本
print(type(r))#输出返回类型
print(r.cookies)#输出cookies
结果如下:
200
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.20.1"
},
"origin": "180.117.236.124",
"url": "http://httpbin.org/get"
}
<class 'requests.models.Response'>
<RequestsCookieJar[]>
如果要给url附加额外信息,只要在get()方法中传入params参数即可,此参数为字典类型,实例如下:
data={'name':'germey','age':22}
r1=requests.get('http://httpbin.org/get',params=data)
if (r.status_code==200)&(r1.status_code==200):
print(r.status_code)
print(r.json)#返回字典
print(type(r))
print(r.cookies)#类型RequestsCookieJar
print(r1.text)
对于返回内容,可以通过调用json()方法得到字典格式结果;
添加headers以及Post请求的用法均和urllib库中的用法类似,这里就不多赘述了,下面主要是requests的高级用法介绍。
2.文件的上传:
假设有的网站请求数据需要通过上传文件来实现,这个时候就可以用requests来实现,实例如下:
files={'file':open('mei.jpg','rb')}
r3=requests.post('http://jandan.net/ooxx',files=files)
print(r3.text)
3.cookies:
之气那用urllib设置cookies写法很复杂,需要使用Handler以及Opener,而使用requests可以直接设置cookies,实例如下:
r4=requests.get('https://www.baidu.com')
print(r4.cookies)
for key,value in r4.cookies.items():
print(key+'='+value)
返回结果为:<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315
当然也可以使用cookies来维持登陆状态,只要添加自己的cookies键名与键值到headers参数中即可,实例如下,以CSDN网站为例:
headers={
'Cookie': 'dc_session_id=10_1542115241432.364538; uuid_tt_dd=6658982548662906625_20181113; ADHOC_MEMBERSHIP_CLIENT_ID1.0=6cfa3e25-f923-fa2b-abd6-b11133353fea; _ga=GA1.2.667144044.1542115248; _gid=GA1.2.325796028.1542208355; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1542208355,1542208878,1542281934,1542285273; TY_SESSION_ID=13e78550-de79-470b-aa24-9daabf6553a0; _gat_gtag_UA_127895514_1=1; SESSION=c712c4e2-c5f9-4a00-8c29-5492c3f0d276; CSDNToken=3a4409cdba704d8783da28cbc62798ae; UserName=weixin_42672765; UserInfo=FaqBbhadnTE44s3wXmAm4sMqRwceUmC62WR6FZTpSwr6J9VLAjvoOoFzPEeXZbXBAZmTVhcoagxmId7CgrwQNg%3D%3D; UserToken=FaqBbhadnTE44s3wXmAm4sMqRwceUmC62WR6FZTpSwr6J9VLAjvoOoFzPEeXZbXBqL2%2F62GvudapCrGwn0fPcptUjJQBnF3L3vtguP6LgM%2FkGPiLcnBrslye%2FUzHow2v; UserNick=%E6%87%92%E6%87%92%E7%9A%84%E4%B9%A6%E8%99%AB; AU=995; UN=weixin_42672765; BT=1542286541648; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1542286543; dc_tos=pi8jwv; tipShow=true'
'Host':'www.csdn.net',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
r5=requests.get('https://www.csdn.net/',headers=headers)
print(r5.text)
cookies设置正确运行后即可看到网页的源代码
3.但是使用cookies维持会话有一个问题,每一访问都必须设置成一样的cookies,否则相当于每一次重新访问都又打开一次浏览器,而使用session对象就不会出现那这样的问题。做过网站开发的同学肯定对这个家伙很熟悉,我们用它来记录用户会话所需的信息,requests用法如下:
s=requests.Session()
s.get('https://httpbin.org/cookies/set/number/123456789')
r6=s.get('https://httpbin.org/cookies')
print(r6.text)
返回结果如下:
{
“cookies”: {
“number”: “123456789”
}
}
我们第一请求时设置了cookies并用session对象来保存(number:12345789),随后再次请求,我们依然可以得到cookies,说明两次的请求其实是同一个会话。
4.SSL证书验证:
requests还提供了验证SSL证书的功能,当发送HTTP请求时,他会默认检查SSL证书,可以通过设置verify参数为False来忽略检查SSL证书,但是一般会发出警告,建议我们指定证书,指定证书的实例如下:
r7=requests.get('https://www.12306.cn',cert=('/path/server.crt','/path/key'))#本地的证书名称和路径
print(r7.status_code)
可以指定单个文件,也可以指定文件与其路径的元组。
5.一般网站为了保证带宽不过多被爬虫占据,会采用一些反爬虫策略,包括验证码,登陆,或者直接封掉爬虫的IP,导致一段时间无法访问,这是我们就需要使用代理,通过设置requests的proxies参数即可实现,实例如下:
proxies={'http':'http://10.10.1.10:3128'
'https':'https://10.10.1.10:1080'
}
r=requests.get('url',proxies=proxies)
以上时http协议的代理,当然如果你能找到的话也可以使用socks代理,前提需要安装‘requests[socks]这个库文件。
6.超时:timeout,用法与urllib相同
7.身份验证:
对于需要登陆认证的页面,requests提供了身份认证的功能,通过在get()方法中设置auth参数,将用户名和密码组成的元组传入,即可实现,实例如下:
shenfen=('********','************')
r8=requests.get('http://www.youku.com',auth=shenfen)#参数使用元组,默认使用HTTPBasicAuth来验证
print(r8.status_code)
当然也有比较繁琐的办法(额,不是都有简单的方法了吗?)给每一个参数都传递一个HTTPBasicAuth类来实现,即
r8=requests.get('http://www.youku.com',auth=HTTPBasicAuth('username','password'))
requests库的用法还有很多,更多的还是要参考官方文档。