• 认真地记录技术中遇到的坑!
  • 能摸鱼真是太好啦!嘿嘿嘿!

Python requests网络请求基本用法

Python 悠悠 5年前 (2017-08-02) 4398次浏览 0个评论

本文总结Python中最常用的网络请求库requests的基本用法已经一些常见问题的解决方法,包括请求发送,请求参数,响应解析和处理,cookie,代理等内容,更多内容可以参考官网文档

安装和引入

可以直接使用pip安装即可:pip install requests。然后引入发送一个get请求:

import requests
response = requests.get('http://uusama.com')

发送请求

不同的请求方式

import requests

response = requests.get('http://uusama.com')   # get 请求
response = requests.post('http://uusama.com')  # post 请求
response = requests.put('http://uusama.com')   # put 请求
response = requests.delete('http://uusama.com')# delete 请求
response = requests.head('http://uusama.com')  # head 请求

自定义请求头部

通过指定headers参数可以设置请求头信息,headers一般传入一个字典dict类型。

url = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}  # 定义 User-Agent 请求头部

response = requests.get(url, headers=headers)

请求参数

请求参数有三种方式传递:

  1. 直接将参数拼接在url后面
  2. 使用params参数传入,相当于GET请求url后面的参数
  3. 使用data参数传入,相当于POST请求的body

示例如下:

# 在url中拼接参数
response = requests.get('http://uusama.com?key1=value1&key2=value2')

# 传入 params 参数,params 参数是一个字符串字典
params = {'key1' : 'value1', 'key2' : 'value2'}
response = requests.get('http://uusama.com', params=params)  

# 传入 data参数,data 参数可以为一个元组
data = (('key1', 'value1'), ('key1', 'value2'))
response = requests.post('http://uusama.com', data=data)

# json请求,2.4.2版本以后可以直接使用`json=True`参数表示json请求,否则需要手动指定headers
data = {"key1": "value1", "key2": "value2"}
headers = {'content-type': 'application/json'}
requests.post(url, params=params, data=json.dumps(data), headers=headers)

响应解析

requests会基于请求头中的编码信息进行自动解码,通过指定response.encoding属性值来设置指定的编码方式,response.text的值会使用最新的response.encoding进行解码,自动进行gzip的解压缩,不过有时需要手动解压缩。

  • response.content: 以字节的方式访问请求响应体,这样可以处理图片等数据
  • response.json(): 可以处理 json 格式返回数据
  • response.status_code: 获取响应状态码
  • response.headers: 查看以字典形式展示的服务器响应头,这个字典大小写不敏感
  • response.cookie: 获取响应的cookie
  • response.history: 获取重定向历史, Response对象的列表,这个对象列表按照从最老到最近的请求进行排序
  • 通过设置请求参数: stream=True,使用response.raw可以获取原始套接字响应
response = requests.get('http://uusama.com/wp-content/uploads/2017/07/2017072902480345.jpg')
from PIL import Image
from io import BytesIO
image = Image.open(BytesIO(response.content))  # 使用字节处理图像

response.raw.read(10) # 读取 10 个套接字字符
# 使用 iter_content 来处理流数据
with open(filename, 'wb') as fd:
   for chunk in r.iter_content(chunk_size):
   fd.write(chunk)

会话对象

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。任何你传递给请求方法的字典都会与已设置会话层数据合并。方法层的参数覆盖会话的参数。

不过需要注意,就算使用了会话,方法级别的参数也不会被跨请求保持。

s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'

# 会话也可用来为请求方法提供缺省数据。这是通过为会话对象的属性提供数据来实现的:
s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})
# both 'x-test' and 'x-test2' are sent
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})

# 面的例子只会和第一个请求发送 cookie ,而非第二个
s = requests.Session()
r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'
r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'

代理

通过指定proxies参数来设置代理,也可以通过环境变量HTTP_PROXYHTTPS_PROXY来配置代理。

import requests

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://user:password@10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)

# 命令行
# export HTTP_PROXY="http://10.10.1.10:1080"
# export HTTPS_PROXY="http://10.10.1.10:1080"

喜欢 (4)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址