requests模块

编写requests模块是因为Python的urllib模块用起来太复杂。

使用举例

快速上手requests,参考中文文档

发起请求

发起GET请求直接使用requestsget方法即可。例如下面的代码获取百度首页的信息:

import requests

baidu_url = 'https://www.baidu.com'

response = requests.get(baidu_url)
print(response.content.decode())

如果要在URL上附加参数,使用params参数传入字典即可,参数会自动附加到URL上,列表参数也会正确的附加:

base_url = 'http://httpbin.org/'

params = {
    'name': 'yitian',
    'age': 22,
    'friends': ['zhang3', 'li4']
}

response = requests.get(f'{base_url}get', params=params)
print(response.url)

结果:

http://httpbin.org/get?name=yitian&age=22&friends=zhang3&friends=li4

其他常用的HTTP操作例如PUT、DELETE、HEAD、OPTIONS等也支持,调用相应方法即可。

获取结果

发起请求之后,返回值是一个Response对象,利用它我们可以方便的获取结果。

Response对象的常用属性和方法如下:

属性名 结果
text HTTP字符
encoding 响应编码,这个值可以改变,改变之后text属性也会根据编码而变化
content 未编码的二进制数据
json() 返回JSON数据
raw 结果的原始字节流
url 请求的URL
status_code 状态码
headers 请求头字典
cookies cookies字典
history 如果发生重定向,所有请求对象都会保存到这里

自定义header

如果要在请求上添加请求头,也非常简单。有些网站对客户端的限制比较严格,所以我们必须伪装header

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}

response = requests.get('http://httpbin.org/get', headers=headers)
print(response.text)

假如使用自带的urllib标准库,那么代码就比较复杂了。从这里我们可以看到requests确实非常方便。

import urllib.request

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}

request = urllib.request.Request(baidu_url, headers=headers)
html = urllib.request.urlopen(request).read().decode()
print(html)

POST数据

如果我们要发送复杂的表单,就需要POST数据了。和GET传送数据一样,向方法中额外添加一个data参数。

data = {
    'name': 'yitian',
    'age': 22,
    'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=data)
print(response.text)

有时候POST数据不是使用表单方式,而是直接在请求体中附加参数。那么我们在发送参数的时候不能向data参数添加字典了,而应该传递字符串。

import json

data = {
    'name': 'yitian',
    'age': 22,
    'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=json.dumps(data))
print(response.text)

有些程序(例如Github的API)需要将JSON字符串直接当做请求体发送,比如说上面这种将字典转换为JSON的例子。在这种情况下,我们可以直接将字典的引用传递给方法的json参数,这样就不需要我们手动转换,requests会自动转换。

response = requests.post(f'{base_url}post', json=data)

上传文件

在网页上,上传头像等操作都需要上传multipart/form-data类型的表单。使用requests也非常简单。需要注意打开文件的时候最好使用二进制模式,使用文本模式打开文件可能导致requests不能正确计算文件的大小。

file = open(r'c:\Windows\System32\drivers\etc\hosts', mode='rb')

data = {
    'file': file
}

response = requests.post(f'{base_url}post', files=data)
print(response.text)

cookies

如果要获取响应的cookies,调用cookies属性即可,它会返回一个RequestsCookieJar对象,它实现了标准库的http.cookiejar。所以我们可以按照cookiejar的方法来使用RequestsCookieJar。比如说访问百度的时候,它会分配一个cookie,所以我们可以使用下面的代码获取Cookie

response = requests.get(baidu_url)
print(response.cookies)

如果要在发送数据的时候向服务器传递cookie,需要实例化一个RequestsCookieJar,然后传递给发送方法的cookies参数。

import requests.cookies

cookies = requests.cookies.RequestsCookieJar()
cookies.set('name', 'yitian')
response = requests.get(f'{base_url}cookies', cookies=cookies)
print(response.text)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Requests模块是一个用于网络访问的模块,其实类似的模块有很多,比如urllib,urllib2,httpli...
    Lucas_Wong阅读 20,604评论 1 57
  • 一、安装Requests pip install requests 二、发送请求与传递参数 带参数请求: impo...
    zksmile阅读 668评论 0 2
  • requests是使用Python语言编写的第三方网络请求库,其用法相较于urllib更加方便,可以节省大量的开发...
    henYee阅读 598评论 0 0
  • Requests: 让 HTTP 服务人类 虽然Python的标准库中 urllib2 模块已经包含了平常我们使用...
    彡廿阅读 649评论 0 1
  • Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的...
    _JYN_阅读 800评论 0 4

友情链接更多精彩内容