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之折腾一下目录
Oct 24 Python
Python fileinput模块使用实例
Jun 03 Python
python实现校园网自动登录的示例讲解
Apr 22 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
对Django url的几种使用方式详解
Aug 06 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
Python 线程池用法简单示例
Oct 02 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 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与XML联手进行网站编程代码实例
2008/07/10 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
php数组分页实现方法
2016/04/30 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
Python实现KNN邻近算法
2021/01/28 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
浅谈Python类中的self到底是干啥的
2019/11/11 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
如何解决安装python3.6.1失败
2020/07/01 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
自考生毕业自我鉴定
2013/10/10 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
我的长生果教学反思
2014/04/28 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
质量保证书格式
2015/02/27 职场文书
复试通知单模板
2015/04/24 职场文书
药房管理制度范本
2015/08/06 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
numpy数据类型dtype转换实现
2021/04/24 Python