python2和python3中的urllib

urllib提供了一个高级的 Web 通信库,支持基本的 Web 协议,如 HTTP、FTP 和 Gopher 协议,同时也支持对本地文件的访问。

具体来说,urllib 模块的功能是利用前面介绍的协议来从因特网、局域网、本地主机上下载数据。

使用这个模块就无须用到 httplib、ftplib和 gopherlib 这些模块了,除非需要用到更低层的功能。

Python 2 中有 urlib、urlparse、urllib2,以及其他内容。在 Python 3 中,所有这些相关模块都整合进了一个名为 urllib 的单一包中。

urlib 和 urlib2 中的内容整合进了 urlib.request模块中,urlparse 整合进了 urllib.parse 中。

Python 3 中的 urlib 包还包括 response、error 和robotparse 这些子模块。

URL的格式

prot_sch://net_loc/path;params?query#frag

URL的各个部分(Web地址的各个组件)

prot_sch                           网络协议或下载方案
net_loc 服务器所在地(也含有用户信息)
path 使用斜杠(/)分割的文件或CGI应用的路径
params 可选参数
query 连接符(&)分割的一系列键值对
frag 指定文档内特定锚的部分 net_loc 可以进一步拆分成多个组件,一些是必备的,另一些是可选的:
user:passwd@host:port user 用户名或登录
passwd 用户密码
host 运行web服务器的计算机名称或地址(必须的)
port 端口号(如果不是默认的80)

urllib.parse模块

在python2中叫做urlparse,在python3中已经改名为urllib.parse

urllib.parse 模块提供了一些基本功能,用于处理 URL 字符串。这些功能包括 urlparse()、urlunparse()和 urljoin()。

urllib.parse 模块中的核心函数描述

urlparse(urlstr,defProSch=None,allowFrag=None)            将urlstr解析成各个组件,如果在urlstr中没有给定协议或方案,则使用defProtSch;allowFrag 决定是否允许有 URL 片段
urlunparse(urltup) 将 URL 数据(urltup)的一个元组拼成一个 URL 字符串
urljoin(baseurl, newurl, allowFrag=None) 将 URL 的根域名和 newurl 拼合成一个完整的 URL;allowFrag 的作用和urlpase()相同

urlparse()将 urlstr 解析成一个 6 元组(prot_sch, net_loc, path, params, query, frag):

语法:urlparse(urlstr, defProtSch=None, allowFrag=None)
>>> urllib.parse.urlparse("https://www.smelond.com?cat=6")
ParseResult(scheme='https', netloc='www.smelond.com', path='', params='', query='cat=6', fragment='')

urlunparse()的功能与 urlpase()完全相反,其将经 urlparse()处理的 URL 生成 urltup 这个 6元组(prot_sch, net_loc, path, params, query, frag),拼接成 URL 并返回:

语法:urlunparse(urltup)
>>> result = urllib.parse.urlparse("https://www.smelond.com")
>>> print(result)
ParseResult(scheme='https', netloc='www.smelond.com', path='', params='', query='', fragment='')
>>> urllib.parse.urlunparse(result)
'https://www.smelond.com'

在需要处理多个相关的 URL 时我们就需要使用 urljoin()的功能了,例如,一个 Web 页中可能会产生一系列页面 URL:

urljoin()取得根域名,并将其根路径(net_loc 及其前面的完整路径,但是不包括末端的文件)与 newurl 连接起来。

语法:urljoin (baseurl, newurl, allowFrag=None)
>>> urllib.parse.urljoin("https://www.smelond.com?cat=6","?cat=7")
'https://www.smelond.com?cat=7'
>>> urllib.parse.urljoin("https://www.smelond.com?cat=6","abc")
'https://www.smelond.com/abc'
>>> urllib.parse.urljoin("https://www.smelond.com?cat=6","/test/abc.html")
'https://www.smelond.com/test/abc.html'
>>> urllib.parse.urljoin("https://www.smelond.com","abc.html")
'https://www.smelond.com/abc.html'

urllib模块/包

urllib 模块提供了许多函数,可用于从指定 URL 下载数据,同时也可以对字符串进行编码、解码工作,以便在 URL 中以正确的形式显示出来。

urllib.request.urlopen()

urlopen()打开一个给定 URL 字符串表示的 Web 连接,并返回文件类型的对象:

语法:urlopen (urlstr, postQueryData=None)
from urllib.request import urlopen
x = urlopen("https://www.smelond.com")
data = x.read().decode("utf-8")
print(data) <!DOCTYPE HTML><html><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=10,IE=9,IE=8">.......一堆html输出中
<!--压缩前的大小: 20278 bytes; 压缩后的大小: 19511 bytes; 节约:3.78% -->

urllib.request.urlopen()文件类型对象的方法:

f.read()                              从f中读出所有或bytes个字节
f.readline() 从f中读取一行
f.readlines() 从f中读出所有行,作为列表返回
f.close() 关闭f的URL连接
f.fileno() 返回f的文件句柄
f.info() 获得f的MIME头文件
f.geturl() 返回f的真正URL
from urllib.request import urlopen

x = urlopen("https://www.smelond.com")
data = x.info()
print(data) Server: nginx
Date: Mon, 12 Mar 2018 07:36:18 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/5.5.38
Link: <https://www.smelond.com/index.php?rest_route=/>

urllib.request.urlretrieve()

urlretrieve()不是用来以文件的形式访问并打开 URL,而是用于下载完整的 HTML,把另存为文件(当然,他可以直接下载文件)

语法:urlretrieve(url, filename=None, reporthook=None, data=None)
from urllib.request import urlretrieve
urlretrieve("https://www.smelond.com", filename="test.html")

urllib.parse.quote()和urllib.parse.quote_plus()

quote*()函数用来获取 URL 数据,并将其编码,使其可以用于 URL 字符串中。

safe 字符串可以包含一系列不能转换的字符,默认字符是斜线(/)。

语法:quote(urldata, safe='/')
from urllib.parse import quote
name = "smelond"
number = 6
base = "https://"
query = "cat"
print(quote("%s%s.com/?%s=%d and 1=1" % (base, name, query, number), safe="?/=: ")) #注意我最后有一个空格
print(quote("%s%s.com/?%s=%d and 1=1" % (base, name, query, number))) https://smelond.com/?cat=6 and 1=1    #上面加排除了空格,所有and旁边没有翻译成为%20
https%3A//smelond.com/%3Fcat%3D6%20and%201%3D1 #默认/不转换

quote_plus()与 quote()很像,只是它还可以将空格编码成“+”号:

from urllib.parse import quote_plus
name = "smelond"
number = 6
base = "https://"
query = "cat"
print(quote_plus("%s%s.com/?%s=%d and 1=1" % (base, name, query, number), safe="?/=: "))
print(quote_plus("%s%s.com/?%s=%d and 1=1" % (base, name, query, number))) https://smelond.com/?cat=6+and+1=1
https%3A%2F%2Fsmelond.com%2F%3Fcat%3D6+and+1%3D1
#输出结果中看出不管是否排除“空格”,quote_plus都会将空格变为+号,而且没有默认的safe

urllib.parse.unquote()和 urllib.parse.unquote_plus()

unquote*()函数与 quote*()函数的功能完全相反,前者将所有编码为“%xx”式的字符转换成等价的 ASCII 码值。

调用 unquote()函数将会把 urldata 中所有的 URL 编码字母都解码,并返回字符串。unquote_plus()函数会将加号转换成空格符。

语法:unquote*(urldata)
from urllib.parse import unquote
from urllib.parse import unquote_plus
print(unquote("https%3A//smelond.com/%3Fcat%3D6%20and%201%3D1"))
print(unquote_plus("https%3A%2F%2Fsmelond.com%2F%3Fcat%3D6+and+1%3D1")) https://smelond.com/?cat=6 and 1=1
https://smelond.com/?cat=6 and 1=1

urllib.urlencode()

urlopen()函数接收字典的键值对,并将其编译成字符串,键值对的格式是“键=值”,以连接符(&)划分。

另外,键及其对应的值会传到quote_plus()函数中进行适当的编码。

from urllib.parse import urlencode

adict = {"name": "smelond", "cat": "6", " and 1": "1"}
print("https://www.smleond.com&%s" % urlencode(adict)) https://www.smleond.com&name=smelond&cat=6&+and+1=1

urllib模块中的核心函数

urlopen(urlstr, postQueryData=None)                               打开 URL urlstr,如果是 POST 请求,则通过 postQueryData 发送请求的数据
urlretrieve(urlstr, localfile=None,downloadStatusHook=None) 将 URL urlstr 中的文件下载到 localfile 或临时文件中(如果没有指定 localfile);
如果函数正在执行,downloadStatusHook 将会获得下载的统计信息
quote(urldata, safe='/') 对 urldata 在 URL 里无法使用的字符进行编码,safe 中的字符无须编码
quote_plus(urldata, safe='/') 除了将空格编译成加(+)号(而非%20)之外,其他功能与 quote()相似
unquote(urldata) 将 urldata 中编码过的字符解码
unquote_plus(urldata) 除了将加号转换成空格,其他功能与 unquote()相同
urlencode(dict) 将 dict 的键值对通过 quote_plus()编译成有效的 CGI 查询字符串,用 quote_plus()对这个字符串进行编码

urllib 模块通过安全套接字层(SSL)支持开放的 HTTP 连接(socket 模块的核心变化是增加并实现了 SSL)。

httplib 模块支持使用“https”连接方案的 URL。除了那两个模块以外,其他支持 SSL 的模块还有 imaplib、poplib 和 smtplib。

python urllib库的更多相关文章

  1. python urllib 库

    urllib模块中的方法 1.urllib.urlopen(url[,data[,proxies]]) 打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作.本例试着打开google ...

  2. (25)python urllib库

    urllib包包含4个模块,在python3里urllib导入要用包名加模块名的方式. 1.urllib.request 该模块主要用于打开HTTP协议的URL import urllib.reque ...

  3. python urllib模块的urlopen()的使用方法及实例

    Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 一.urllib模块urlopen()函数: urlopen(url, data=N ...

  4. Python urllib和urllib2模块学习(一)

    (参考资料:现代魔法学院 http://www.nowamagic.net/academy/detail/1302803) Python标准库中有许多实用的工具类,但是在具体使用时,标准库文档上对使用 ...

  5. Python爬虫入门:Urllib库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它 是一段HTML代码,加 JS.CS ...

  6. 芝麻HTTP:Python爬虫入门之Urllib库的基本使用

    1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...

  7. python爬虫 - Urllib库及cookie的使用

    http://blog.csdn.net/pipisorry/article/details/47905781 lz提示一点,python3中urllib包括了py2中的urllib+urllib2. ...

  8. 对于python爬虫urllib库的一些理解(抽空更新)

    urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urllib库中,所有和网 ...

  9. Python爬虫入门之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

随机推荐

  1. WPF性能优化的一些建议

    尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,减小开销. 少用Margin Padding尤其避免嵌套使用. 在自定义控件,尽量不要在控件的ResourceD ...

  2. Python高级特性:迭代器和生成器

    在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...

  3. Linux编辑启动停止重启springboot jar包脚本

    springboot的配置文件中,配置文件的名字都有各自的意义跟用途 dev 开发环境 prod 生产环境(默认) test 测试环境 加载指定配置文件 --spring.profiles.activ ...

  4. Huffman树与编码

    带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = ...

  5. 设置ul水平居中

    <div class="jdcg-menu-nav"> <ul> <li>基本信息</li> <li>阶段资料</ ...

  6. gulp自动添加版本号过程中的一些要点记录

    1.打开node_modules\gulp-rev\index.js 第144行 manifest[originalFile] = revisionedFile; 更新为: manifest[orig ...

  7. 数据结构:IO读写频繁的青睐,B树和B+树

    目录 B树 定义及特性 查找顺序 保持平衡 B+树 B+树的插入 使用场景 参考 今天学习B树和B+树,B树和B+树都是基于二叉树的衍生,对于二叉树不太了解的读者可以翻看<数据结构:二叉树> ...

  8. Java虚拟机--虚拟机字节码执行引擎

    Java虚拟机--虚拟机字节码执行引擎 所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 用于支持虚拟机进行方法调用和方 ...

  9. 【C#数据结构系列】树和二叉树

    线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系.树形结构在现实世界中广泛存在,如家族的家谱.一个单位的行政机构组织等都 ...

  10. RocketMQ 消息发送

    消息发送基本流程: 1.消息验证 验证主题(topic),消息体不能为空和大小不能超过4M. 2.路由查找 a.查看缓存,是否有topic的路由信息. b.如果没有则到NameServer中获取路由信 ...