当前位置:

首页 > 编程开发 > Python发送HTTP请求技巧:urllib实用指南

Python发送HTTP请求技巧:urllib实用指南

urllib是Python标准库中的HTTP请求工具,无需安装即可使用。1.发送GET请求可用urllib.request.urlopen()函数直接实现;2.发送POST请求需构建Request对象并编码数据;3.异常处理依赖urllib.error模块区分不同错误类型;4.超时设置可通过timeout参数避免程序卡死;5.urllib作为标准库适用于受限环境、最小化依赖、学习底层机制及特定协议处理;6.处理HTTPS时可配置ssl上下文忽略证书验证(不推荐生产环境);7.代理配置需使用ProxyHan

本文目录

    urllib是Python标准库中的HTTP请求工具,无需安装即可使用。1.发送GET请求可用urllib.request.urlopen()函数直接实现;2.发送POST请求需构建Request对象并编码数据;3.异常处理依赖urllib.error模块区分不同错误类型;4.超时设置可通过timeout参数避免程序卡死;5.urllib作为标准库适用于受限环境、最小化依赖、学习底层机制及特定协议处理;6.处理HTTPS时可配置ssl上下文忽略证书验证(不推荐生产环境);7.代理配置需使用ProxyHandler和build_opener实现;8.重定向默认自动处理,也可自定义控制;9.Cookie管理通过http.cookiejar与HTTPCookieProcessor结合实现会话保持。

    怎样用Python发送HTTP请求?urllib使用技巧

    用Python发送HTTP请求,urllib库是标准库的一部分,这意味着你无需安装任何第三方包就能直接使用它。它提供了多种模块来处理URL,包括请求、解析和错误处理。最核心的部分是urllib.request,它负责打开URL并处理HTTP请求。

    怎样用Python发送HTTP请求?urllib使用技巧

    要发送一个HTTP请求,最直接的方式就是使用urllib.request.urlopen()函数。它能处理GET请求,并返回一个文件状对象,你可以从中读取响应数据。如果需要发送POST请求或添加自定义头部,就需要构建一个urllib.request.Request对象,然后将其传递给urlopen()。

    怎样用Python发送HTTP请求?urllib使用技巧

    解决方案

    发送GET请求相对简单:

    import urllib.request
    import urllib.parse # 用于处理URL编码
    
    url = 'http://httpbin.org/get' # 一个测试用的URL
    
    try:
        with urllib.request.urlopen(url) as response:
            html = response.read().decode('utf-8')
            print("GET 请求成功!")
            print(f"状态码: {response.status}")
            # print(html) # 打印响应内容
    except urllib.error.URLError as e:
        print(f"GET 请求失败: {e.reason}")
    except urllib.error.HTTPError as e:
        print(f"GET 请求失败,HTTP 错误: {e.code} - {e.reason}")
    

    发送POST请求则需要多一步,把数据编码后放入Request对象:

    怎样用Python发送HTTP请求?urllib使用技巧
    import urllib.request
    import urllib.parse
    
    post_url = 'http://httpbin.org/post'
    data = {'name': 'Python', 'version': '3.9'}
    # 数据需要编码为字节串
    encoded_data = urllib.parse.urlencode(data).encode('utf-8')
    
    req = urllib.request.Request(post_url, data=encoded_data, method='POST')
    # 可以添加自定义头部
    req.add_header('Content-Type', 'application/x-www-form-urlencoded')
    req.add_header('User-Agent', 'MyCustomPythonApp/1.0')
    
    try:
        with urllib.request.urlopen(req) as response:
            response_data = response.read().decode('utf-8')
            print("\nPOST 请求成功!")
            print(f"状态码: {response.status}")
            # print(response_data) # 打印响应内容
    except urllib.error.URLError as e:
        print(f"POST 请求失败: {e.reason}")
    except urllib.error.HTTPError as e:
        print(f"POST 请求失败,HTTP 错误: {e.code} - {e.reason}")
    

    这里有个细节,urlopen()默认会处理一些常见错误,但更细致的错误捕获,比如网络不通、域名解析失败,或者HTTP 4xx/5xx错误,就需要用到urllib.error模块里的URLError和HTTPError。这能让你更优雅地处理各种异常情况。另外,超时设置也是个关键点,避免程序因为网络问题卡死:

    # 设置超时
    try:
        with urllib.request.urlopen('http://httpbin.org/delay/5', timeout=2) as response: # 尝试访问一个会延迟5秒的URL,但设置2秒超时
            print("这行代码可能不会被执行,因为会超时。")
    except urllib.error.URLError as e:
        print(f"\n请求超时或网络问题: {e.reason}")

    urllib.request 和 requests 库有什么区别?为什么还要用 urllib?

    谈到Python的HTTP请求,很多人首先想到的是requests库。没错,requests确实是目前最流行、API最友好的HTTP客户端库,它的设计哲学就是“HTTP for Humans”,用起来非常直观简洁。比如,一个GET请求只需要requests.get(url)。而urllib呢,它的API相对来说就显得有些“原始”和繁琐了,需要你手动处理数据编码、请求对象构建等。

    那么,既然requests这么好用,为什么我们还要了解甚至在某些场景下使用urllib呢?原因很简单,urllib是Python标准库的一部分,这意味着它开箱即用,无需任何额外安装。这在一些特定的环境中就显得尤为重要,比如:

    • 受限环境: 在一些没有网络连接、或者权限受限、无法安装第三方库的服务器或嵌入式设备上,urllib就是你唯一的选择。
    • 最小化依赖: 如果你的项目追求极致的轻量化,不希望引入任何不必要的第三方依赖,那么urllib是理想的选择。
    • 学习和理解底层: 学习urllib能让你更深入地理解HTTP协议的底层工作原理,比如请求头、数据编码、错误处理等,这对于理解requests这类高级库的内部机制也很有帮助。
    • 特定需求: 偶尔,urllib在某些非常底层或特殊的功能上(例如处理FTP、Gopher等非HTTP协议,或者需要精细控制某些连接细节时)可能会提供比requests更直接的接口。虽然这些场景不多见,但存在即合理。

    所以,虽然requests是日常开发的首选,但urllib作为标准库的“老兵”,依然有它存在的价值和适用场景。了解它,就像了解一台汽车的发动机原理,虽然日常驾驶不需要,但关键时刻能救命。

    urllib 在处理 HTTPS 和代理时有哪些注意事项?

    在实际的网络请求中,遇到HTTPS加密连接和需要通过代理服务器访问是家常便饭。urllib在这方面也提供了相应的支持,不过在使用时确实有些细节需要注意。

    对于 HTTPS,urllib.request.urlopen()默认会尝试验证SSL证书,以确保连接的安全性。这是个好事,因为它能防止中间人攻击。但有时候,你可能会遇到一些自签名证书或者企业内部的特殊证书,导致默认验证失败,抛出ssl.SSLError。在这种情况下,如果你确定风险可控,可以选择忽略证书验证。这可以通过ssl模块来配置一个不验证证书的上下文,然后传递给urlopen:

    import ssl
    import urllib.request
    
    # 创建一个不验证SSL证书的上下文 (不推荐用于生产环境,除非你明确知道自己在做什么)
    # context = ssl._create_unverified_context() # 旧版本用法,新版本推荐如下
    context = ssl.create_default_context()
    context.check_hostname = False
    context.verify_mode = ssl.CERT_NONE
    
    try:
        # 尝试访问一个可能存在证书问题的HTTPS网站,或者只是为了演示
        with urllib.request.urlopen('https://expired.badssl.com/', context=context) as response:
            print("\nHTTPS 请求(忽略证书验证)成功!")
            print(f"状态码: {response.status}")
    except urllib.error.URLError as e:
        print(f"HTTPS 请求失败: {e.reason}")

    代理设置则需要用到urllib.request.ProxyHandler和urllib.request.build_opener。urllib的请求处理是通过一系列“处理器”(handlers)组成的“opener”来完成的。默认的urlopen函数用的是一个简单的opener,如果你需要更高级的功能,比如代理,就需要构建一个自定义的opener。

    import urllib.request
    
    # 假设你的代理服务器地址和端口
    proxy_url = 'http://your_proxy_ip:your_proxy_port'
    # 如果代理需要认证,可以这样写:'http://username:password@your_proxy_ip:your_proxy_port'
    
    # 构建一个代理处理器
    proxy_handler = urllib.request.ProxyHandler({'http': proxy_url, 'https': proxy_url})
    
    # 构建一个自定义的opener,将代理处理器添加到其中
    opener = urllib.request.build_opener(proxy_handler)
    
    # 安装这个opener,使其成为全局默认的urlopen行为
    urllib.request.install_opener(opener)
    
    # 现在,所有的urllib.request.urlopen()调用都会通过代理
    try:
        with urllib.request.urlopen('http://httpbin.org/ip') as response:
            print("\n通过代理访问成功!")
            print(f"状态码: {response.status}")
            print(response.read().decode('utf-8')) # 应该显示代理服务器的IP地址
    except urllib.error.URLError as e:
        print(f"通过代理请求失败: {e.reason}")
    except urllib.error.HTTPError as e:
        print(f"通过代理请求失败,HTTP 错误: {e.code} - {e.reason}")
    
    # 如果你只想对某个特定的请求使用代理,而不是全局安装,可以这样做:
    # opener.open(url) 代替 urllib.request.urlopen(url)

    需要注意的是,install_opener会改变全局的urlopen行为,这在多线程或大型应用中可能会引起意想不到的副作用。更推荐的做法是创建opener实例后,直接调用opener.open(url)来发送请求,而不是全局安装。

    如何处理 urllib 请求中的重定向和 Cookie?

    在Web交互中,重定向(Redirects)和Cookie管理是两个非常常见的场景,它们直接影响到用户会话和请求的正确性。urllib也提供了相应的处理器来应对这些需求。

    重定向:HTTP协议中,服务器可以通过返回3xx状态码(如301 Moved Permanently, 302 Found, 307 Temporary Redirect)来指示客户端访问一个新的URL。urllib.request默认情况下会自动处理HTTP 3xx重定向。这意味着你不需要额外编写代码来追踪重定向链。当你使用urlopen()时,如果遇到重定向,它会自动跟随到最终的目的地并返回最终响应。

    如果你想禁用自动重定向,或者想获取重定向链中的所有URL,你需要更细粒度地控制。这可以通过构建一个自定义的opener,并移除或修改HTTPRedirectHandler来实现。不过,通常情况下,默认的自动跟随行为已经足够满足大部分需求。如果你确实需要查看重定向的历史,可以检查响应对象的geturl()方法,它会返回最终的URL,而原始请求的URL则需要在请求对象中保留。

    import urllib.request
    
    # 访问一个会重定向的URL,例如 httpbin.org/redirect/1
    # 默认情况下,urllib会跟随重定向
    try:
        with urllib.request.urlopen('http://httpbin.org/redirect/1') as response:
            print("\n重定向请求成功!")
            print(f"最终访问的URL: {response.geturl()}")
            print(f"状态码: {response.status}")
    except urllib.error.URLError as e:
        print(f"重定向请求失败: {e.reason}")

    Cookie管理:Cookie是Web会话管理的核心机制,服务器通过它来识别用户、保持登录状态等。urllib处理Cookie需要用到http.cookiejar模块和urllib.request.HTTPCookieProcessor。http.cookiejar提供了存储和管理Cookie的类,比如CookieJar(内存存储)和FileCookieJar(文件存储)。HTTPCookieProcessor则负责将这些Cookie添加到请求中,并将响应中的新Cookie保存起来。

    以下是一个简单的示例,演示如何使用CookieJar来管理会话中的Cookie:

    import urllib.request
    import http.cookiejar
    
    # 创建一个CookieJar对象,用于存储和管理Cookie
    cookie_jar = http.cookiejar.CookieJar()
    
    # 创建一个HTTPCookieProcessor,并将CookieJar传递给它
    cookie_processor = urllib.request.HTTPCookieProcessor(cookie_jar)
    
    # 构建一个自定义的opener,加入Cookie处理器
    opener = urllib.request.build_opener(cookie_processor)
    
    # 安装这个opener,使其成为全局默认的urlopen行为
    urllib.request.install_opener(opener)
    
    # 第一次请求:服务器可能会设置Cookie
    print("\n--- 第一次请求 (获取Cookie) ---")
    try:
        with urllib.request.urlopen('http://httpbin.org/cookies/set?name=value') as response:
            print(f"状态码: {response.status}")
            print(f"响应内容: {response.read().decode('utf-8')}")
            print("当前CookieJar中的Cookie:")
            for cookie in cookie_jar:
                print(f"  {cookie.name}={cookie.value}")
    except urllib.error.URLError as e:
        print(f"第一次请求失败: {e.reason}")
    
    # 第二次请求:Cookie会被自动发送
    print("\n--- 第二次请求 (发送Cookie) ---")
    try:
        with urllib.request.urlopen('http://httpbin.org/cookies') as response:
            print(f"状态码: {response.status}")
            print(f"响应内容: {response.read().decode('utf-8')}") # 应该能看到之前设置的Cookie
    except urllib.error.URLError as e:
        print(f"第二次请求失败: {e.reason}")
    

    通过这种方式,urllib就能像浏览器一样,在请求之间保持会话状态。如果你需要将Cookie持久化到文件,可以将CookieJar替换为MozillaCookieJar或LWPCookieJar,它们提供了save()和load()方法来读写Cookie文件。这对于需要长期保持登录状态的爬虫或自动化脚本非常有用。不过,记住处理Cookie时要遵守网站的规定和隐私政策。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    GitHub六个AI开源项目能做什么?软件理解、语音与求职场景
    GitHub六个AI开源项目能做什么?软件理解、语音与求职场景

    解析六个GitHub AI开源项目的具体用途,包括软件静态分析、智能体回答检查、多语言配音、求职材料生成、本地代码检索及动态歌词展示,帮助开发者根据实际需求筛选工具并正确验证结果。

    opencode安装skills教程及本地配置方法
    opencode安装skills教程及本地配置方法

    遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    Visual Studio2017设置默认编码为UTF-8不带BOM
    Visual Studio2017设置默认编码为UTF-8不带BOM

    针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

    Visual Studio2022F5调试提示启动项目未配置怎么修复
    Visual Studio2022F5调试提示启动项目未配置怎么修复

    解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。

    Visual Studio2022NuGet包还原失败离线处理方案
    Visual Studio2022NuGet包还原失败离线处理方案

    解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。

    Visual Studio2017大项目加载缓慢,优化加载性能技巧
    Visual Studio2017大项目加载缓慢,优化加载性能技巧

    解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。

    Visual Studio2022设置多启动项目同时调试运行
    Visual Studio2022设置多启动项目同时调试运行

    详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。

    fastapi下载文件接口实现教程
    fastapi下载文件接口实现教程

    深入解析在FastAPI框架中实现文件下载接口的完整方案,涵盖基于FileResponse的本地静态文件传输、基于StreamingResponse的分块流式传输、RFC 5987中文文件名编码规范、路径穿越安全防御及BackgroundTasks临时文件清理,并配备详细代码示例与架构解析图。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。