python爬虫之urllib3的使用示例


Posted in Python onJuly 09, 2018

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库urllib里所没有的重要特性:

  1. 线程安全
  2. 连接池
  3. 客户端SSL/TLS验证
  4. 文件分部编码上传
  5. 协助处理重复请求和HTTP重定位
  6. 支持压缩编码
  7. 支持HTTP和SOCKS代理

一、get请求

urllib3主要使用连接池进行网络请求的访问,所以访问之前我们需要创建一个连接池对象,如下所示:

import urllib3

url = "http://httpbin.org"
http = urllib3.PoolManager();
r = http.request('GET',url+"/get")
print(r.data.decode())
print(r.status)

带参数的get
r = http.request('get','http://www.baidu.com/s',fields={'wd':'周杰伦'})
print(r.data.decode())

经查看源码:

def request(self, method, url, fields=None, headers=None, **urlopen_kw):
  • 第一个参数method 必选,指定是什么请求,'get'、'GET'、'POST'、'post'、'PUT'、'DELETE'等,不区分大小写。
  • 第二个参数url,必选
  • 第三个参数fields,请求的参数,可选
  • 第四个参数headers 可选

request请求的返回值是<urllib3.response.HTTPResponse object at 0x000001B3879440B8>

我们可以通过dir()查看其所有的属性和方法。

dir(r)

直截取了一部分

#'data', 'decode_content', 'enforce_content_length', 'fileno', 'flush', 'from_httplib',
# 'get_redirect_location', 'getheader', 'getheaders', 'headers', 'info', 'isatty',
# 'length_remaining', 'read', 'read_chunked', 'readable', 'readinto', 'readline',
# 'readlines', 'reason', 'release_conn', 'retries', 'seek', 'seekable', 'status',
# 'stream', 'strict', 'supports_chunked_reads', 'tell', 'truncate', 'version', 'writable',
# 'writelines']

二、post请求

import urllib3
url = "http://httpbin.org"
fields = {
  'name':'xfy'
}
http = urllib3.PoolManager()
r = http.request('post',url+"/post",fields=fields)
print(r.data.decode())

可以看到很简单,只是第一个参数get换成了post。

并且参数不需要再像urllib一样转换成byte型了。

三、设置headers

import urllib3
headers = {
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
}
http = urllib3.PoolManager();
r = http.request('get',url+"/get",headers = headers)
print(r.data.decode())

四、设置代理

import urllib3
url = "http://httpbin.org"
headers = {
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
}
proxy = urllib3.ProxyManager('http://101.236.19.165:8866',headers = headers)
r = proxy.request('get',url+"/ip")
print(r.data.decode())

五、当请求的参数为json

在发起请求时,可以通过定义body 参数并定义headers的Content-Type参数来发送一个已经过编译的JSON数据

import urllib3
url = "http://httpbin.org"
import json
data = {'name':'徐繁韵'}

json_data = json.dumps(data)

http = urllib3.PoolManager()
r = http.request('post',url+"/post",body = json_data,headers = {'Content-Type':'application/json'})
print(r.data.decode('unicode_escape'))

六、上传文件

#元组形式
with open('a.html','rb') as f:
  data = f.read()
http = urllib3.PoolManager()
r = http.request('post','http://httpbin.org/post',fields = {'filefield':('a.html',data,'text/plain')})
print(r.data.decode())

#二进制形式

r = http.request('post','http://httpbin.org/post',body = data,headers={'Content-Type':'image/jpeg'})
print(r.data.decode())

七、超时设置

# 1全局设置超时
# http = urllib3.PoolManager(timeout = 3)
# 2在request里设置
# http.request('post','http://httpbin.org/post',timeout = 3)

八、重试和重定向

import urllib3
http = urllib3.PoolManager()
#重试
r = http.request('post','http://httpbin.org/post',retries = 5) #请求重试测次数为5次 ,默认为3ci
print(r.retries) #Retry(total=5, connect=None, read=None, redirect=0, status=None)
#关闭重试
http.request('post','http://httpbin.org/post',retries = False) #请求重试测次数为5次 ,默认为3ci

r = http.request('get','http://httpbin.org/redirect/1',redirect = False)
print(r.retries)# Retry(total=3, connect=None, read=None, redirect=None, status=None)
print(r.status)
print(r.data.decode())
print("--------------------")
print(r.get_redirect_location())
#302不是异常

九、urllib3 本身设置了https的处理,但是有警告

虽然可以请求,但是报如下警告:

InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)

禁用警告:

import urllib3
urllib3.disable_warnings() #禁用各种警告
url = "https://www.12306.cn/mormhweb/"
http = urllib3.PoolManager()
r = http.request('get',url)
print(r.data.decode())

urllib3很强大,但是并没有requests好用。了解为主。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之序列详解
Aug 29 Python
最基础的Python的socket编程入门教程
Apr 23 Python
Python fileinput模块使用实例
Jun 03 Python
Python深度优先算法生成迷宫
Jan 22 Python
关于Python的一些学习总结
May 25 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
Django框架模板的使用方法示例
May 25 Python
python设置随机种子实例讲解
Sep 12 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 #Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 #Python
Python 16进制与中文相互转换的实现方法
Jul 09 #Python
python 文件转成16进制数组的实例
Jul 09 #Python
使用Python读取二进制文件的实例讲解
Jul 09 #Python
Python实现随机漫步功能
Jul 09 #Python
Python2包含中文报错的解决方法
Jul 09 #Python
You might like
自己动手做一个SQL解释器
2006/10/09 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
js AspxButton的客户端操作
2009/06/26 Javascript
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
python根据出生日期返回年龄的方法
2015/03/26 Python
在Django的session中使用User对象的方法
2015/07/23 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
Python 迭代器工具包【推荐】
2016/05/06 Python
python实现逻辑回归的方法示例
2017/05/02 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
Python聊天室程序(基础版)
2018/04/01 Python
Python中的 enum 模块源码详析
2019/01/09 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
成人高等教育毕业生自我鉴定
2013/10/22 职场文书
酒店节能降耗方案
2014/05/08 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL