Python中的urllib模块使用详解


Posted in Python onJuly 07, 2015

urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据。每当使用这个模块的时候,老是会想起公司产品的客户端,同事用C++下载Web上的图片,那种“痛苦”的表情。我以前翻译过libcurl教程,这是在C/C++环境下比较方便实用的网络操作库,相比起libcurl,Python的urllib模块的使用门槛则低多了。可能有些人又会用效率来批评Python,其实在操作网络,或者在集群交互的时候, 语言的执行效率绝不是瓶颈。这种情况下,一个比较好的方法是,将python嵌入到C/C++中,让Python来完成一些不是核心的逻辑处理。又扯远了,废话少说,开始urllib之旅吧~~ (前几天我用这个模块写了个蜘蛛,感兴趣的同学可以在以前的博客中找到代码)

先看一个例子,这个例子把Google首页的html抓取下来并显示在控制台上:

# 别惊讶,整个程序确实只用了两行代码
import urllib
print urllib.urlopen('http://www.google.com').read()

urllib.urlopen(url[, data[, proxies]]) :

创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径,一般是网址;参数data表示以post方式提交到url的数据(玩过web的人应该知道提交数据的两种方式:post与get。如果你不清楚,也不必太在意,一般情况下很少用到这个参数);参数proxies用于设置代理(这里不详细讲怎么使用代理,感兴趣的看客可以去翻阅Python手册urllib模块)。urlopen返回 一个类文件对象,他提供了如下方法:

  •         read() , readline() , readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样;
  •         info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息;
  •         getcode():返回Http状态码。如果是http请求,200表示请求成功完成;404表示网址未找到;
  •         geturl():返回请求的url;

下面来扩充一下上面的例子,看官可以运行一下这个例子,加深对urllib的印象:

google = urllib.urlopen('http://www.google.com')
print 'http header:/n', google.info()
print 'http status:', google.getcode()
print 'url:', google.geturl()
for line in google: # 就像在操作本地文件
  print line,
google.close()

urllib.urlretrieve(url[, filename[, reporthook[, data]]]):

urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来显示当前的下载进度,下面的例子会展示。参数data指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。下面通过例子来演示一下这个方法的使用,这个例子将新浪首页的html抓取到本地,保存在D:/sina.html文件中,同时显示下载的进度。

def cbk(a, b, c):
  '''回调函数
  @a: 已经下载的数据块
  @b: 数据块的大小
  @c: 远程文件的大小
  '''
  per = 100.0 * a * b / c
  if per > 100:
    per = 100
  print '%.2f%%' % per

url = 'http://www.sina.com.cn'
local = 'd://sina.html'
urllib.urlretrieve(url, local, cbk)

上面介绍的两个方法是urllib中最常用的方法,这些方法在获取远程数据的时候,内部会使用URLopener或者 FancyURLOpener类。作为urllib的使用者,我们很少会用到这两个类,这里我不想多讲。如果对urllib的实现感兴趣, 或者希望urllib支持更多的协议,可以研究这两个类。在Python手册中,urllib的作者还列出了这个模块的缺陷和不足,感兴趣的同学可以打开 Python手册了解一下。

urllib中还提供了一些辅助方法,用于对url进行编码、解码。url中是不能出现一些特殊的符号的,有些符号有特殊的用途。我们知道以get方式提交数据的时候,会在url中添加key=value这样的字符串,所以在value中是不允许有'=',因此要对其进行编码;与此同时服务器接收到这些参数的时候,要进行解码,还原成原始的数据。这个时候,这些辅助方法会很有用:

  •     urllib.quote(string[, safe]):对字符串进行编码。参数safe指定了不需要编码的字符;
  •     urllib.unquote(string) :对字符串进行解码;
  •     urllib.quote_plus(string [ , safe ] ) :与urllib.quote类似,但这个方法用'+'来替换' ‘,而quote用'%20′来代替' ‘
  •     urllib.unquote_plus(string ) :对字符串进行解码;
  •     urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{‘name': ‘dark-bull', ‘age': 200}将被转换为”name=dark-bull&age=200″
  •     urllib.pathname2url(path):将本地路径转换成url路径;

    urllib.url2pathname(path):将url路径转换成本地路径;

用一个例子来体验一下这些方法吧~~:

data = 'name = ~a+3'

data1 = urllib.quote(data)
print data1 # result: name%20%3D%20%7Ea%2B3
print urllib.unquote(data1) # result: name = ~a+3

data2 = urllib.quote_plus(data)
print data2 # result: name+%3D+%7Ea%2B3
print urllib.unquote_plus(data2)  # result: name = ~a+3

data3 = urllib.urlencode({ 'name': 'dark-bull', 'age': 200 })
print data3 # result: age=200&name=dark-bull

data4 = urllib.pathname2url(r'd:/a/b/c/23.php')
print data4 # result: ///D|/a/b/c/23.php
print urllib.url2pathname(data4)  # result: D:/a/b/c/23.php

urllib模块的基本使用,就这么简单。oh~~yeah~~又一个模块写完了,想想,我已经写了将近30个模块了,有时间我要好好整理一下@@@@

Python 相关文章推荐
python通过索引遍历列表的方法
May 04 Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 Python
python机器学习之神经网络(二)
Dec 20 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
python获取栅格点和面值的实现
Mar 10 Python
Python内置异常类型全面汇总
May 28 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 Python
python爬虫筛选工作实例讲解
Nov 23 Python
python 高阶函数简单介绍
Feb 19 Python
Python实现图像几何变换
Jul 06 #Python
Python统计日志中每个IP出现次数的方法
Jul 06 #Python
python统计日志ip访问数的方法
Jul 06 #Python
python检查指定文件是否存在的方法
Jul 06 #Python
python转换字符串为摩尔斯电码的方法
Jul 06 #Python
python实现文件路径和url相互转换的方法
Jul 06 #Python
详解Python中的Cookie模块使用
Jul 06 #Python
You might like
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
轻松实现python搭建微信公众平台
2016/02/16 Python
python线程中同步锁详解
2018/04/27 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
Pytorch之contiguous的用法
2019/12/31 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
初中家长寄语
2014/04/02 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
初中生物教学反思
2016/02/20 职场文书