Python爬虫——urllib库介绍

文章目录

  • urllib库有四个主要的模块
    • 一、`urllib.request`——构造URL请求并捕获内容
    • 二、`urllib.parse`——解析URL
    • 三、`urllib.error`——展示请求异常的细节
    • 四、`urllib.robotsparser`
    • 五、利用`urllib`分别构造`GET`和构造`POST`请求

urllib库有四个主要的模块

模块 描述
urllib.request 打开一个url(模拟浏览器的请求发起),并读取它的内容
urllib.parse 解析一个url
urllib.robotparser 解析robots.txt
urllib.error 包含了urllib.request的错误

一、urllib.request——构造URL请求并捕获内容

# urllib.request来构造http请求,并获取http相应的内容
import urllib.request
  1. 利用方法urlopen():用于打开一个url

    from urllib.request import urlopen
    my_url = urlopen("https://www.baidu.com")
    
  2. 利用方法read()readline()/readlines()来读取文件内容

    import urllib.request
    my_url = urllib.request.urlopen("https://www.baidu.com")
    # 向read()传入参数则表示要读取内容的长度
    print(my_url.read())
    # 用readlin()来读取一行内容
    print(my_url.readline())
    # 用readlines()来读取所有行的内容,并返回一个列表
    ret_li = my_url.readlines()
    for line in ret_li:
        print(line)
    
  3. 利用方法getcode()来获取HTTP请求的状态码

    # http状态码 
    # 1xx - 请求发送成功,还需发送方继续操作
    # 2xx - 请求成功
    # 3xx - 重定向
    # 4xx - 客户端的错误
    # 5xx - 服务端的错误
    print(my_url.getcode())
    
  4. 利用Request来构造自定义http请求

  • Request类有几个重要的属性

    • url:一个字符串,包含合法的URL
    • data:一个对象,包含附加数据
    • headers:一个字典,包含http请求的头部信息(通常可以用于伪造发送方的"User-Agent"——模仿主流浏览器的"User-Agent",可以绕过一些只接受浏览器访问的服务器的检查)

    如,可以构造一个这样的http请求:

    import urllib.request
    my_url = "https://www.baidu.com"
    
    # 将'User-Agent'伪造得与浏览器相似
    my_header = {'User-Agent':'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11'}
    
    # 未填入的参数会以默认值填写
    my_request = urllib.request.Request(my_url, headers=my_header)
    
    print(urllib.request.urlopen(my_request).read())
    # 成功返回结果
    

二、urllib.parse——解析URL

序列化与反序列化:

  • 序列化是将对象转为字节序列的过程;

  • 反序列化是将字节序列转为对象的过程。

序列化的好处是可以将对象持久化地存储,便于其在网络中的传输降低程序的维护成本

# urllib.parse用来解析url
import urllib.parse
  • 使用urllib.parse中的urlencode()等来实现序列化

    import urllib.parse
    # 一个字典对象,不方便我们在网络中对其进行传输
    get_para = {"a":97, "b":"B"}
    
    # 将上述字典对象序列化,转为字符串
    url_get=urllib.parse.urlencode(get_para)
    
    print(url_get)
    # a=97&b=B
    
  • 使用urllib.parse中的urlparse()parse_qs()parse_qsl()urlsplit()等来实现反序列化

    import urllib.parse
    
    my_url = "https://www.abc.com/def.php?id=2"
    
    print(urllib.parse.urlparse(my_url))
    # urlparse()返回一个具名元组ParseResult
    # ParseResult(scheme='https', netloc='www.xxx.com', path='/abc.php', params='', query='id=2', fragment='')
    
    print(urllib.parse.parse_qs(my_url))
    # parse_qs()返回一个字典
    # {'https://www.abc.com/def.php?id': ['2']}
    
    print(urllib.parse.parse_qsl(my_url))
    # parse_qsl()返回一个列表
    # [('https://www.abc.com/def.php?id', '2')]
    
    print(urllib.parse.urlsplit(my_url))
    # urlsplit()和urlparse()类似,返回一个具名元组SplitResult,但没有params元素
    # SplitResult(scheme='https', netloc='www.abc.com', path='/def.php', query='id=2', fragment='')
    

三、urllib.error——展示请求异常的细节

此模块为urllib.request所引发的异常定义了一个异常类URLError:

URLErrorOSError的一个子类,HTTPErrorURLError的一个子类

# urllib.error来展示请求异常的细节
import urllib.error
  • URLError适用于程序遇到问题时引发的异常,有一个特殊属性:

    • reason:解释本次错误原因的字符串或异常实例
  • HTTPError适用于HTTP请求的异常,有三个特殊属性:

    • code:HTTP状态码
    • reason:一个解释本次错误原因的字符串
    • headers:导致本次异常的HTTP请求对应的HTTP响应头
    import urllib.request
    import urllib.error
    
    my_url = "http://www.abc.com"
    
    # 使用try...except...来捕获请求的异常
    try:
        # 一个请求
        a_request = urllib.request.urlopen(my_url)
    except urllib.error.HTTPError as err:
        print("HTTP状态码:",err.code)
        print("本次异常原因:",err.reason)
        print("HTTP响应头:",err.headers)
    

四、urllib.robotsparser

robotparser 实现了一个用于分析 robots.txt 文件格式的解析器, 它含有一个检查给定用户代理是否可以访问给定资源的函数。它的目的是给那些品行端正的爬虫用的,或用来指导需要节流,否则就会被限制访问的其他抓取器。

更多内容请访问:https://learnku.com/docs/pymotw/urllibrobotparser-internet-spider-access-control/3434#ed7f1a

五、利用urllib分别构造GET和构造POST请求

  • GET

    # 只需要在目标url之后添加数据即可
    # (将要传输的内容写在字典中,序列化后与原url和?进行拼接)
    
    import urllib.request
    import urllib.parse
    
    my_url = "http://www.abc.com"
    
    # get的内容用urllib.parse.urlencode()来将字典序列化能够嵌在url中的合法内容
    url_get = urllib.parse.urlencode({'id':username})
    
    full_url = my_url + "?" + url_get
    
    # 此时相当于发送了一个"http://www.abc.com?id=username"
    my_request = urllib.request.Request(full_url)
    print(urllib.request.urlopen(my_request).read())
    
  • POST

    # 通过Request类的data属性实现 
    # (将要传输的内容写入字典并序列化,最后将其编码为二进制后赋给Request类)
    
    import urllib.request
    import urllib.parse     
    
    my_url = "http://www.abc.com"
    
    # 将含参数的字典序列化
    my_data = urllib.parse.urlencode({"username":admin, "password":123465})
    
    # 将序列化后的数据转为二进制格式
    my_data_bin = bytes(my_data, encoding = "utf-8")
    
    # 将二进制数据赋给Request.data
    my_request = urllib.request.Request(my_url, data=my_data_bin)
    print(urllib.request.urlopen(my_request).read())
    

总结:利用urllib模块(request、parse比较重要),可以很容易地利用Python来构造自定义请求或爬取简单的网页内容。

你可能感兴趣的:(Python,爬虫,python,爬虫,开发语言)