我有一个我编写的perl脚本,它获取一些图像URLs,将这些urls放入一个输入文件中,然后使用--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::ConnCache查看LWP::UserAgent,但它超时和/或在我的pc上挂起。我需要调整超时和重试值。代码的首次运行在挂起前几分钟就下载了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());
}发布于 2014-06-26 13:10:28
LWP::Simple的getstore函数允许你指定要从中获取数据的URL以及从中存储数据的文件名。对于许多与wget相同的用例,它都是一个很好的模块,但它的优点在于它是一个Perl模块(即不需要外包给外壳或派生子进程)。
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);这个问题并没有具体说明您需要哪种重命名方案,但这对于给出的示例是有效的,只需递增文件名,直到当前目录不包含该文件名。
https://stackoverflow.com/questions/24421804
复制相似问题