Requests库详解

摘要:
urlib库是基本库,请求库也是在urlib库的基础上开发的。然而,urllib库不如使用中的请求库方便。例如,上一篇文章在编写urllib库(如代理设置)和处理cookie时没有写,因为它感觉很麻烦,而且在发送post请求时也很麻烦。总之,请求库是一个由python实现的简单易用的HTTP库。将来爬行时,建议使用请求而不是使用urllib来了解官方文档用法说明:#/Usr/bin/envpython#-*-coding:utf-8-*-importRequestsresponse=requests。getprintprintprintprintprint输出结果是:<class‘requests。模型。响应'˃200˂!

urllib库作为基本库,requests库也是在urllib库基础上发展的

但是urllib在使用上不如requests便利,比如上篇文章在写urllib库的时候,比如代理设置,处理cookie时,没有写,因为感觉比较繁琐,另外在发送post请求的时候,也是比较繁琐。

一言而代之,requests库是python实现的简单易用的HTTP库

在以后做爬虫的时候,建议用requests,不用urllib

点我学习

官方文档

用法讲解:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests

response = requests.get('http://www.baidu.com')
print(type(response))
print(response.status_code)
print(type(response.text))
print(response.text)
print(response.cookies)
输出结果为:

<class 'requests.models.Response'>
200
<class 'str'>
<!DOCTYPE html>
<!--STATUS OK--><html>省略了 </html>

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>

由上面的小程序中可以看出,response.text直接就拿到str类型的数据,而在urllib中的urllib.request.read()得到的是bytes类型的数据,还需要decode,比较繁琐,同样的response.cookies直接就将cookies拿到了,而不像在urllib中那样繁琐

各种请求方式

import requests

requests.post('http://www.baidu.com')
requests.put('http://www.baidu.com')
requests.delete('http://www.baidu.com')
requests.head('http://www.baidu.com')
requests.options('http://www.baidu.com')

 基本get请求:

利用http://httpbin.org/get进行get请求测试:

import requests

response = requests.get('http://httpbin.org/get')
print(response.text)
输出结果:

{"args":{},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"113.71.243.133","url":"http://httpbin.org/get"}

带参数的get请求:

import requests

data = {'name':'geme','age':'22'}
response = requests.get('http://httpbin.org/get',params=data)
print(response.text)
输出结果为:

{"args":{"age":"22","name":"geme"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"origin":"113.71.243.133","url":"http://httpbin.org/get?age=22&name=geme"}

解析json  

response.text返回的其实是json形式的字符串,可以通过response.json()直接进行解析,解析结果与json模块loads方法得到的结果是完全一样的

import requests
import json

response = requests.get('http://httpbin.org/get')
print(type(response.text))
print(response.json())
print(json.loads(response.text))
print(type(response.json()))
输出结果为:

<class 'str'>
{'headers': {'Connection': 'close', 'User-Agent': 'python-requests/2.18.4', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org'}, 'url': 'http://httpbin.org/get', 'args': {}, 'origin': '113.71.243.133'}
{'headers': {'Connection': 'close', 'User-Agent': 'python-requests/2.18.4', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org'}, 'url': 'http://httpbin.org/get', 'args': {}, 'origin': '113.71.243.133'}
<class 'dict'>

 该方法在分析ajax请求的时候比较常用

获取二进制数据

二进制数据是在下载图片或者视频的时候常用的一个方法

import requests

response = requests.get('https://github.com/favicon.ico')
print(type(response.text),type(response.content))
print(response.text)
print(response.content)
#用response.content可以获取二进制内容

文件的保存在爬虫原理一文中讲到,就不再赘述 

添加headers

import requests
response = requests.get('https://www.zhihu.com/explore')
print(response.text)
输出结果为:

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>openresty</center>
</body>
</html>

 在请求这个url的时候,没有加headers,报了一个400的状态码,下面加上headers试一下:

import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}
response = requests.get('https://www.zhihu.com/explore',headers = headers)
print(response.text)

 加上这个headers之后,可以正常运行请求了 

 基本post请求

import requests
data = {'name':'haha','age':'12'}
response = requests.post('http://httpbin.org/post',data = data)
print(response.text)
输出结果为:

{"args":{},"data":"","files":{},"form":{"age":"12","name":"haha"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Content-Length":"16","Content-Type":"application/x-www-form-urlencoded","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"json":null,"origin":"113.71.243.133","url":"http://httpbin.org/post"}

不像在urllib中那样,需要转码等操作,方便了很多,还能在post中继续添加headers 

响应

response一些常用的属性:

response.status_code

response.headers

response.cookies

response.url

response.history

状态码的判断:

 不同的状态码对应 

import requests

response = requests.get('http://httpbin.org/get.html')
exit() if not response.status_code ==requests.codes.not_found else print('404 not found')
#或者这句替换为
exit() if not response.status_code ==200 else print('404 not found')
#因为不同的状态对应着不同的数字
输出结果为:
404 not found

requests的一些高级操作 

文件上传;

import requests

url = 'http://httpbin.org/post'
file = {'file':open('tt.jpeg','rb')}
response = requests.post(url,files = file)
print(response.text)

  

获取cookie

import requests

response = requests.get('https://www.baidu.com')
print(response.cookies)
print(type(response.cookies))

Cookie 的返回对象为 RequestsCookieJar,它的行为和字典类似,将其key,value打印出来

import requests

response = requests.get('https://www.baidu.com')
print(response.cookies)
# print(type(response.cookies))

for key,value in response.cookies.items():
    print(key + '=' + value)
输出结果为:

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315

会话维持:

import requests

requests.get('http://httpbin.org/cookies/set/number/12345678')#行1
response = requests.get('http://httpbin.org/cookies')#行2
print(response.text)
输出结果:{"cookies":{}}
在http://httpbin.org/cookies中有一个set可以设置cookie
通过get拿到这个cookie
但是输出结果为空,原因是行1 和 行2 的两次get在两个浏览器中进行

 

import requests

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/12345678')
response = s.get('http://httpbin.org/cookies')
print(response.text)
输出结果为:{"cookies":{"number":"12345678"}}

证书验证:

import requests

response = requests.get('https://www.12306.cn')
print(response.status_code)
输出结果为:
......
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.12306.cn', port=443): Max retries exceeded with url: / (Caused by SSLError(CertificateError("hostname 'www.12306.cn' doesn't match either of 'webssl.chinanetcenter.com', 'i.l.inmobicdn.net', '*.fn-mart.com', 'www.1zhe.com', 'appcdn.liwusj.com', 'static.liwusj.com', 'download.liwusj.com', 'ptlogin.liwusj.com', 'app.liwusj.com', '*.pinganfang.com', '*.anhouse.com', 'dl.jphbpk.gxpan.cn', 'dl.givingtales.gxpan.cn', 'dl.toyblast.gxpan.cn', 'dl.sds.gxpan.cn', 'yxhhd.5054399.com', 'download.ctrip.com', 'mh.tiancity.com', 'yxhhd2.5054399.com', 'app.4399.cn', 'i.4399.cn', 'm.4399.cn', 'a.4399.cn', 'newsimg.5054399.com', 'cdn.hxjyios.iwan4399.com', 'ios.hxjy.iwan4399.com', 'gjzx.gjzq.com.cn', 'f.3000test.com', 'tj.img4399.com', 'vedio.5054399.com', '*.zhe800.com', '*.qiyipic.com', '*.vxinyou.com', '*.gdjh.vxinyou.com', '*.3000.com', 'pay.game2.cn', 'static1.j.cn', 'static2.j.cn', 'static3.j.cn', 'static4.j.cn', 'video1.j.cn', 'video2.j.cn', 'video3.j.cn', 'online.j.cn', 'playback.live.j.cn', 'audio1.guang.j.cn', 'audio2.guang.j.cn', 'audio3.guang.j.cn', 'img1.guang.j.cn', 'img2.guang.j.cn', 'img3.guang.j.cn', 'img4.guang.j.cn', 'img5.guang.j.cn', 'img6.guang.j.cn', '*.4399youpai.com', 'v.3304399.net', 'w.tancdn.com', '*.3000api.com', 'static11.j.cn', '*.kuyinyun.com', '*.kuyin123.com', '*.diyring.cc', '3000test.com', '*.3000test.com', 'hdimg.5054399.com', 'www.3387.com', 'bbs.4399.cn', '*.cankaoxiaoxi.com', '*.service.kugou.com', 'test.macauslot.com', 'testm.macauslot.com', 'testtran.macauslot.com', 'xiuxiu.huodong.meitu.com', '*.meitu.com', '*.meitudata.com', '*.wheetalk.com', '*.shanliaoapp.com', 'xiuxiu.web.meitu.com', 'api.account.meitu.com', 'open.web.meitu.com', 'id.api.meitu.com', 'api.makeup.meitu.com', 'im.live.meipai.com', '*.meipai.com', 'm.macauslot.com', 'www.macauslot.com', 'web.macauslot.com', 'translation.macauslot.com', 'img1.homekoocdn.com', 'cdn.homekoocdn.com', 'cdn1.homekoocdn.com', 'cdn2.homekoocdn.com', 'cdn3.homekoocdn.com', 'cdn4.homekoocdn.com', 'img.homekoocdn.com', 'img2.homekoocdn.com', 'img3.homekoocdn.com', 'img4.homekoocdn.com', '*.macauslot.com', '*.samsungapps.com', 'auto.tancdn.com', '*.winbo.top', 'static.bst.meitu.com', 'api.xiuxiu.meitu.com', 'api.photo.meituyun.com', 'h5.selfiecity.meitu.com', 'api.selfiecity.meitu.com', 'h5.beautymaster.meiyan.com', 'api.beautymaster.meiyan.com', 'www.yawenb.com', 'm.yawenb.com', 'www.biqugg.com', 'www.dawenxue.net', 'cpg.meitubase.com', 'www.qushuba.com', 'www.ranwena.com', 'www.u8xsw.com', '*.4399sy.com', 'ms.qaqact.cn', 'ms.awqsaged.cn', 'fanxing2.kugou.com', 'fanxing.kugou.com', 'sso.56.com', 'upload.qf.56.com', 'sso.qianfan.tv', 'cdn.danmu.56.com', 'www-ppd.hermes.cn', 'www-uat.hermes.cn', 'www-ts2.hermes.cn', 'www-tst.hermes.cn', '*.syyx.com', 'img.wgeqr.cn', 'img.wgewa.cn', 'img.09mk.cn', 'img.85nh.cn', '*.zhuoquapp.com', 'img.dtmpekda8.cn', 'img.etmpekda6.cn'",),))
import requests

response = requests.get('https://www.12306.cn',verify = False)
print(response.status_code)
输出结果为:

D:python-3.5.4.amd64python.exe E:/PythonProject/Test1/爬虫/requests模块.py
D:python-3.5.4.amd64libsite-packagesurllib3connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
200

.。。。

代理设置

代理类型为http或者https时

import requests

proxies = {
    'http':'http://127.0.0.1:9743',
    'https':'https://127.0.0.1:9743'
}
#声明一个字典,指定代理,请求时把代理传过去就可以了,比urllib方便了很多 #如果代理有密码,在声明的时候,比如:
#proxies = {
#    'http':'http://user:password@127.0.0.1:9743',
#}
#按照如上修改就可以了
response = requests.get('https://www.taobao.com',proxies = proxies) 
print(response.status_code)  

代理类型为socks时:pip3 install request[socks]


proxies = {
    'http':'socks5://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)  

超时设置:

response = requests.get('http://www.baidu.com',timeout = 1)  

认证设置 

有的密码需要登陆认证,这时可以利用auth这个参数:

import requests
from requests.auth import  HTTPBasicAuth

r = requests.get('http://120.27.34.24:900',auth = HTTPBasicAuth('user','password'))
#r = requests.get('http://120.27.34.24:900',auth=('user','password'))这样写也可以
print(r.status_code)

异常处理:

import requests
from requests.exceptions import ReadTimeout,HTTPError,RequestException

try:
    response = requests.get('http://www.baidu.com',timeout = 1)
    print(response.status_code)
except ReadTimeout:
    print('timeout')
except HTTPError:
    print('httrerror')
except RequestException:
    print('error')  

Requests库详解第1张 例程只引入了三个异常,官方文档里还有别的异常,见上图,也可以引入,跟例程中的三个异常操作相似 

  

  

 

  

免责声明:文章转载自《Requests库详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用新版Android Studio检测内存泄露和性能Linux下如何批量转码iconv下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C-Lodop的https扩展版,火狐下添加例外

LODOP综合版里的c-lodop是标准版,没有https和广域网打印功能,如果使用了标准版,调试JS的时候会提示,,loaded over HTTPS,,,the content must be serverd over HTTPS,,,之类的错误。https网站需要安装https扩展版,安装https(32位c-lodop扩展版)版后,也要修改Lodo...

携程apollo配置中心部署与应用历程

本文只讲述记录公司apollo的部署和应用,前期apollo架构原理请自行查阅不再赘述 https://blog.csdn.net/u014225733/article/details/102694884 https://blog.csdn.net/xp_zyl/article/details/82111702?utm_medium=distribute....

淘宝NPM源的使用

npm作为国外的node仓库安装工具,自然会受到我大长城防火墙的干扰,国内用户在安装相关的资源的时候,会出现安装失败,以及速度很慢的情况。为了解决npm安装的问题,国内出现了很多npm的镜像网址,taobao的npm镜像算是使用频率比较高的了。 使用的方法我知道的有三种,首先是淘宝npm自己提供的两种:   1)你可以使用我们定制的 cnpm (gzip...

flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法 --

请求钩子: 当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数。这些请求钩子使用装饰器实现,通过程序实例app调用,以 before_request钩子为例(请求之前),当你对一个函数附加了app.before_request装饰器后,就会将这个函数注册为before_reque...

服务器使用Gzip压缩数据,加快网络传输(Java 例子)

The next version of the Project will provide support for gzip in order to faster speed of data transmission on the network。在我们的项目中,添加对gzip的支持,是为了加快数据在网络中的传输速度。If you need to trans...

SuperSocket 2.0 发布第一个预览版, 另寻找Yang Fan哥哥

昨天,SuperSocket的作者发布了2.0版本的第一个预览版。SuperSocket 2.0 是一个经过全新设计的,第一个完全基于.NET Core的版本。作者正在积极尝试提供更简单易用的API的同时,尽量保证与老版本相似的原汁原味的开发体验。新的版本中亦删除了一些不太重要并且已有更好的替代实现的功能,例如服务器宿主。 时隔三年之后再次发布新的版本,意...