前言
大家好,我是 倔强青铜三 。欢迎关注我,微信公众号: 倔强青铜三。点赞、收藏、关注,一键三连!
你能否想象不安装任何第三方库 就能从网上爬数据?当初学者们都在追捧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"...
💡 关键点:
with语句自动关闭网络连接response.read()返回bytes类型数据- 需用
.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"
},
...
}
🚨 注意:
- 数据必须用
urlencode()处理- 要转成bytes类型:
.encode('utf-8')- 显式指定
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首页
避坑指南(血泪总结)
-
乱码问题
- 优先使用
response.headers.get('Content-Type')中的编码
- 优先使用
-
超时崩溃
调用时设置
urlopen(url, timeout=10) -
HTTPS证书错误
测试环境可临时忽略:
pythonimport ssl context = ssl._create_unverified_context() response = urllib.request.urlopen(url, context=context) -
🌟 永远记住
- 商业项目需设置请求间隔时间避免封IP
- 检查网站的
robots.txt遵守爬虫规则- 敏感数据必须使用HTTPS传输
掌握这些技巧后,用纯Python标准库处理网络请求将畅通无阻!
最后感谢阅读!欢迎关注我,微信公众号: 倔强青铜三 。
点赞、收藏、关注 ,一键三连!!欢迎 点击 【👍喜欢作者】 按钮进行 打赏💰💰,请我喝一杯咖啡☕️!