创建请求
import urllib3
# 创建PoolManager 实例来处理http请求, 该poolmanager处理所有的连接池细节和线程安全事宜.
http = urllib3.PoolManager()
# request()返回一个HTTPResponse对象 .
r = http.request('GET', 'http://httpbin.org/robots.txt')
处理响应内容 Response content
HTTPResponse对象提供 status、data 和 header属性。
json内容
data属性可以被转换为json对象 :
>>> import json
>>> r = http.request('GET', 'http://httpbin.org/ip')
>>> json.loads(r.data.decode('utf-8'))
{'origin': '127.0.0.1'}
http.request( method , url, fileds, headers , **kw)
cookie 设置 :
cookie 设置在headers中 , 如:
headers = {
'Cookie': 'JSESSIONID=scc7mqk00akn1jw6ih80la6re'
}
代理设置
直接使用 ProxyManager
>>> import urllib3
>>> proxy = urllib3.ProxyManager('http://localhost:3128/')
>>> proxy.request('GET', 'http://google.com/')
ProxyManager的使用同PoolManager .
SOCKS4 SOCKS5 代理
使用SOCKSProxyManager 来使用SOCKS代理.
需要安装 PySocks 或 安装带socks的urllib3 , pip install urllib3[socks]
>>> from urllib3.contrib.socks import SOCKSProxyManager
>>> proxy = SOCKSProxyManager('socks5://localhost:8889/')
>>> proxy.request('GET', 'http://google.com/')
查询参数
- 使用 GET HEAD DELETE请求方法时, 直接将参数以字典的形式传递给fields:
>>> r = http.request(
... 'GET',
... 'http://httpbin.org/get',
... fields={'arg': 'value'})
>>> json.loads(r.data.decode('utf-8'))['args']
{'arg': 'value'}
- 对于POST PUT请求, 需要手工的将查询参数编码为URL:
>>> from urllib.parse import urlencode
>>> encoded_args = urlencode({'arg': 'value'})
>>> url = 'http://httpbin.org/post?' + encoded_args
>>> r = http.request('POST', url)
>>> json.loads(r.data.decode('utf-8'))['args']
{'arg': 'value'}
表单数据
对于POST ,PUT请求, urllib3会自动对字典数据进行form-encode .
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... fields={'field': 'value'})
>>> json.loads(r.data.decode('utf-8'))['form']
{'field': 'value'}
JSON
当使用json数据时, 需要指定headers的 Content-Type 为 application/json , 然后将dict编码为json格式放到body字段:
>>> import json
>>> data = {'attribute': 'value'}
>>> encoded_data = json.dumps(data).encode('utf-8')
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... body=encoded_data,
... headers={'Content-Type': 'application/json'})
>>> json.loads(r.data.decode('utf-8'))['json']
{'attribute': 'value'}
文件 或二进制数据
- 当上传文件时, 使用multipart/form-data , 需要在上面上传表单数据的基础上加上(file_name, file_data) 元祖:
>>> with open('example.txt') as fp:
... file_data = fp.read()
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... fields={
... 'filefield': ('example.txt', file_data),
... })
>>> json.loads(r.data.decode('utf-8'))['files']
{'filefield': '...'}
注意: 指定filenname 并不是必须的, 是浏览器建议使用的. 可以在元组中指定文件的MIME类型 .
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... fields={
... 'filefield': ('example.txt', file_data, 'text/plain'),
... })
- 上传二进制数据 , 传递body参数 ,同时指定content-type
>>> with open('example.jpg', 'rb') as fp:
... binary_data = fp.read()
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... body=binary_data,
... headers={'Content-Type': 'image/jpeg'})
>>> json.loads(r.data.decode('utf-8'))['data']
b'...'