我有一个我编写的perl脚本,它获取了一些图像URL,将url放入输入文件,然后使用--input-file
选项运行wget。这完美地工作......或者至少它只要图像文件名是唯一的。
我有一家新公司向我发送数据,他们使用非常TROUBLESOME命名方案。所有文件在不同的文件夹中都具有相同的名称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)。使用简单,我在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());
}
答案 0 :(得分:1)
LWP::Simple getstore
函数允许您指定要从中获取的URL以及用于存储数据的文件名。它是许多的优秀模块。与wget
相同的用例,但有一个Perl模块的好处(即不需要外包到shell或生成子进程)。
use LWP::Simple;
# Grab the filename from the end of the URL
my $filename = (split '/', $url)[-1];
# If the file exists, increment its name
while (-e $filename)
{
$filename =~ s{ (\d+)[.]jpg }{ $1+1 . '.jpg' }ex
or die "Unexpected filename encountered";
}
getstore($url, $filename);
这个问题并没有确切地说明你需要什么样的重命名方案,但是这对于通过简单地递增文件名直到当前目录不包含该文件名而给出的示例是有效的。