【问题标题】:How can I add a progress bar to WWW::Mechanize?如何向 WWW::Mechanize 添加进度条?
【发布时间】:2010-12-28 14:38:06
【问题描述】:

我有以下代码:

$mech->get($someurl, ":content_file" => "$i.flv");

所以我正在获取一个 url 的内容并将其保存为一个 flv 文件。我想每隔一秒左右打印出剩余的下载量。有没有办法在 WWW::Mechanize 中实现这一点?

【问题讨论】:

    标签: perl progress-bar www-mechanize


    【解决方案1】:

    非常感谢 Peter Kovacs 的回答让我找到了正确的答案。结果比我预期的要复杂一些,所以我决定(恐怖地)回答我自己的问题。

    正如彼得所展示的,我可以像这样设置回调:

    $m->get($u, ":content_cb" => \&callback);
    

    但现在我无法使用 :content_file 值保存内容,因为我只能选择两者之一。回调函数获取数据,我最终将其写入文件。

    我还得到一个响应对象,其中包含frido 指出的内容的总大小。因此,通过保持到目前为止收到的内容总数并将其除以总内容,我可以找出已下载内容的百分比。这是完整的回调函数:

    open (VID,">$i.flv") or die "$!";
    $total = 0;
    sub callback
    {
        my( $data, $response, $proto ) = @_;
        print VID "$data"; # write data to file
        $total+= length($data);
        $size = $response->header('Content-Length');
        print floor(($total/$size)*100),"% downloaded\n"; # print percent downloaded
    }
    

    我希望对某人有所帮助。

    【讨论】:

    • 这对我有用。我能够将文件句柄用作仅用于统计的临时文件。我使用\r 退格并将终端保持在一行,因为下载百分比上升,我在$m->get($u, ":content_cb" => \&callback); 之后所做的只是调用$m->save_content($newLocation); 这不会下载内容两次。在 250M 文件上测试。
    【解决方案2】:

    WWW::Mechanize 表示 get 方法是 LWP::UserAgent get 的“良好”重载。查看 LWP::UserAgent 的文档,您可以提供一个 content_cb 密钥,该密钥与下载文件的每个块一起调用:

    $mech->get( $someurl, ":content_cb" => \&callback );
    sub callback
    { 
      my( $data, $response, $proto ) = @_;
      # save $data to $i.flv
      # print download notification
     }
    

    【讨论】:

    • 您还需要一些东西来获取总大小(如果可以从 http 响应标头中获得)
    • 假设服务器发送该标头,您可以通过查看$mech->response->header( 'Content-Length' ) 轻松获得大小。 (对于动态内容,您可能不走运。)
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2012-04-17
    • 2012-02-13
    相关资源
    最近更新 更多