`
qepwqnp
  • 浏览: 108868 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Python模块学习 --- urllib

阅读更多

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-100-Days-master.zip

    《Python-100-Days-master.zip》是一个包含Python学习资源的压缩文件,旨在帮助初学者在100天内逐步掌握Python编程,从新手晋升为精通者。这个压缩包可能包含了从基础知识到高级概念的全面教程,是系统学习Python的...

    python-3.7.8-amd64.zip

    8. **内置模块更新**:许多内置模块如`os`, `json`, `datetime`, `urllib`等在3.7版本中都得到了更新和增强,提供了更多的功能和更好的性能。 9. **安全改进**:Python 3.7对SSL/TLS连接的安全性进行了升级,增加了...

    Python urllib urllib2 urllib模块安装说明

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要涉及Python中的urllib模块以及与之相关的urllib2模块的安装过程。尽管标题中提到了urllib模块,但是内容部分却展示了requests库的安装过程。因此...

    python urllib3

    Python的urllib3库是Python标准库urllib的第三方扩展,提供了一套强大的HTTP客户端功能。这个库在处理网络请求时,特别是在并发请求和管理连接池方面,具有很高的效率和灵活性。下面我们将深入探讨urllib3的核心概念...

    python-3.7.2-amd64

    64位版本的Python能够处理更大的内存和数据集,适合进行大数据分析、机器学习等高计算需求的任务。 在描述中提到,这是从官方渠道下载的安装文件,确保了软件的正版性和安全性。"不用去官网挪动"意味着用户无需亲自...

    Python urllib urllib模块

    Python的urllib模块是Python标准库中的一个重要组成部分,它为开发者提供了访问互联网资源的工具。urllib模块包含了多个子模块,如urlopen、urlretrieve、urlparse等,它们各自承担着不同的网络请求任务。在Python 3...

    python-3.9.2-amd64.rar

    Python的标准库包含大量模块,涵盖了网络通信、文件处理、系统操作、数据解析等多个领域。Python 3.9.2版本的库可能包含一些更新或增强的模块,以适应最新的技术需求。例如,HTTP客户端库(如urllib)可能会有改进,...

    python模块urllib3.zip

    使用Python 3.x版本运行py文件时报错 No module named 'urllib3' 一开始参照网上的安装方法通过pip来安装,未成功pip install urllib3 后面找到了这个文件,分享给大家。 使用方法是下载解压后,cmd里切换到解压...

    python-3.6.2-docs-pdf-a4

    Python 3.6.2 官方文档是一个详尽的资源,旨在帮助用户全面了解Python ...以上只是Python 3.6.2官方文档中部分关键知识点的概述,实际文档内容更为丰富,包含了更多细节和实例,是学习和掌握Python编程的宝贵资源。

    python官方3.9.6-amd64版本exe安装包

    Python的标准库非常强大,提供了许多内置模块,例如os用于操作系统接口,sys用于系统相关的功能,datetime处理日期和时间,json用于JSON数据的编码和解码,以及urllib和requests用于HTTP请求。除此之外,Python的第...

    The-Python-3-Standard-Library-by-Example.rar

    Python 3 标准库是 Python 编程语言的核心组成部分,包含了各种预定义的模块、类和函数,供开发者在编写程序时直接使用。这些工具覆盖了从基本数据类型到网络通信,再到操作系统接口的广泛领域。《The Python 3 ...

    python编程-模块组件-six-1.16.0.tar.gz

    1. **提供统一的API**:`six.moves`模块包含了一些在Python 2和3中位置不同的移动(例如`urllib`在2和3中的位置不同)。 2. **处理字串**:`six.text_type`可以替代`str`和`unicode`,以确保在任何Python版本中都能...

    Python爬虫基础教程-Urllib详解.pdf

    Python的Urllib库是进行网络数据获取的重要工具,尤其在编写爬虫程序时。它集成了多种处理URL的模块,方便开发者对网络资源进行...总的来说,掌握Urllib库是Python爬虫开发的基础,也是进一步深入学习网络编程的关键。

    python,python-networking-flow.rar

    在学习Python网络编程时,理解上述概念和技术是至关重要的。通过"networking_flow"这个主题,你可能会接触到如何建立网络连接、处理数据流、实现服务器和客户端的交互流程等内容。同时,实际的代码示例将帮助你更好...

    Python库 | urllib3-1.25.9.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:urllib3-1.25.9.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    python-2.7.13 x86

    Python 2.7.13 x86 是Python编程语言的一个特定版本,针对32位操作系统。...通过这个版本,开发者可以学习到Python的基本语法、面向对象编程以及如何利用Python进行脚本编写,这些都是成为熟练Python程序员的基础。

    Python库 | python-allib-0.1.6.0.tar.gz

    在Python中,`python-allib`可能是一个自定义的库,它集成了多个实用模块,版本号为0.1.6.0,表示这是一个早期版本,可能包含了基础功能和初步的稳定性测试。 在Python开发中,库的选择和使用是关键。`python-allib...

    python-3.6.5-docs-pdf-a4.zip

    标准库是Python的核心部分,包含了大量的预装模块,如os(操作系统接口)、sys(系统相关操作)、math(数学运算)、datetime(日期和时间处理)、json(JSON编码和解码)、csv(CSV文件处理)、urllib(URL处理)等...

    python-3.7.4-docs-html.zip

    2. **标准库参考**:这是Python的核心部分,包含了Python内置的大量模块,如os用于操作系统接口,sys用于系统交互,math用于数学运算,datetime用于日期和时间处理,json用于JSON数据的编码解码,以及urllib、...

    Python-Docs-2.5

    例如,urllib和urllib2模块用于处理URL,os模块提供操作系统接口,sys模块则提供了与Python解释器交互的功能。 在Python 2.5中,还有许多其他值得探索的特性,如新的内建函数、优化的正则表达式引擎、改进的垃圾...

Global site tag (gtag.js) - Google Analytics