urllib的使用

作者: Fizz翊 | 来源:发表于2018-10-22 22:55 被阅读7次

    urllib库是python内置的HTTP请求库。

    包含以下四个模块:

    1) request 最基本的HTTP请求模块,可以用来模拟发送请求。
    
    2)error 异常处理模块
    
    3)parse 一个工具模块,提供了许多URL处理方法,比如拆分,解析,合并等。
    
    4)robotparser 用来识别网站的robots.txt文件,从而判断哪些网站可以爬,哪些网站不可以爬。
    

    1.request 模块

    1.1 urlopen()

    import urllib.request
    
    response = urllib.request.urlopen(url)
    

    得到的response是一个HTTPResponse类型的对象,主要包含read(),readinto(),getheader(name),getheaders(),fileno()等方法,以及msg,version,status,reason等属性。

    通过urlopen()得到response这个对象后,就可以调用上面提到的这些方法和属性,从而得到返回结果的一系列对象,

    • urlopen函数的API

      Urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,cadefault=False,context=None)

      • data 参数
        data参数是可选的,如果要添加这个参数,就需要使用bytes()方法将参数转化为字节流编码格式的内容,即bytes类型。如果使用了这个参数就不在是GET请求而是POST请求了。

        import urllib.parse
        import urllib.request
        
        data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
        response = urllib.request.urlopen(url,data=data)
        print(response.read())
        

        在这里我们传递了一个参数为word,值是hello。它需要被转码成bytes类型,采用的方法就是bytes()方法,该方法的第一个参数需要的是str类型,需要使用urllib.parse模块里的urlencode方法来将参数字典转换为字符串,第二个参数指定编码格式,这里指定为utf8。

      • timeout参数

        该参数用于设置超时时间,单位为秒,超过设置的这个时间还没有得到响应就会抛出异常,如果不指定,就会使用全局默认时间。

    1.2 Request

    urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
    
    • URL用来请求URL,必传参数,其他的都是可选参数

    • data如果要传,就必须传bytes类型的,如果参数为字典,可以先用urllib.parse模块里的urlencode编码。

    • headers是一个字典,请求头,可以在构造请求是通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加re。

    • Method是一个字符串,用来指示请求使用的方法

    1.3高级用法

    • 代理

      from urllib.error import UELError
      from urllib.request import ProxyHandler,build_opener
      
      proxy_handler = ProxyHandler({
          'http':'http://',
          'https':'https://'
      })
      
      opener = build_opener(proxy_handler)
      try:
        response = opener.open(url)
        print(response.read().decode('utf-8'))
      except URLError as e:
        print(e.reason)
      

      这里使用了ProxyHandler其参数是一个字典,键名是协议类型(http或者https),键值是代理链接,可以添加多个代理IP。

      然后利用这个Handler以及build_opener()方法构造了一个Opener,之后发送即可。

    • Cookies

      • 获取网站的Cookies

        import http.cookiejar,urllib.request
        
        cookie = http.cookiejar.CookieJar()
        handler = urllib.request.HTTPCookieProcessor(cookie)
        opener = urllib.request.build_opener(handler)
        response = opener.oepn(url)
        for item in cookie:
            print(item.name+"="+item.value)
        

        首先声明一个CookieJar对象,然后利用HTTPCookieProcessor来构建一个Handler,最后利用build_opener()方法来构建出opener,执行open即可。

      • 以文件形式获取Cookie

        filename = 'cookies.txt'
        cookie = http.cookiejar.MozillaCookieJar(filename)
        handler = urllib.request.HTTPCookieProcessor(cookie)
        opener = urllib.request.build_opener(handler)
        response = opener.oepn(url)
        cookie.save(ignore_discard=True,ignore_expires=True)
        

    2.处理异常

    urllib的error模块定义了由request模块产生的异常。

    2.1URLError

    URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过捕获和这个类来处理

    这个类具有一个reason属性,即返回的错误的原因。

    from urllib import request,error
    try:
        .....
    except error.URLError as e:
        print(e.reason)
    

    2.2HTTPError

    它是URLError的子类,专门用来处理HTTP请求错误。它有三个属性

    • code 返回HTTP状态码

    • reason 返回错误信息

    • headers 返回请求头

    3解析链接

    urllib库里提供了一个parse模块,定义处理URL的标准接口,例如实现URL各部分的抽取,合并以及链接转换

    3.1 urlparse(urlstring,shcme='',allow_fragments=True)

    • urlstring 必填项 待解析的url
    • Scheme 默认的协议,如果这个链接没有带协议信息,会将这个作为默认的协议。
    • allow_fragments 即是否忽略fragment,如果设置为False,则fragment部分就会被忽略,会成为其他的一部分,而fragment则为空
    from urllib.parse import urlparse
    
    result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
    print(type(result),result)
    
    <class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
    

    从打印的结果可以看出,返回的是一个ParseResult类型的对象,它包含了6个部分,分别是scheme(协议,比如http,https),netloc(域名),path(访问路径),params(参数),query(问号后面的查询条件),fragment(#后面的内容).

    一个标准的链接格式: scheme://netloc/path;params?query#fragment

    3.2urlunparse()

    与urlparse()方法的对立。它接受的参数是一个可迭代对象,长度必须为6,即传入6个参数,返回的结果是组装好的URL.

    data = ['http','www.baidu.com','index.html','user','a=6','comment']
    print(urlunparse(data))
    

    得到的结果为

    http://www.baidu.com/index.html;user?a=6#comment
    

    3.3urlsplit()与urlunsplit()

    这个方法和urlparse()方法类似,只不过不在解析parms这个部分,只返回五个结果。parms部分会合并到path中。

    3.4 urljoin()

    使用URLjoin方法 需要提供一个base_url作为第一参数,将新的链接作为第二个参数,然后会合成一个新的链接。

    Base_url 提供了三项内容,scheme,netloc,path.如果这三项在新的链接中不存在就补充,如果新的链接存在,就使用新的链接中的部分。

    3.5 urlencode() 与 parse_qs()

    from urllib.parse import urlencode
    
    params = {
        'name':'germey',
        'age':22
    }
    base_url = 'http://www.baidu.com?'
    url = base_url + urlencode(params)
    print(url)
    

    结果为:

    http://www.baidu.com?name=germey&age=22
    

    将字典类型转换为GET请求参数。

    如果我们有一串GET请求参数,利用parse_qs()方法,就可以将参数转换为字典

    3.5 quote()与unquote()

    Quote将中文转化为URL编码的格式

    from urllib.parse import quote
    
    url_word = quote(keyword)
    

    unquote将URL编码解码成中文

    相关文章

      网友评论

        本文标题:urllib的使用

        本文链接:https://www.haomeiwen.com/subject/tginzftx.html