检索部分网页

时间:2009-10-08 16:29:00

标签: php curl web-scraping wget fopen

有没有办法限制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,或者会将www.website.com加载到内存中,这意味着我仍然会传输完整的50kb?

4 个答案:

答案 0 :(得分:4)

这更像是一个实际上是CURL问题的HTTP。

正如您所猜测的,如果您使用fopen,将会下载整个页面。无论如何你是否寻求抵消5000。

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

  

GET方法的语义发生了变化   如果请求,则为“部分GET”   消息包括Range头字段。   部分GET请求只是部分   被转让的实体,如   在第14.35节中描述。该   部分GET方法旨在   减少不必要的网络使用量   允许部分检索的实体   完成而不转移   已经由客户持有的数据。

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

答案 1 :(得分:3)

尝试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?

答案 2 :(得分:2)

您也可以使用CURL完成您正在寻找的内容。

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

libcurl文档更多地描述了回调:

  

只要收到需要的数据,libcurl就会调用此函数   保存。返回字节数   实际上照顾好了。如果那个数额   与传递给您的金额不同   功能,它会发出错误信号   图书馆,它将中止转移   并返回CURLE_WRITE_ERROR。

     

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

答案 3 :(得分:0)

它将通过fopen调用下载整个页面,但之后只能从该页面读取6kb。

从PHP手册:

  

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

     
      
  • 长度字节已被读取
  •