【问题标题】:How do I fetch just the beginning of a Web page with LWP?如何使用 LWP 仅获取网页的开头?
【发布时间】:2012-06-11 16:36:10
【问题描述】:

有谁知道在 GET 或 POST 请求中仅获取 50% 网页的最佳方法?我获取的网页需要 10 到 20 秒才能完全加载,我只需要从页面开头过滤几行。

【问题讨论】:

    标签: perl lwp


    【解决方案1】:
    use 5.010;
    use strictures;
    use LWP::UserAgent qw();
    
    my $content;
    LWP::UserAgent->new->get(
        $url,
        ':content_cb' => sub {
            my ($chunk, $res) = @_;
            state $length = $res->header('Content-Length');
            $content .= $chunk;
            die if length($content) / $length > 0.5;
        },
    );
    

    【讨论】:

    • 使用限制; ?你的意思是“严格”,还是……?
    • 不要使用strictures。保存一行代码就是一个完整的CPAN依赖。
    • 使用限制:谁可以安装 LWP 也可以安装该模块,额外费用可以忽略不计。保存一整行代码只是一个依赖项,是我单独在 SO 上使用它的 27 次。
    • @daxim,如果你想把它最大化到一兆字节怎么办?那么代码将如何更改?我尝试将底部更改为“die if length($content) == 1”,但这似乎不起作用。
    • length($content) >= 1024 ** 2
    【解决方案2】:

    如果有问题的网站提供了Content-Length 标头,您可以只询问要发送多少数据,然后只请求其中的一半。

    此代码演示。

    use strict;
    use warnings;
    
    use LWP;
    
    my $ua = LWP::UserAgent->new;
    my $url = 'http://website.test';
    
    my $resp = $ua->head($url);
    my $half = $resp->header('Content-Length') / 2;
    
    $resp = $ua->get($url, Range => "bytes=1-$half");
    my $content = $resp->content;
    

    【讨论】:

    • 我尝试了这段代码,它只给了我整个页面。我在这里缺少什么吗?
    • HTTP spec §14.35.2: "服务器可以忽略 Range 标头。"动态响应很少实现 HTTP 范围。
    【解决方案3】:

    如果 Web 应用程序需要很长时间来呈现页面,您通常无法通过获取页​​面的“一半”来加速该过程。

    页面将在所有数据库查询和实际渲染完成后交付。这些很可能是造成长时间延误的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      相关资源
      最近更新 更多