zoukankan      html  css  js  c++  java
  • python urllib库

    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。

    作者:smelond
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    2020.10.10收获(动手动脑三)
    2020.10.8收获
    2020.10.4收获
    2020.10.11收获
    2020.10.6收获
    2020.10.7收获(动手动脑二)
    2020.10.9收获
    2020.10.3收获
    2020.10.2收获
    2020.10.5收获
  • 原文地址:https://www.cnblogs.com/smelond/p/8547469.html
Copyright © 2011-2022 走看看