You need to enable JavaScript to run this app. 如何修改必应壁纸下载Perl脚本以倒序遍历历史日期批量拉取图片
优惠活动
大模型
产品
解决方案
定价
更多

如何修改必应壁纸下载Perl脚本以倒序遍历历史日期批量拉取图片

必应历史壁纸批量下载Perl脚本改造

原有脚本局限

你手里的初始脚本仅能下载当日的必应壁纸,核心流程是请求必应公开图片接口、解析返回的JSON数据、将对应图片存到本地指定目录。你需要实现的倒序遍历历史壁纸功能,不需要从零改动逻辑,利用接口本身的参数特性即可快速实现。

核心实现逻辑

必应的壁纸存档接口自带idx偏移参数,规则非常简单:

  • 参数值为0时返回当日壁纸
  • 参数值每增加1,返回的壁纸日期向前推1天
  • 参数值越大,返回的壁纸日期越早,完全匹配你需要的倒序遍历需求

不需要手动计算日期、拼接日期字符串去逐次请求,只要循环递增这个偏移值就能覆盖所有历史存档。脚本会保持无限循环运行,你不需要设置自动停止条件,随时可以手动终止脚本

可直接运行的改造后代码

#!/usr/bin/perl
$\="\n";
use strict;
use warnings;
use LWP::Simple;
use JSON;
use POSIX qw/sleep/;

# 基础配置
my $base_url = "http://www.bing.com/";
# 接口模板:n=1每次返回1张图,idx动态传入实现偏移
my $api_template = "http://www.bing.com/HPImageArchive.aspx?format=js&n=1&mkt=en-US&idx=%d";
my $output_dir = "C:\\Downloads\\Wallpaper";

# 从当日开始,无限倒序遍历历史壁纸
my $offset = 0;
while (1) {
    my $current_url = sprintf($api_template, $offset);
    print "开始拉取偏移量 $offset 对应的壁纸";

    # 请求接口
    my $resp_content = get($current_url);
    unless ($resp_content) {
        print "请求失败,跳过当前偏移 $offset";
        $offset++;
        sleep 1;
        next;
    }

    # 解析返回JSON
    my $json_data = eval { from_json($resp_content) };
    if ($@ || !$json_data || !@{$json_data->{images}}) {
        print "接口无有效返回,你可以按Ctrl+C终止脚本";
        $offset++;
        sleep 1;
        next;
    }

    my $img_info = $json_data->{images}[0];
    my $full_img_url = $base_url . $img_info->{url};
    # 直接用接口返回的壁纸日期命名文件,避免本地时区误差
    my $wallpaper_date = $img_info->{startdate};
    my $file_name = "$output_dir\\$wallpaper_date.jpg";

    # 跳过已下载的文件,支持断点续传
    if (-f $file_name && -s $file_name > 0) {
        print "文件 $wallpaper_date.jpg 已存在,跳过下载";
        $offset++;
        sleep 1;
        next;
    }

    print "壁纸地址: $full_img_url";
    print "保存路径: $file_name";

    # 下载文件
    my $download_status = getstore($full_img_url, $file_name);
    if ($download_status == 200) {
        my $file_size = -s $file_name;
        if ($file_size > 0) {
            print "下载完成,文件大小 $file_size 字节\n";
        } else {
            print "下载到0字节空文件,稍后自动重试";
            unlink $file_name;
        }
    } else {
        print "下载返回状态码: $download_status\n";
    }

    # 递增偏移,控制请求频率,避免被临时限流
    $offset++;
    sleep 1;
}

关键优化说明

  • 移除了无用的Data::Dumper模块引用,减少不必要的依赖加载
  • 新增本地文件存在判断,脚本中断后重新运行不会重复下载已保存的壁纸
  • 新增1秒的请求间隔,降低触发必应反爬机制的概率
  • 直接使用接口返回的官方壁纸日期作为文件名,避免本地时区和接口日期不一致导致的文件命名混乱
  • 异常场景做了容错处理:请求失败、JSON解析出错、空文件等情况都会自动跳过,不会直接导致脚本崩溃

前置准备:运行脚本前请手动创建C:\Downloads\Wallpaper目录,否则会出现下载路径不存在的报错。


内容的提问来源于stack exchange,提问作者Carlos Lopez Infante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 21:15:08