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处理json字符串转化为字典的简单实现
Jul 07 Python
Python爬虫之模拟知乎登录的方法教程
May 25 Python
python urllib urlopen()对象方法/代理的补充说明
Jun 29 Python
Python3学习笔记之列表方法示例详解
Oct 06 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
python 定时器,轮询定时器的实例
Feb 20 Python
python Tkinter版学生管理系统
Feb 20 Python
Python中的引用知识点总结
May 20 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
python线程里哪种模块比较适合
Aug 02 Python
M1芯片安装python3.9.1的实现
Feb 02 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 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
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
js实现开关灯效果
2020/03/30 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
Python中threading模块join函数用法实例分析
2015/06/04 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
python事件驱动event实现详解
2018/11/21 Python
django 消息框架 message使用详解
2019/07/22 Python
python+jinja2实现接口数据批量生成工具
2019/08/28 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
python中如何设置代码自动提示
2020/07/15 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
一套带答案的C++笔试题
2014/01/10 面试题
传播学毕业生求职信
2013/10/11 职场文书
四个太阳教学反思
2014/02/01 职场文书
消防安全宣传标语
2014/06/07 职场文书
放弃继承权公证书
2015/01/23 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
win10+anaconda安装yolov5的方法及问题解决方案
2021/04/29 Python