如何修改必应壁纸下载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
相关产品推荐
相关产品推荐

