• Python入门教程36:urllib网页请求模块的用法


    urllib是Python中的一个模块,它提供了一些函数和类,用于发送HTTP请求、处理URL编码、解析URL等操作。无需安装即可使用,包含了4个模块:

    #我的Python教程
    #官方微信公众号:wdPython
    
    • 1
    • 2

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

    error:异常处理模块,如果出现错误可以捕获这些异常。

    parse:一个工具模块,提供了许多URL处理方法,如:拆分、解析、合并等。

    robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬。

    1. request模块

    1.1 urllib.request.urlopen:用于打开和读取URL网址,并返回一个响应对象。

    
    import urllib.request
    
    response=urllib.request.urlopen('https://www.baidu.com')  #请求站点获得一个HTTPResponse对象
    print(response.read().decode('utf-8'))   #返回网页内容
    #print(response.getheader('server')) #返回响应头中的server值
    #print(response.getheaders()) #以列表元组对的形式返回响应头信息
    #print(response.fileno()) #返回文件描述符
    #print(response.version)  #返回版本信息
    print(response.status)  #成功返回状态码200,404代表网页未找到
    #print(response.debuglevel) #返回调试等级
    #print(response.closed)  #返回对象是否关闭布尔值
    #print(response.geturl()) #返回检索的URL
    #print(response.info()) #返回网页的头信息
    #print(response.getcode()) #返回响应的HTTP状态码
    #print(response.msg)  #访问成功则返回ok
    #print(response.reason) #返回状态信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1.2 urllib.request.Request:你可以使用它来定制请求的 URL、请求方法(GET、POST 等)、请求头、请求数据等。

    url:请求的URL,必传参数,其他都是可选参数。

    data:上传的数据,必须传bytes字节流类型的数据,如果它是字典,可以先用urllib.parse模块里的urlencode()编码

    headers:它是一个字典,传递的是请求头数据,可以通过它构造请求头,也可以通过调用请求实例的方法add_header()来添加。

    method:是一个字符串,用来指示请求使用的方法,如:GET,POST,PUT等。

    以下是一个Request对象使用的例子:

    
    from urllib.request import Request, urlopen  
      
    url = 'http://www.example.com/'  
    headers = {'User-Agent': 'Mozilla/5.0'}  
    data = None  # POST 数据,如果是 GET 请求则为 None  
    req = Request(url, data=data, headers=headers)  
      
    response = urlopen(req)  
    html_data = response.read()  
    print(html_data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1.3 urllib.request.urlretrieve:将网页文件( 图片,音频等等),保存在本地电脑。urlretrieve(音频网址, f’保存到电脑上的路径.m4a’)

    1.4 urllib.request.urlcleanup:用于清理由 urlretrieve 函数下载的临时文件。当使用 urlretrieve 函数下载文件时,它会将文件保存在一个临时位置,然后在文件下载完成后,可以使用 urlcleanup 函数来清理这些临时文件。

    2.error模块:urllib的error模块定义了由request模块产生的异常,如果出现问题,request模块便会抛出error模块中定义的异常。

    2.1 URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过捕获这个类来处理。它只有一个属性reason,即返回错误的原因。

    from urllib import request,error
    try:
      #该url是不存在的,所以会产生异常
      response = request.urlopen('https://xiaohongniu918918.com/')
    
    except error.URLError as e:
      #由于访问的网页不存在,所以会打印Not Found
      print(e.reason)
      
    else:
      html = response.read()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.urllib.parse 中常用的函数和类:

    3.1 urllib.parse.urlparse(): 解析 URL,返回一个 ParseResult 对象,这个对象包含以下属性:

    scheme:URL 的协议部分(例如 ‘http’ 或 ‘https’)。

    netloc:网络位置,通常是主机名和端口号(如果有的话)。

    path:URL 路径。

    params:参数,在 URL 路径中的分号分隔的键值对。

    query:查询字符串,在 URL 中的问号之后的部分。

    fragment:URL 的片段(也称为锚点),在 URL 中的井号之后的部分。

    from urllib.parse import urlparse  
      
    url = urlparse('http://www.example.com/path?param=value#anchor')
    print(url.scheme)  # 输出:'http'  
    print(url.netloc)  # 输出:'www.example.com'  
    print(url.path)    # 输出:'/path'  
    print(url.params)  # 输出:'',因为没有参数  
    print(url.query)   # 输出:'param=value'  
    print(url.fragment)# 输出:'anchor'
    
    #你可以使用geturl() 方法来获取完整的 URL 字符串:
    print(url.geturl())  # 输出:'http://www.example.com/path?param=value#anchor'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3.2 urllib.parse.urlunparse(): 将 ParseResult 对象转换回 URL 字符串。要求你提供的元组或列表中的元素顺序必须正确,否则结果可能不是你期望的 URL。

    from urllib.parse import urlunparse
    
    url_components = ('http', 'www.example.com', '/path', '', 'param=value', 'anchor')
    url = urlunparse(url_components)
    print(url) # http://www.example.com/path?param=value#anchor
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.3 urllib.parse.urljoin: 接受一个基础 URL 和一个或多个 URL 片段作为参数,并返回一个拼接后的完整 URL。

    
    from urllib.parse import urljoin
    
    base_url = 'http://www.example.com'
    url_fragment = '/path/to/resource'
    
    full_url = urljoin(base_url, url_fragment)
    print(full_url) # http://www.example.com1/path/to/resource
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.4 urllib.parse.urldefrag(url): 接受一个 URL 字符串作为参数,并返回一个包含两个元素的元组:不包含片段标识符的基础 URL 和片段标识符。

    from urllib.parse import urldefrag  
      
    url = 'http://www.example.com/path#fragment'  
    base_url, fragment = urldefrag(url)  
      
    print(base_url)  # 输出:http://www.example.com/path  
    print(fragment)  # 输出:fragment
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.5 urllib.parse.urlsplit接受一个 URL 字符串作为参数,并返回一个 SplitResult 对象,该对象包含 URL 的各个组成部分。

    from urllib.parse import urlsplit  
      
    url = 'http://www.example.com/path?param=value#anchor'  
    parts = urlsplit(url)  
      
    print(parts.scheme)     # 输出:'http'  
    print(parts.netloc)     # 输出:'www.example.com'  
    print(parts.path)       # 输出:'/path'  
    print(parts.query)      # 输出:'param=value'  
    print(parts.fragment)   # 输出:'anchor'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.6 urllib.parse.urlunsplit(parts): 类似于urlunparse,接受一个包含 URL 的各个组成部分的 ParseResult 对象或元组作为参数,并返回一个完整的 URL 字符串。

    from urllib.parse import urlunsplit
    
    url_components = ('http', 'www.example.com', '/path', 'param=value', 'anchor')
    url = urlunsplit(url_components)
    
    print(url)  # 输出http://www.example.com/path?param=value#anchor
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.7 urllib.parse.parse_qs:接受一个查询字符串作为参数,并返回一个字典,其中包含查询字符串中的参数和对应的值。

    from urllib.parse import parse_qs
    
    query_string = 'key1=value1&key2=value2&key3=value3'
    print(parse_qs(query_string))
    # 输出:{'key1': ['value1'], 'key2': ['value2'], 'key3': ['value3']}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.8 urllib.parse.parse_qsl: 解析 URL 查询字符串,返回一个元组的列表

    from urllib.parse import parse_qsl
    
    query_string = 'key1=value1&key2=value2&key3=value3'
    
    print(parse_qsl(query_string))
    # 输出:[('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.9 urllib.parse.quote: 将字符串进行URL编码。

    from urllib.parse import quote
    
    s = 'Wo, Python教程!'
    quoted_s = quote(s)
    
    print(quoted_s)  # 输出:'Wo%2C%20Python%E6%95%99%E7%A8%8B%21'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.10 urllib.parse.unquote(s, encoding=‘utf-8’, errors=‘replace’): 将 URL 编码的字符串解码。

    
    from urllib.parse import unquote
    
    quoted_s = 'Wo%2C%20Python%E6%95%99%E7%A8%8B%21'
    print(unquote(quoted_s))
    # 输出:'Wo, Python教程!'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.11 urllib.parse.quote_plus(s, safe=’ ', encoding=‘utf-8’, errors=‘replace’): 将字符串进行 URL 编码,并将空格转换为加号。

    from urllib.parse import quote_plus
    
    s = 'Wo, Python 教程!'
    print(quote_plus(s))
    # 输出:'Wo%2C+Python+%E6%95%99%E7%A8%8B%21'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.12 urllib.parse.unquote_plus(s, encoding=‘utf-8’, errors=‘replace’): 将 URL 编码的字符串解码,并将加号转换为空格。

    from urllib.parse import unquote_plus
    
    quoted_s = 'Wo%2C+Python+%E6%95%99%E7%A8%8B%21'
    print(unquote_plus(quoted_s))
    # 输出:Wo, Python 教程!
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    Java继承
    Safran与是德科技合作为蔚来提供电动汽车中的5G和C-V2X连接测试
    递归算法讲解,深度理解递归
    常用工具类之spring-boot-devtools热部署
    平均精度(AP)
    设计模式19-状态模式
    国产1.8V低电压输入,可用于驱动步进电机;H 桥驱动电路单元可以直接驱动IR-CUT
    MongoDB从入门到精通、Springboot整合MongoDB
    Django中间件判断网站的登陆状态
    “芯星计划”启动仪式暨大学生半导体行业就业研讨会成功举办
  • 原文地址:https://blog.csdn.net/gxz888/article/details/132804789