苦练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标准库处理网络请求将畅通无阻!

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

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

相关推荐
倔强青铜三3 小时前
苦练Python第72天:colorsys 模块 10 分钟入门,让你的代码瞬间“好色”!
人工智能·python·面试
MicroTech20253 小时前
MLGO微算法科技发布多用户协同推理批处理优化系统,重构AI推理服务效率与能耗新标准
人工智能·科技·算法
说私域3 小时前
互联网企业外化能力与实体零售融合:基于定制开发开源AI智能名片S2B2C商城小程序的实践探索
人工智能·开源·零售
沫儿笙3 小时前
FANUC发那科焊接机器人薄板焊接节气
人工智能·机器人
IT_陈寒3 小时前
震惊!我用JavaScript实现了Excel的这5个核心功能,同事直呼内行!
前端·人工智能·后端
淞宇智能科技3 小时前
固态电池五大核心设备全解析
大数据·人工智能·自动化
AndrewHZ4 小时前
【图像处理基石】多波段图像融合算法入门:从概念到实践
图像处理·人工智能·算法·图像融合·遥感图像·多波段·变换域
胖哥真不错4 小时前
Python基于PyTorch实现多输入多输出进行BP神经网络回归预测项目实战
pytorch·python·毕业设计·论文·毕设·多输入多输出·bp神经网络回归预测
Web3_Daisy4 小时前
从透明到可控:链上换仓与资产路径管理的下一阶段
人工智能·安全·web3·区块链·比特币