requests模块的response.text与response.content的区别:1、返回的数据类型;2、数据编码;3、数据内容。返回的数据类型不同是指response.text返回的是一个 unicode 型的文本数据,response.content返回的是 bytes 型的二进制数据。
一、requests模块的response.text与response.content有什么区别
1、返回的数据类型
response.text返回的是一个 unicode 型的文本数据,适用于文本数据的爬取;response.content返回的是 bytes 型的二进制数据,适用于图片、文件的爬取。
2、数据编码
response.text默认”iso-8859-1”编码,服务器不指定的话是根据网页的响应来猜测编码;response.content 返回的是二进制响应内容。
3、数据内容
response.text返回的是Unicode型的文本数据,即服务器响应解码后得到的字符串;而response.content返回的是bytes类型的二进制数据。
二、Requests简介
1、requests库简介
Urllib 和 Requests 模块是发起 http 请求最常见的模块。虽然 Python 的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称“http for Humans”,说明使用更简洁方便。Requests继承了urllib的所有特性。Requests支持http连接保持和连接池,支持使用cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数 据自动编码。
**requests 的底层实现其实就是 urllib3(urllib2 的升级版—python2 支持) **Requests 的文档非常完备,中文文档也相当不错。Requests 能完全满足当前网络的需求, 支持 Python 2.6—3.6。
开源地址:http://github.com/kennethreitz/requests
中文文档 API:http://2.python-requests.org/zh_CN/latest/
2、安装方式
利用 pip 安装或者利用 easy_install 都可以完成安装:
$ pip install requests
三、Requests的简单使用
1、Get 请求
发送无参数的get请求,尝试获取某个网页。
r = requests.get('http://www.baidu.com')
发送无参数的get请求 设置超时时间 timeout 单位秒。
r = requests.get('http://www.baidu.com', timeout=1)
你也许经常想为 URL 的查询字符串(query string) 传递某种数据。如果你是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。例如, www.baidu.com/?key=val。 Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数。举例来说,如果你想传递 key1=value1 和 key2=value2 到 www.baidu.com/ ,那么你可以使用如下代码:
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("https://www.baidu.com/", params=payload)
print(r.url)
https://www.baidu.com/?key2=value2&key1=value1
你还可以将一个列表作为值传入。
payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
r = requests.get('http://www.baidu.com/', params=payload)
print(r.url)
http://www.baidu.com/?key2=value2&key2=value3&key1=value1
定制请求头:如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了。
url = 'https://www.baidu.com/s?wd=python'
headers = {
'Content-Type': 'text/html;charset=utf-8',
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
r = requests.get(url,headers=headers)
Response对象使用:
r.url #打印输出该 URL
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.status_code #返回连接状态,200正常。
r.text #默认以unicode形式返回网页内容,也就是网页源码的字符串。
r.content #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
r.json() #把网页中的json数据转成字典并将其返回。
r.encoding #获取当前的编码
r.encoding = 'ISO-8859-1' #指定编码,r.text返回的数据类型,写在r.text之前。
2、POST 请求
HTTP 协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式,服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括:
- 最常见post提交数据的方式,以form表单形式提交数据。
- 以json串提交数据。
- 一般使用来上传文件
实例如下:
以form形式发送post请求,Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。
payload = {'key1': 'value1',
'key2': 'value2'
}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
…
"form": {
"key1": "value1",
"key2": "value2"
},
以json形式发送post请求,可以将一 json串传给requests.post()的data参数。
url = 'http://httpbin.org/post'
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post(url, data=json.dumps(payload))
print(r.text)
print(r.headers.get('Content-Type'))
application/json
以multipart形式发送post请求,Requests也支持以multipart形式发送post请求,只需将一文件传给requests.post()的files参数即可,文本文件report.txt的内容只有一行:Hello world!,从请求的响应结果可以看到数据已上传到服务端中。
url = 'http://httpbin.org/post'
files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
print(r.text)
{
…
"files": {
"file": "hello world"
},
"form": {},
"headers": {
"Content-Type": "multipart/form-data; boundary=6db46af64e694661985109da21c8fe9b",
},
"json": null,
"origin": "223.72.217.138",
"url": "http://httpbin.org/post"
…
}
延伸阅读1:Python简介
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。