【发布时间】:2014-06-26 03:15:21
【问题描述】:
我编写了一个 perl 脚本,它获取一些图像 URL,将这些 URL 放入输入文件,然后使用 --input-file 选项继续运行 wget。这可以完美地工作......或者至少只要图像文件名是唯一的就可以了。
我有一家新公司向我发送数据,他们使用非常麻烦的命名方案。所有文件在不同的文件夹中都具有相同的名称0.jpg。
例如:
cdn.blah.com/folder/folder/202793000/202793123/0.jpg
cdn.blah.com/folder/folder/198478000/198478725/0.jpg
cdn.blah.com/folder/folder/198594000/198594080/0.jpg
当我用它运行我的脚本时,wget 工作正常并下载所有图像,但它们的标题为0.jpg.1、0.jpg.2、0.jpg.3 等。我不能只计算它们并重命名它们,因为文件可以被破坏,不可用,无论如何。
我尝试使用-O 为每个文件运行一次wget,但速度非常慢:启动程序、连接到站点、下载和结束程序。数千次。这是一个小时与分钟。
所以,我正在尝试找到一种方法来更改 wget 的输出文件名,而不会花费这么长时间。原来的方法效果很好,除非必要,我不想改变太多,但我愿意接受建议。
补充:
LWP::Simple 太简单了。是的,它有效,但非常缓慢。它与运行单个 wget 命令具有相同的问题。每个get() 或get_store() 调用都会使系统重新连接到服务器。由于文件非常小(平均 60kB),需要处理的文件太多(仅此一个测试文件就有 1851 个),因此连接时间相当长。
我将使用的文件名可以通过/\/(\d+)\/(\d+.jpg)/i 找到,其中文件名只需$1$2 即可获得2027931230.jpg。对于这个问题并不重要。
我现在正在查看 LWP::UserAgent 和 LWP::ConnCache,但它超时和/或挂在我的电脑上。我需要调整超时和重试值。代码的首次运行在挂起前几分钟内下载了 693 张图像 (43mb)。使用 simple,我在 5 分钟内只得到了 200 张图片。
use LWP::UserAgent;
use LWP::ConnCache;
chomp(@filelist = <INPUTFILE>);
my $browser = LWP::UserAgent->new;
$browser->conn_cache(LWP::ConnCache->new());
foreach(@filelist){
/\/(\d+)\/(\d+.jpg)/i
my $newfilename = $1.$2;
$response = $browser->mirror($_, $folder . $newfilename);
die 'response failure' if($response->is_error());
}
【问题讨论】:
-
如果您仍然在 Perl 中执行此操作,为什么不以“正确”的方式执行此操作并通过 LWP 检索您的 URL?
-
我最初确实使用了
LWP::simple,但它太慢了。将调用发送到 wget 允许 http keep-alive,并且速度要快很多倍。我应该指定这些图像每个大约 60kB,因此下载基本上是即时的,并且保持活动是必不可少的。我正在查看lwp::UserAgent虽然与lwp::conncache,但它偶尔会挂起。运行的下载速度非常快,在失败之前很快就获得了 693 (43mb)。 -
试试
File::Fetch,我不确定,但这可能会有所帮助。