【实战教程】AI编程助手CodeBuddy玩转网络爬虫:一键获取阴阳师高清壁纸

0 阅读7分钟

本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴

前言

本文将展示如何借助腾讯云代码助手CodeBuddy,仅通过几行简单的提示词,就能快速实现一个功能完整的网络爬虫程序,从网易阴阳师官网一键获取高清壁纸。 通过这个实际案例,你将看到AI编程助手如何真正成为开发者的得力助手,大幅提升编程效率,让复杂任务变得简单。

案例需求分析

我们的目标是从阴阳师官网(yys.163.com/media/pictu…

  1. 爬取阴阳师官网壁纸页面的所有图片
  2. 获取最高分辨率的壁纸(2732x2048)
  3. 处理可能的下载失败情况
  4. 确保下载的图片有唯一的文件名
  5. 使用多线程提高下载效率

使用CodeBuddy生成初始代码

如下图所示,本次我们使用的是CodeBuddyChat模式。由于本次获取的是网络图片壁纸,因此我们的提示词要尽可能详细一些,如下:

编写一份py脚本实现,从该网址中yys.163.com/media/pictu… 获取阴阳师的壁纸, 图片壁纸的地址如下:[url[:url.rindex('/')]+'/2732x2048.jpg' for url in e.xpath('//div[@class="tab-cont"][1]/div/div/img/@data-src')]

CodeBuddy提示词输入

我们将提示词给到CodeBuddy等待其回复完成,看一下关于这种比较复杂的案例是否可以获取到。

查看CodeBuddy对于脚本的说明讲解:

CodeBuddy生成的代码说明

运行项目与问题排查

按照常规流程,我们将代码复制到PyCharm中运行脚本查看效果。项目运行时我们发现问题如下图所示:

运行时遇到的问题

经过分析,我总结了可能存在的问题:

  1. URL地址不正确,导致404错误
  2. 每次生成的壁纸文件名重复,无法正确保存

我们首先检查下载地址是否正确,通过查看网页源码发现地址格式应该没有问题:

源码检查

因此,我们直接将问题反馈给CodeBuddy,提示内容如下:

运行该项目报错如下: 下载失败 yys.res.netease.com/pc/zt/20230…: 404 Client Error: Not Found for url: yys.res.netease.com/pc/zt/20230… 同时发现下载的图片重名无法存储,需要每个下载的图片都有不同的名字

问题解决与优化

根据我们的反馈,CodeBuddy对代码进行了优化,主要解决了以下问题:

  1. 处理404错误:增加了备用方案,当高分辨率图片不存在时,尝试下载较低分辨率的图片
  2. 文件名唯一性:使用时间戳+URL哈希值生成唯一文件名
  3. 增强错误处理:完善了异常捕获和日志输出
  4. 多分辨率支持:尝试多种分辨率,提高下载成功率

使用优化后的代码再次运行,效果明显改善:

优化后的运行效果

成功下载的图片数量明显增加。对于仍然失败的图片,很可能是因为这些链接确实已经失效。

由于图片数量较多,我们在下载一部分后停止了程序运行,查看下载的图片效果:

下载的壁纸效果

完整代码

下面是完整的代码,包含了所有优化和错误处理机制:

import os
import requests
import time
import hashlib
from lxml import html
from urllib.parse import urljoin
from concurrent.futures import ThreadPoolExecutor


def generate_unique_filename(img_url, content):
    """生成唯一文件名:时间戳+URL哈希+分辨率"""
    timestamp = int(time.time())
    url_hash = hashlib.md5(img_url.encode()).hexdigest()[:8]
    resolution = "2732x2048"  # 可根据实际需要调整
    return f"yys_{timestamp}_{url_hash}_{resolution}.jpg"


def download_image(img_url, save_dir='yys_wallpapers'):
    """下载单张图片并保存到本地"""
    try:
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)

        # 先尝试请求图片URL
        response = requests.get(img_url, stream=True, timeout=10)
        response.raise_for_status()

        # 如果返回的是404,尝试备用方案
        if response.status_code == 404:
            # 方案1:尝试将2732x2048替换为1920x1080
            fallback_url = img_url.replace('2732x2048', '1920x1080')
            response = requests.get(fallback_url, stream=True, timeout=10)
            response.raise_for_status()

            # 如果备用方案也失败,尝试原始缩略图
            if response.status_code == 404:
                original_url = img_url.replace('/2732x2048.jpg', '.jpg')
                response = requests.get(original_url, stream=True, timeout=10)
                response.raise_for_status()

        # 生成唯一文件名
        file_ext = 'jpg'
        unique_name = generate_unique_filename(img_url, response.content)
        filepath = os.path.join(save_dir, unique_name)

        # 保存图片
        with open(filepath, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)

        print(f"成功下载: {unique_name} (原始URL: {img_url})")
        return True

    except requests.exceptions.RequestException as e:
        print(f"下载失败 {img_url}: {str(e)}")
        return False
    except Exception as e:
        print(f"处理图片时出错 {img_url}: {str(e)}")
        return False


def get_wallpaper_urls():
    """获取所有壁纸的高清URL(带备用方案)"""
    try:
        # 请求网页
        url = "http://yys.163.com/media/picture.html"
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
            'Referer': 'http://yys.163.com/'
        }
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()

        # 解析HTML
        tree = html.fromstring(response.content)

        # 提取所有可能的图片URL(包括data-src和src)
        img_elements = tree.xpath('//div[@class="tab-cont"][1]//img')
        all_urls = []

        for img in img_elements:
            # 优先取data-src,没有则取src
            img_url = img.get('data-src') or img.get('src')
            if img_url:
                # 转换为高清URL(尝试多种分辨率)
                base_url = url[:url.rindex('/') + 1] if '/' in url else url
                for resolution in ['2732x2048', '1920x1080', '1280x720', 'original']:
                    if resolution == 'original':
                        hd_url = img_url  # 保留原始URL
                    else:
                        hd_url = f"{img_url[:img_url.rindex('/')]}/{resolution}.jpg"

                    # 转换为完整URL
                    full_url = urljoin("http://yys.163.com/media/", hd_url)
                    all_urls.append(full_url)

        # 去重并保留顺序
        seen = set()
        unique_urls = [x for x in all_urls if not (x in seen or seen.add(x))]

        return unique_urls

    except Exception as e:
        print(f"获取壁纸列表失败: {str(e)}")
        return []


def main():
    print("开始获取阴阳师壁纸...")

    # 获取所有可能的壁纸URL
    wallpaper_urls = get_wallpaper_urls()
    if not wallpaper_urls:
        print("未获取到壁纸链接,请检查网络或网站结构是否变化")
        return

    print(f"共发现 {len(wallpaper_urls)} 个潜在壁纸链接")

    # 使用多线程下载(限制并发数为3避免被封)
    success_count = 0
    with ThreadPoolExecutor(max_workers=3) as executor:
        results = executor.map(download_image, wallpaper_urls)
        success_count = sum(results)

    print(f"\n壁纸下载完成!成功下载 {success_count}/{len(wallpaper_urls)} 张")
    print(f"保存目录: {os.path.abspath('yys_wallpapers')}")


if __name__ == '__main__':
    main()

技术要点分析

这个案例涉及了多个Python爬虫的核心技术点:

  1. 网页解析:使用lxml库解析HTML,提取图片URL
  2. HTTP请求:使用requests库发送HTTP请求,获取网页内容和图片
  3. 多线程下载:使用ThreadPoolExecutor实现并发下载,提高效率
  4. 错误处理:完善的异常捕获和处理机制,提高程序健壮性
  5. 文件操作:创建目录、生成唯一文件名、保存文件等
  6. 备用方案:当高分辨率图片不可用时,尝试下载低分辨率版本

总结与思考

通过这个案例,我们可以看到CodeBuddy在实际编程中的强大能力:

  1. 快速实现:仅通过简单的提示词,就能生成功能完整的爬虫代码
  2. 问题解决:根据反馈迅速优化代码,解决实际运行中遇到的问题
  3. 代码质量:生成的代码结构清晰,包含完善的错误处理和注释

同时,这个案例也展示了一些爬虫开发的最佳实践:

  1. 添加合理的User-Agent和Referer头,模拟正常浏览器行为
  2. 限制并发数量,避免对目标服务器造成过大压力
  3. 实现备用下载方案,提高资源获取成功率
  4. 使用唯一文件名,避免文件覆盖问题

通过AI编程助手和人类开发者的协作,我们能够更高效地解决编程问题,这正是AI辅助编程的价值所在。希望这个案例能给大家带来启发,在实际开发中更好地利用AI工具提升效率。