• urllib urllib2学习笔记


    Python的urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能。他们两个最显着的差异如下:

    •   urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接收一个URL。这意味着,你不能伪装你的用户代理字符串等。
    •   urllib模块可以提供进行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具有这样的功能。这就是urllib与urllib2经常在一起使用的原因。

    urllib

    1、urllib.urlopen(url, data=None, proxies=None, context=None)方法

    打开一个url的方法,返回一个对象,可以类似文件对象的操作来读取数据

    import urllib
    
    f = urllib.urlopen("https://www.cnblogs.com/")
    print f.readline()
    
    #<!DOCTYPE html>

    urlopen返回对象提供方法:

    -         read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样

    -         info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息

    -         getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到

    -         geturl():返回请求的url

    2、urllib.urlretrieve(url, filename=None, reporthook=None, data=None, context=None)方法

    urlretrieve方法将url定位到的html文件下载到你本地的硬盘中。如果不指定filename,则会存为临时文件。

    urlretrieve()返回一个二元组(filename,httplib.HTTPMessage)

    f = urllib.urlretrieve("https://www.cnblogs.com/")
    print f

    ('d:\temp\tmp7_mted', <httplib.HTTPMessage instance at 0x01B8F030>)

    第一个元素是保存的文件路径,第二个元素是httplib.HTTPMessage对象,跟urlopen.info()方法一样,保存的是远端服务器返回的头信息。

    指定保存的文件

    f = urllib.urlretrieve("https://www.cnblogs.com/", filename='cnblog.html')
    print f

    ('cnblog.html', <httplib.HTTPMessage instance at 0x01D8B030>)

    3、urllib.urlcleanup()

    清除由于urllib.urlretrieve()所产生的缓存

    4、urllib.quote(str)

    对或取的数据进行编码,从而符合URI协议,使其能被web服务器接受。

    f1 = urllib.quote("https://www.cnblogs.com/", safe='/')
    print f1
    #https%3A//www.cnblogs.com/

    safe可以指定不需要编码的字符,可以以字符串的形式设置,例:safe=‘:/’,这样将不会对:/进行编码,默认不对 / 编码

    5、urllib.quote_plus(str)

    此函数是对请求中的url拼接的参数中的空格替换为+,这个我们很常见到,提交带空格的参数时,将看到空格都变成了+

    f2 = urllib.quote_plus(' ', safe='/')
    print f2
    
    +

    也看到有safe吧,学习了quote,可能会想到这个也是个安全字符设定,对设定的字符不做编码??

    是的,quote_plus这个其实实在quote上做了拓展,查看源码就知道了

    def quote_plus(s, safe=''):
        """Quote the query fragment of a URL; replacing ' ' with '+'"""
        if ' ' in s:
            s = quote(s, safe + ' ')
            return s.replace(' ', '+')
        return quote(s, safe)

    其实调用了quote()方法,safe这个是给quote用的,默认是不对空格做编码的。

    有编码,那就肯定有解码了,解码方法对应的是:urllib.unquote(str)、urllib.unquote_plus(str)

    6、urllib.urlencode()

    将URL中的键值对以连接符&划分,并把空格编码为+

    查询参数

    data = {'name': 'aa bb', 'lover':'ccc'}
    params = urllib.urlencode(data)
    print params
    #name=aa+bb&lover=ccc
    f = urllib.urlopen('https://www.cnblogs.com?{}'.format(params))

    urlencode方法会调用quote_plus,把空格编码为+

    请求体中参数

    data = {'name': 'aa bb', 'lover':'ccc'}
    params = urllib.urlencode(data)
    print params
    #name=aa+bb&lover=ccc
    f = urllib.urlopen('https://www.cnblogs.com/', date=params)

    urllib2

    1、urllib2.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,cafile=None, capath=None, cadefault=False, context=None)

    跟urllib差不多,也是返回一个对象,次对象操作方式跟文件对象类似

    f2 = urllib2.urlopen("https://www.cnblogs.com/")
    html = f2.read()
    print html

    2、urllib2.Request(url, data=None, headers={},origin_req_host=None, unverifiable=False)

    urllib2可以创建个request对象,构造一个完成的request对象,数据、请求头信息等都可以做设定

    data = {'name': 'aa bb', 'lover':'ccc'}
    params = urllib.urlencode(data)
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; … Gecko/20100101 Firefox/54.0'}
    req = urllib2.Request("https://www.cnblogs.com/",data=params, headers=headers)
    req.add_data(urllib.urlencode({'age': 100, 'like': 'h'}))#重新设定提交的参数,会覆盖之前设定的 
    req.add_header('Host', '127.0.0.1')#添加请求头信息
    print req.headers
    print req.data
    response
    = urllib2.urlopen(req)
    print response.readline()
  • 相关阅读:
    idea 相关
    dns 相关
    bash 相关
    建造者模式(Builder)
    C#中out 及 ref 区别
    C# 2.0新特性
    Asp.net.Ajax控件学习
    装饰模式(Decorator Pattern)
    职责链模式(Chain of Responsibility Pattern)
    面向对象
  • 原文地址:https://www.cnblogs.com/alummox/p/7360649.html
Copyright © 2020-2023  润新知