苦练Python第70天:征服网络请求!揭开urllib.request的神秘面纱

前言

大家好,我是 倔强青铜三 。欢迎关注我,微信公众号: 倔强青铜三。点赞、收藏、关注,一键三连!

你能否想象不安装任何第三方库 就能从网上爬数据?当初学者们都在追捧requests库时,Python自带的核武器却被忽略了!

今天带你用urllib.request打开网络编程新世界,全程无第三方依赖,只需原生Python!


一、模块定位与作用

urllib.request是Python标准库中的HTTP瑞士军刀,无需额外安装 ,直接import即可。它能完成:

  • 发送HTTP/HTTPS请求
  • 添加请求头、Cookie等认证信息
  • 处理文件上传/下载
  • 管理网络代理和重定向

📌 记住:Python自带的标准库永远是最高性价比的学习选择!


二、发送GET请求实战

urlopen()发起首个请求:

python 复制代码
import urllib.request  

# 获取示例网站内容  
with urllib.request.urlopen("https://httpbin.org/get") as response:  
    status = response.status  
    headers = dict(response.getheaders())  
    content = response.read().decode("utf-8")  

print(f"状态码: {status}")  
print(f"响应头类型: {headers.get('Content-Type')}")  
print(f"内容片段: {content[:200]}...")  

运行结果

makefile 复制代码
状态码: 200  
响应头类型: application/json  
内容片段: {  
  "args": {},  
  "headers": {  
    "Accept-Encoding": "identity",  
    "Host": "httpbin.org",  
    "User-Agent": "Python-urllib/3.10",  
    ...  
  },  
  "origin": "xxx.xxx.xxx.xxx",  
  "url": "https://httpbin.org/get"...  

💡 关键点:

  1. with语句自动关闭网络连接
  2. response.read()返回bytes类型数据
  3. 需用.decode('utf-8')转为字符串

三、伪装浏览器:自定义请求头

许多网站屏蔽Python默认UA(User-Agent),用Request对象突破封锁:

python 复制代码
import urllib.request  

# 伪装Chrome浏览器  
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124"}  
req = urllib.request.Request(  
    url="https://httpbin.org/user-agent",  
    headers=headers  
)  

# 发送请求  
with urllib.request.urlopen(req) as response:  
    print(response.read().decode('utf-8'))  

运行结果

json 复制代码
{  
  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/91.0.4472.124"  
}  

👉 网站看到的是伪装后的浏览器标识!


四、POST请求提交表单数据

实现登录等操作必须掌握POST:

python 复制代码
import urllib.request  
import urllib.parse  

# 构造表单数据  
form_data = {"user": "admin", "pass": "secret123"}  
encoded_data = urllib.parse.urlencode(form_data).encode("utf-8")  

# 创建POST请求  
req = urllib.request.Request(  
    url="https://httpbin.org/post",  
    data=encoded_data,  
    method="POST"  
)  

# 发送并获取结果  
with urllib.request.urlopen(req) as response:  
    print(response.read().decode("utf-8"))  

运行结果

json 复制代码
{  
  "form": {  
    "pass": "secret123",  
    "user": "admin"  
  },  
  "headers": {  
    "Content-Length": "25",  
    "Content-Type": "application/x-www-form-urlencoded"  
  },  
  ...  
}  

🚨 注意:

  1. 数据必须用urlencode()处理
  2. 要转成bytes类型:.encode('utf-8')
  3. 显式指定method='POST'

五、异常处理:躲开90%的崩溃场景

网络请求充满不确定性,必须添加异常处理:

python 复制代码
import urllib.error  

targets = [  
    "https://不存在的网站.com",  # 域名错误  
    "https://httpbin.org/status/404",  # 404页面  
]  

for url in targets:  
    try:  
        with urllib.request.urlopen(url) as response:  
            print(f"{url} 访问成功")  
    except urllib.error.URLError as e:  
        print(f"⚠️ {url} 访问失败: {e.reason}")  
    except urllib.error.HTTPError as e:  
        print(f"🔴 {url} 服务器错误: {e.code} {e.msg}")  

运行结果

arduino 复制代码
⚠️ https://不存在的网站.com 访问失败: [Errno 11001] getaddrinfo failed  
🔴 https://httpbin.org/status/404 服务器错误: 404 NOT FOUND  

六、终极实战:保存网页到本地

综合应用所有知识:

python 复制代码
import urllib.request  
import urllib.error  

url = "http://example.com"  
file_path = "example.html"  

try:  
    # 设置浏览器UA头  
    req = urllib.request.Request(  
        url,  
        headers={"User-Agent": "Mozilla/5.0"}  
    )  
    
    # 超时设置为10秒  
    with urllib.request.urlopen(req, timeout=10) as response:  
        # 检测内容编码  
        content_type = response.headers.get("Content-Type")  
        encoding = "utf-8"  
        if "charset=" in content_type:  
            encoding = content_type.split("charset=")[-1]  
        
        # 写入文件  
        html = response.read().decode(encoding)  
        with open(file_path, "w", encoding=encoding) as f:  
            f.write(html)  
        print(f"网页已保存至 {file_path}")  

except Exception as e:  
    print(f"❌ 抓取失败: {str(e)}")  

运行结果

复制代码
网页已保存至 example.html  

👉 打开example.html可看到完整的Example首页


避坑指南(血泪总结)

  1. 乱码问题

    • 优先使用response.headers.get('Content-Type')中的编码
  2. 超时崩溃

    调用时设置urlopen(url, timeout=10)

  3. HTTPS证书错误

    测试环境可临时忽略:

    python 复制代码
    import ssl  
    context = ssl._create_unverified_context()  
    response = urllib.request.urlopen(url, context=context)  
  4. 🌟 永远记住

  • 商业项目需设置请求间隔时间避免封IP
  • 检查网站的robots.txt遵守爬虫规则
  • 敏感数据必须使用HTTPS传输

掌握这些技巧后,用纯Python标准库处理网络请求将畅通无阻!

最后感谢阅读!欢迎关注我,微信公众号: 倔强青铜三
点赞、收藏、关注 ,一键三连!!

欢迎 点击 【👍喜欢作者】 按钮进行 打赏💰💰,请我喝一杯咖啡☕️!

相关推荐
数据大魔方2 分钟前
【期货量化进阶】期货Tick数据分析与应用:高频数据入门(TqSdk完整教程)
python·算法·数据挖掘·数据分析·github·程序员创富·期货程序化
aitoolhub3 分钟前
H5交互设计:从策划到上线的实用方法论与避坑要点
人工智能·计算机视觉·交互·视觉传达
冰西瓜6004 分钟前
从项目入手机器学习——(一)数据预处理(上)
人工智能·机器学习
爱吃羊的老虎4 分钟前
Streamlit:快速创建应用界面,无需了解 Web 开发
前端·python
EasyCVR8 分钟前
视频融合平台EasyCVR构建太阳能供电远程视频监控系统的智慧中枢
人工智能·音视频
只想要搞钱11 分钟前
python 学习记录--1(开发工具,链接数据库mysql)
python·学习
星浩AI12 分钟前
深入理解 LlamaIndex:RAG 框架核心概念与实践
人工智能·后端·python
python开发笔记13 分钟前
can(6) canopen python库使用
服务器·网络·python
rgeshfgreh13 分钟前
Python变量与类型:从入门到精通
python