目录

requests模块的response.text与response.content有什么区别

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语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。

一站式研发项目管理平台 PingCode

一站式研发项目管理平台 PingCode

支持敏捷\瀑布、知识库、迭代计划&跟踪、需求、缺陷、测试管理,同时满足非研发团队的流程规划、项目管理和在线办公需要。