python爬虫练习篇上(静态网页)
字数 992 2025-08-10 17:51:46
Python爬虫基础教学:静态网页图片批量下载
1. 环境准备
1.1 系统环境
- 操作系统:Windows 10企业版
- 开发环境:Python
- 测试服务器:phpstudy (5.4.45)
- 目标网站:pythonSpider (本地搭建的测试网站)
1.2 Python库依赖
requests:用于发送HTTP请求re:用于正则表达式匹配time:用于生成时间戳
2. 爬虫核心代码解析
2.1 获取网页源码
def get_html(url):
# 定义请求头,模拟浏览器访问
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.79"
}
# 发送GET请求
res = requests.get(url=url, headers=headers)
# 返回网页内容的二进制数据
return res.content
关键点:
- 必须设置
User-Agent请求头模拟浏览器访问 res.content返回的是二进制数据,适合处理图片等非文本内容- 对于文本内容,可以使用
res.text获取解码后的字符串
2.2 提取图片地址
def get_img_path_list(html):
# 使用正则表达式匹配图片路径
img_path_list = re.findall(r"style/\w*\.jpg", html.decode())
return img_path_list
正则表达式解析:
r"style/\w*\.jpg":style/:匹配固定字符串"style/"\w*:匹配0个或多个字母、数字或下划线\.jpg:匹配".jpg"后缀(注意.需要转义)
改进建议:
- 可以改用
BeautifulSoup等HTML解析库,更稳定可靠 - 考虑更精确的匹配模式,如
r"style/u\d+fm\d+s\d+\w+\.jpg"
2.3 图片下载功能
def img_download(img_save_path, img_url):
with open(img_save_path, "wb") as f:
f.write(get_html(url=img_url))
关键点:
- 必须以二进制模式("wb")打开文件
- 直接写入获取的二进制数据
- 文件名使用时间戳保证唯一性
2.4 主流程
# 获取网页HTML并解码
html = get_html(url=url).decode()
# 提取所有图片路径
img_path_list = get_img_path_list(html=html)
# 遍历下载每张图片
for img_path in img_path_list:
img_url = url + img_path # 拼接完整URL
img_save_path = f"./images/{time.time()}.jpg" # 生成唯一文件名
img_download(img_save_path=img_save_path, img_url=img_url)
3. 完整代码优化版
import requests
import re
import time
import os
def get_html(url, headers=None):
"""获取网页HTML内容"""
default_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.79"
}
headers = headers or default_headers
try:
res = requests.get(url=url, headers=headers, timeout=10)
res.raise_for_status() # 检查请求是否成功
return res.content
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
def get_img_path_list(html):
"""从HTML中提取图片路径"""
try:
# 更精确的匹配模式
img_path_list = re.findall(r"style/u\d+fm\d+s\d+\w+\.jpg", html.decode('utf-8'))
return list(set(img_path_list)) # 去重
except Exception as e:
print(f"解析HTML失败: {e}")
return []
def img_download(img_save_path, img_url):
"""下载并保存图片"""
img_data = get_html(img_url)
if img_data:
os.makedirs(os.path.dirname(img_save_path), exist_ok=True)
with open(img_save_path, "wb") as f:
f.write(img_data)
print(f"图片已保存: {img_save_path}")
def main():
url = "http://10.9.46.55/pS/"
# 获取网页内容
html = get_html(url)
if not html:
return
# 提取图片路径
img_path_list = get_img_path_list(html)
if not img_path_list:
print("未找到图片链接")
return
# 下载图片
for img_path in img_path_list:
img_url = url + img_path
img_save_path = f"./images/{int(time.time()*1000)}.jpg" # 毫秒级时间戳
img_download(img_save_path, img_url)
if __name__ == "__main__":
main()
4. 进阶优化建议
-
异常处理:
- 增加网络请求超时设置
- 处理HTTP错误状态码
- 捕获并处理各种异常情况
-
性能优化:
- 使用多线程/异步IO提高下载速度
- 实现断点续传功能
- 添加进度显示
-
功能扩展:
- 支持多种图片格式(png, gif等)
- 添加日志记录功能
- 实现配置文件管理
-
反爬策略应对:
- 随机User-Agent
- 使用代理IP
- 设置请求间隔时间
5. 注意事项
-
法律与道德:
- 爬取前检查目标网站的robots.txt
- 尊重网站的服务条款
- 不要对目标网站造成过大访问压力
-
技术限制:
- 本教程仅适用于静态网页
- 动态加载的内容需要其他技术(如Selenium)
- 验证码保护的网站需要额外处理
-
最佳实践:
- 为爬虫添加合理的延迟
- 设置合理的超时时间
- 定期检查并更新爬取规则
通过本教程,您应该掌握了使用Python爬取静态网页图片的基本方法。建议从简单的本地测试网站开始练习,逐步掌握更复杂的爬取技术。