【问题标题】:Retrieve partial web page检索部分网页
【发布时间】:2010-12-05 01:37:43
【问题描述】:

有什么方法可以限制 CURL 获取的数据量吗?我正在从 50kb 的页面上抓取数据,但是我需要的数据位于页面的顶部 1/4,所以我真的只需要检索页面的前 10kb。

我之所以这么问,是因为我需要监控大量数据,这导致我每月传输近 60GB 的数据,而这个带宽中只有大约 5GB 是相关的。

我正在使用 PHP 来处理数据,但是我的数据检索方法很灵活,我可以使用 CURL、WGET、fopen 等。

我正在考虑的一种方法是

$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);

上述是否意味着我只会从 www.website.com 传输 6kb,或者 fopen 会将 www.website.com 加载到内存中意味着我仍会传输全部 50kb?

【问题讨论】:

    标签: php curl web-scraping wget fopen


    【解决方案1】:

    您也可以使用 CURL 完成您正在寻找的事情。

    如果您查看CURLOPT_WRITEFUNCTION 的文档,您可以注册一个回调,只要数据可用于从 CURL 读取,就会调用该回调。然后您可以计算收到的字节数,当您收到超过 6,000 个字节时,您可以返回 0 以中止其余的传输。

    libcurl 文档对回调进行了更多描述:

    一旦收到需要处理的数据,libcurl 就会调用此函数 保存。返回字节数 实际上照顾。如果那个金额 不同于传递给您的金额 函数,它会向 库,它将中止传输 并返回 CURLE_WRITE_ERROR。

    回调函数将被传递 尽可能多的数据 调用,但你不可能使 任何假设。它可能是一个字节, 可能是数千。

    【讨论】:

    • 我已将此标记为已接受的答案,因为它比可能并不总是受支持的 HTTP Range 请求更强大,我只能标记一个答案。
    【解决方案2】:

    试试HTTP RANGE request

    GET /largefile.html HTTP/1.1
    Range: bytes=0-6000
    

    if the server supports range requests,它将返回 206 Partial Content 响应代码,其中包含 Content-Range 标头和您请求的字节范围(如果没有,它将返回 200 和整个文件)。有关范围请求的详细说明,请参阅 http://benramsey.com/archives/206-partial-content-and-range-requests/

    另见Resumable downloads when using PHP to send the file?

    【讨论】:

      【解决方案3】:

      这实际上是一个 HTTP 而不是一个 CURL 问题。

      如您所料,如果您使用 fopen,将会下载整个页面。不管你是否在偏移量 5000 处寻找。

      如 HTML RFC (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) 中所述,实现您想要的最佳方式是使用部分 HTTP GET 请求:

      GET 方法的语义变化 如果请求,则为“部分 GET” 消息包含 Range 标头字段。 部分 GET 请求仅部分 被转让的实体,如 在第 14.35 节中描述。这 部分 GET 方法旨在 减少不必要的网络使用 允许部分检索的实体 无需转移即可完成 客户已经持有的数据。

      这里描述了使用 Ranges 的部分 GET 请求的详细信息: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2

      【讨论】:

        【解决方案4】:

        它将使用fopen 调用下载整个页面,但随后它只会从该页面读取 6kb。

        来自 PHP 手册:

        只要满足以下条件之一,就会停止阅读:

        • 长度字节已被读取

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-17
          • 2016-08-17
          • 1970-01-01
          • 2019-02-05
          • 1970-01-01
          • 1970-01-01
          • 2020-11-03
          • 1970-01-01
          相关资源
          最近更新 更多