Python爬虫——如何使用urllib的HTTP基本库

前言

关于爬虫的教程网络上满天飞,我想,这应该是由于它极大地有利于信息资源的收集和分析。简单来说,在Python中,有许多大佬编写的基本库,我们可以使用这些库中的许多函数和方法,发送HTTP请求。

怎样通过 urllib库 发送 HTTP 请求?

什么是 urllib? 字面意思,即关于url的一个lib。作为一个Python的内置的HTTP请求库urlllib 提供了一些可以通过URL访问各种信息资源的函数

urllib库主要由四个模块组成:

1. 使用urllib.parse解析URL

  • 使用urlparse()分段URL

    python 复制代码
    # 导入工具包
    from urllib.parse import urlparse
    
    # 使用urlparse()函数解析URL
    result = urlparse('https://docs.python.org/3/library/urllib.parse.html#url-parsing')
    
    # 输出解析结果
    print(type(result))
    print(result)

    在这里,我们用urlparse()函数构建了一个实例对象 (ParseResult类型),并将其赋值给result,以便调用。

    事实上,ParseResult类型对象包含6个部分:

    • scheme ,代表协议 ,通常在"://"前面,这里即http
    • netloc ,代表域名 ,通常在第一个"/"前面,这里即docs.python.org:80
    • path ,代表访问路径 ,通常在域名之后,这里即/3/library/urllib.parse.html
    • params ,代表参数,通常在"?"之前,这里不存在
    • query ,代表查询条件,通常在"?"之后,这里也不存在
    • fragment ,代表瞄点 ,通常在"#"之后,用于直接定位页面内部的下拉位置,这里即url-parsing
  • 使用urlunparse()构造URL

    python 复制代码
    # 导入工具包
    from urllib.parse import urlunparse
    
    # 构建列表行参数
    data = ['http','www.baidu.com','index.html','user','a=6','comment']
    # 构造完整的URL,并打印
    print(urlunparse(data))

    事实上,在urllib.parse中,解析URL的方法不仅有urlparse()函数,还有urlsplit()等;构造URL的方法不仅有urlunparse()函数,还有urlunspliturlencode()等。

2. 使用urllib.request打开 URL,模拟发送请求

  • 使用urllib.request.urlopen函数发送HTTP请求,构造对象

    python 复制代码
    # 导入工具包  
    import urllib.request 
    
    # 使用`urlopen`函数发送HTTP请求
    response = urllib.request.urlopen('https://www.baidu.com')
    
    # 打印网页源代码 
    print(response.read().decode('utf-8'))

    urllib.request.urlopen 函数构造一个接受请求的实例对象 (HTTPResponse类型),并将其赋值给response变量,以便之后使用。

    read()方法可以得到返回的网页内容。事实上,HTTPResponse类型 的对象,不仅可以调用read()getheaders()方法 ,还可以调用statusmsg属性来查看请求发送后返回的一系列信息。

  • 通过Request类灵活配置参数,构建请求信息对象

    python 复制代码
    # 导入工具包
    import urllib.request
    
    # 设置url、headers等参数
    url = 'http://httpbin.org/post'
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
        'Host':'httpbin.org'
    }
    
    # 集合请求参数,独立成对象
    req = request.Request(url=url,headers=headers,method='POST')
    
    # 发送HTTP请求
    response = request.urlopen(req)
    
    # 打印
    print(response.read().decode('utf-8'))

    这里我们依然使用urlopen()方法来发送HTTP请求,但是传递的不再是单纯的URL,而是一个Request类型的对象。通过集合各种参数,将其独立成一个对象,可以更加丰富和灵活地配置参数。

    这里的headers即为请求头,method即为请求方法

  • 使用Handler处理器进行高级操作(以Cookies处理为例)

    python 复制代码
    # 导入工具包
    import urllib.request
    import http.cookiejar
    
    # 声明一个CooieJar对象
    cookie = http.cookiejar.Cookiejar()
    
    # 构建一个专门处理Cookies的对象
    handler = urllib.request.HTTPCookieProcessor(cookie)
    
    # 构建一个Opener对象
    opener = urllib.request.build_opener(handler)
    
    # 通过open()方法打开链接
    response = opener.open('https://www.baidu.com')
    
    # 查看每条Cookie的名称和值
    for item in cookie:
        print(item.name+'='+item.value)

    HTTPCookieProcessorurllib.request模块里用于处理Cookie 的一个类。值得注意的是这里打开链接的不再是request.urlopen()函数,而是用Opener对象的open()方法来发出请求。

3. 使用urllib.error捕捉请求错误,进行异常处理

  • 使用URLError类捕捉URL异常

    python 复制代码
    # 导入工具包
    from urllib import request, error
    
    # 使用try块,捕捉可能的异常
    try:
        response = request.urlopen('https://baidu.com')
    # 将异常对象赋值给变量e
    except error.URLError as e:
        print(e.reason)

    在这里如果发生网页不存在等请求异常,我们就可以通过URLError捕捉异常,从而避免程序的异常终止

  • 使用HTTPError类捕捉HTTP请求错误

    python 复制代码
    # 导入工具包
    from urllib import request, error
    
    # 用try块捕捉可能的错误
    try:
        response = request.urlopen('http://baidu.com')
    except error.HttpError as e:
        print(e.reason, e.code, e.headers, seq='\n')

参考资料

urllib - URL handling modules. Python官方文档
Python3网络爬虫开发实战教程. 崔庆才

相关推荐
凌览31 分钟前
有了 25k Star 的MediaCrawler爬虫库加持,三分钟搞定某红书、某音等平台爬取!
前端·后端·python
这里有鱼汤42 分钟前
给你的DeepSeek装上实时行情,让他帮你炒股
后端·python·mcp
Tomorrow'sThinker1 小时前
[特殊字符] Excel 读取收件人 + Outlook 批量发送带附件邮件 —— Python 自动化实战
python·excel·outlook
JosieBook1 小时前
【Java编程动手学】Java常用工具类
java·python·mysql
灵智工坊LingzhiAI4 小时前
人体坐姿检测系统项目教程(YOLO11+PyTorch+可视化)
人工智能·pytorch·python
烛阴12 小时前
简单入门Python装饰器
前端·python
好开心啊没烦恼12 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开12 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
失败又激情的man13 小时前
Scrapy进阶封装(第四阶段:中间件设置,动态UA,ip代理池)
爬虫·scrapy·中间件
2301_8050545613 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python