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 Web框架Flask信号机制(signals)介绍
Jan 01 Python
python开发之thread实现布朗运动的方法
Nov 11 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
Django框架使用mysql视图操作示例
May 15 Python
pytorch的batch normalize使用详解
Jan 15 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
pytorch MSELoss计算平均的实现方法
May 12 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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
php的access操作类
2008/04/09 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
js随机生成一个验证码
2017/06/01 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
wxpython 学习笔记 第一天
2009/03/16 Python
python自动化测试实例解析
2014/09/28 Python
Python中zfill()方法的使用教程
2015/05/20 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Python中常用的os操作汇总
2020/11/05 Python
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
学校招生宣传广告词
2014/03/19 职场文书
小组口号大全
2014/06/09 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫