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基于smtplib实现异步发送邮件服务
May 28 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
Python对List中的元素排序的方法
Apr 01 Python
使用python 3实现发送邮件功能
Jun 15 Python
Python字符串的全排列算法实例详解
Jan 07 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
Aug 23 Python
python修改文件内容的3种方法详解
Nov 15 Python
python实现XML解析的方法解析
Nov 16 Python
一文详述 Python 中的 property 语法
Sep 01 Python
Python初学者必备的文件读写指南
Jun 23 Python
深入浅析Django MTV模式
Sep 04 Python
python神经网络Xception模型
May 06 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
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
php递归列出所有文件和目录的代码
2008/09/10 PHP
php中显示数组与对象的实现代码
2011/04/18 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
vue百度地图 + 定位的详解
2019/05/13 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
Python基于locals返回作用域字典
2020/10/17 Python
用python计算文件的MD5值
2020/12/23 Python
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
技术学校毕业生求职信分享
2013/12/02 职场文书
校本教研工作制度
2014/01/22 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
自我评价优缺点范文
2015/03/11 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
单位考核鉴定意见
2015/06/05 职场文书
2016十一国庆节感言
2015/12/09 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书