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 流程控制实例代码
Sep 25 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
Python卸载模块的方法汇总
Jun 07 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
python实现机器学习之多元线性回归
Sep 06 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
详解Python 中的 defaultdict 数据类型
Feb 22 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
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
js返回上一页并刷新代码整理
2012/12/21 Javascript
对比分析json及XML
2014/11/28 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
vue中img src 动态加载本地json的图片路径写法
2019/04/25 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
Python中的异常处理学习笔记
2015/01/28 Python
Python实现基本线性数据结构
2016/08/22 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
详解Python的三种拷贝方式
2020/02/11 Python
Keras 使用 Lambda层详解
2020/06/10 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
优秀求职自荐信怎样写
2013/12/18 职场文书
心理健康心得体会
2014/01/02 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
法定代表人资格证明书
2015/06/18 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
话题作文之自信作文
2019/11/15 职场文书
基于PyQt5制作一个群发邮件工具
2022/04/08 Python