【问题标题】:Change output filename from WGET when using input file option使用输入文件选项时从 WGET 更改输出文件名
【发布时间】: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.10.jpg.20.jpg.3 等。我不能只计算它们并重命名它们,因为文件可以被破坏,不可用,无论如何。

我尝试使用-O 为每个文件运行一次wget,但速度非常慢:启动程序、连接到站点、下载和结束程序。数千次。这是一个小时与分钟。

所以,我正在尝试找到一种方法来更改 wget 的输出文件名,而不会花费这么长时间。原来的方法效果很好,除非必要,我不想改变太多,但我愿意接受建议。

补充:

LWP::Simple 太简单了。是的,它有效,但非常缓慢。它与运行单个 wget 命令具有相同的问题。每个get()get_store() 调用都会使系统重新连接到服务器。由于文件非常小(平均 60kB),需要处理的文件太多(仅此一个测试文件就有 1851 个),因此连接时间相当长。

我将使用的文件名可以通过/\/(\d+)\/(\d+.jpg)/i 找到,其中文件名只需$1$2 即可获得2027931230.jpg。对于这个问题并不重要。

我现在正在查看 LWP::UserAgentLWP::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,我不确定,但这可能会有所帮助。

标签: perl file-io wget


【解决方案1】:

LWP::Simplegetstore 函数允许您指定要从中获取的 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);

这个问题没有具体说明您需要什么样的重命名方案,但这适用于通过简单地增加文件名直到当前目录不包含该文件名而给出的示例。

【讨论】:

  • 不幸的是,LWP::simple 在链接 wget 调用时也有类似的问题。每个 URL 都会导致与网络服务器再次握手。但是,您的回答确实让我看到了带有 LWP::ConnCache 的 LWP::UserAgent。总下载时间比 lwp::simple 快 5 倍。但它看起来如此之快,以至于它实际上挂断了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2014-10-18
  • 2023-04-02
相关资源
最近更新 更多