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中编写ORM框架的入门指引
Apr 29 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 Python
基于并发服务器几种实现方法(总结)
Dec 29 Python
Python 字符串与二进制串的相互转换示例
Jul 23 Python
Python闭包思想与用法浅析
Dec 27 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
python+gdal+遥感图像拼接(mosaic)的实例
Mar 10 Python
Django-simple-captcha验证码包使用方法详解
Nov 28 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 Python
Python可视化学习之seaborn调色盘
Feb 24 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
PHP4之COOKIE支持详解
2006/10/09 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
javascript 全角转换实现代码
2009/07/17 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
vue生命周期的探索
2019/04/03 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
python使用多线程不断刷新网页的方法
2015/03/31 Python
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
机械工程师求职自我评价
2013/09/23 职场文书
户外拓展活动方案
2014/02/11 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
保护环境的宣传语
2015/07/13 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技