• Python3爬虫(三)请求库的使用之urllib


     Infi-chu:

    http://www.cnblogs.com/Infi-chu/

    一、urllib库:

    1. 是Python内置的HTTP请求库

    2. 在Python2中,由urllib和urllib2之分,而在Python3中,统一为urllib

    3. 主要包含模块:

      request:最基本的发送模块,用来模拟发送请求

      error:异常处理模块

      parse:一个工具模块

      robotparser:主要用来识别robots.txt文件

    二、发送请求:

    1. urlopen()

      urllib.request:模块提供了最基本的构造HTTP请求的方法,同时还带有处理验证(authentication)、重定向(redirection)、浏览器Cookies等

    import urllib.request
    r = urllib.request.openurl('http://www.baidu.com')
    print(r.read().decode('utf-8'))
    print(type(r))    # <class 'http.client.HTTPResponse'>
    

      HTTPResponse类型的对象包括的方法:read()、readinto()、getheader(name)、getheaders()、fileno()等

      HTTPResponse类型的对象包括的属性:msg、version、status、reason、debuglevel、closed等

      urlopen()函数的API:  

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

        data参数:

          1. 可选

          2. 若是字节流编码格式的内容,即bytes类型,则需要通过bytes()方法转化。若传递该参数,则请求方式会有GET变为POST

          3. bytes()第一个参数需为str类型,可用urllib.parse.urlencode()方法是字典变为字符串

        timeout参数:

          1. 可选

          2. 用于设置超时时间,单位是秒,默认使用全局默认时间

          3. 支持HTTP、HTTPS、FTP请求

          4. 例:   

    import urllib
    try:
        r = urllib.request.urlopen('http://www.baidu.com',timeout=0.1)
    except urllib.error.URLError as e:
        if isinstance(e.reason,socket.timeout):
            print('Time Out!')
    

        context参数:必须是ssl.SSLContext类型,用来指定SSL设置

        cafile参数:指定CA证书

        capath参数:指定CA证书的路径

        【注】cafile和capath一起在请求HTTPS时使用

        cadefault参数:已被废弃,默认是False

        

    2. Request

      urlopen()不足以构建一个完整的请求,若要加入Headers等信息,就可以用Request类

      Request类的构造:  

    class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
    

        url参数:同urlopen()

        data参数:同urlopen()

        headers参数:

          1. 请求头

          2. 可以直接在字典中构造,也可以用add_header()方法添加

          3. 可将User-Agent改为Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)  【注】伪造成浏览器访问

        origin_req_host参数:指的是请求方的host名称或IP地址

        unverifiable参数:请求是否是无法验证的,默认是False

        method参数:是一个字符串,用来指示请求的方法

    3. Handler(请求的高级用法):

      Handler是各种处理器,可以处理登录验证,可以处理Cookies,可以处理代理。

      urllib.request模块里面的BaseHandler类,是所有其他Handler的父类。

      各种Handler子类继承这个BaseHandler类:

        HTTPDefaultErrorHandler:用于处理HTTP响应错误,会抛出异常

        HTTPRedirectHandler:用于处理重定向

        HTTPCookieProcessor:用于处理Cookies

        ProxyHandler:用于设置代理,默认为空

        HTTPPasswordMgr:用于管理密码

        HTTPBasicAuthHandler:用于管理认证

    4. OpenDirector:

      应用:验证、代理、Cookies

    三、异常处理:

    1. URLError:

      a. 来自urllib库的error模块,他继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过它处理

      b. reason属性,返回原因

    2. HTTPError:

      a. 是URLError的子类,专门用来处理HTTP请求错误

      b. 三个属性:

        code:返回状态码

        reason:返回原因

        headers:返回请求头

    四、解析链接:

      介绍parse模块中的方法,parse定义了处理URL的标准接口

    1. urlparse()

      实现URL的识别分段。

      API用法: 

    urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
    

      urlstring参数:必选,待解析的URL

      scheme参数:它是默认的协议(HTTP、HTTPS),urlstring没有时生效

      allow_fragments参数:是否忽略fragment,False为忽略,当URL中不包含params和query时,fragment会被解析为path的一部分

    2. urlunparse()

      与urlparse对立,接受的参数是一个可迭代对象,长度必须为6(scheme,netloc,path,params,query,fragment),可以是元组、字典等特定的数据结构,这样就可以实现URL的构造

    3. urlsplit()

      与urlparse相似,不单独解析parse,返回5各部分,元组类型

    4. urlunsplit()

      与urlunparse()类似,将各个部分拼接,长度必须是5

    5. urljoin()

      生成链接,提供一个base-url的scheme,netloc,和path 3个内容并对新链接缺失的部分进行补充。

      【注】两个都有取最新的,不全的话互补

    6. urlencode()

      在构造GET请求参数的时候很有用,将字典序列化为GET请求参数

    7. parse_qs()

      反序列化,将一串GET请求参数,转化为字典

    8. parse_qsl()

      同parse_qs(),将GET转化为元组组成的列表

    9. quote()

      将内容转化为URL编码的格式,因为URL有中文编码格式时,可能会出现乱码,用它可以转化

    10. unquote()

      进行URL解码

    五、分析robots协议:

      robotparser模块,该模块提供了一个RobotFileParser类

    urllib.robotparser.RobotFileParser(url='')
    

      此类的常用方法:

      set_url()  设置robots.txt文件的链接

      read()  读取文件并分析

      parse()  解析文件

      can_fetch()  传入两个参数,第一个是User-Agent,第二个是抓取的URL,返回是否可抓取

      mtime()  返回上回抓取和分析的时间

      modified()  将当前时间设置为上次抓取和分析的时间

  • 相关阅读:
    C语言的指针移位问题
    makefile、gdb使用记录
    MUSIC算法学习笔记
    时间格式转换
    linux网络编程笔记——UDP
    linux网络编程笔记——TCP
    bash里,echo对换行符的处理
    树莓派使用8188eu无线网卡
    时间都去哪了?——安卓GTD工具
    让sublime text 2更好地支持Python
  • 原文地址:https://www.cnblogs.com/Infi-chu/p/8950935.html
Copyright © 2020-2023  润新知