urllib3

创建请求

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/')

查询参数

  1. 使用 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'}
  1. 对于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'}

文件 或二进制数据

  1. 当上传文件时, 使用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'),
...     })
  1. 上传二进制数据 , 传递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'...'

你可能感兴趣的:(urllib3)