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. 进阶优化建议

  1. 异常处理

    • 增加网络请求超时设置
    • 处理HTTP错误状态码
    • 捕获并处理各种异常情况
  2. 性能优化

    • 使用多线程/异步IO提高下载速度
    • 实现断点续传功能
    • 添加进度显示
  3. 功能扩展

    • 支持多种图片格式(png, gif等)
    • 添加日志记录功能
    • 实现配置文件管理
  4. 反爬策略应对

    • 随机User-Agent
    • 使用代理IP
    • 设置请求间隔时间

5. 注意事项

  1. 法律与道德

    • 爬取前检查目标网站的robots.txt
    • 尊重网站的服务条款
    • 不要对目标网站造成过大访问压力
  2. 技术限制

    • 本教程仅适用于静态网页
    • 动态加载的内容需要其他技术(如Selenium)
    • 验证码保护的网站需要额外处理
  3. 最佳实践

    • 为爬虫添加合理的延迟
    • 设置合理的超时时间
    • 定期检查并更新爬取规则

通过本教程,您应该掌握了使用Python爬取静态网页图片的基本方法。建议从简单的本地测试网站开始练习,逐步掌握更复杂的爬取技术。

Python爬虫基础教学:静态网页图片批量下载 1. 环境准备 1.1 系统环境 操作系统:Windows 10企业版 开发环境:Python 测试服务器:phpstudy (5.4.45) 目标网站:pythonSpider (本地搭建的测试网站) 1.2 Python库依赖 requests :用于发送HTTP请求 re :用于正则表达式匹配 time :用于生成时间戳 2. 爬虫核心代码解析 2.1 获取网页源码 关键点: 必须设置 User-Agent 请求头模拟浏览器访问 res.content 返回的是二进制数据,适合处理图片等非文本内容 对于文本内容,可以使用 res.text 获取解码后的字符串 2.2 提取图片地址 正则表达式解析: r"style/\w*\.jpg" : style/ :匹配固定字符串"style/" \w* :匹配0个或多个字母、数字或下划线 \.jpg :匹配".jpg"后缀(注意 . 需要转义) 改进建议: 可以改用 BeautifulSoup 等HTML解析库,更稳定可靠 考虑更精确的匹配模式,如 r"style/u\d+fm\d+s\d+\w+\.jpg" 2.3 图片下载功能 关键点: 必须以二进制模式("wb")打开文件 直接写入获取的二进制数据 文件名使用时间戳保证唯一性 2.4 主流程 3. 完整代码优化版 4. 进阶优化建议 异常处理 : 增加网络请求超时设置 处理HTTP错误状态码 捕获并处理各种异常情况 性能优化 : 使用多线程/异步IO提高下载速度 实现断点续传功能 添加进度显示 功能扩展 : 支持多种图片格式(png, gif等) 添加日志记录功能 实现配置文件管理 反爬策略应对 : 随机User-Agent 使用代理IP 设置请求间隔时间 5. 注意事项 法律与道德 : 爬取前检查目标网站的robots.txt 尊重网站的服务条款 不要对目标网站造成过大访问压力 技术限制 : 本教程仅适用于静态网页 动态加载的内容需要其他技术(如Selenium) 验证码保护的网站需要额外处理 最佳实践 : 为爬虫添加合理的延迟 设置合理的超时时间 定期检查并更新爬取规则 通过本教程,您应该掌握了使用Python爬取静态网页图片的基本方法。建议从简单的本地测试网站开始练习,逐步掌握更复杂的爬取技术。