2014-10-22 30 views
0

我正在寻找重写一个Python脚本,我已经通过链接列表,然后从它获取的页面中提取一些日子。限制使用Guzzle/Goutte时的请求大小

出现的一个问题是,如果链接是图像或zip或甚至ISO,我不想下载整个文件。我可以尝试检查扩展名,但这并不总是奏效。

在我的Python脚本中,我做了两件事。

  • 一旦我连接到网站,我检查内容类型标题。 Python似乎能够在不下载整个文件的情况下做到这一点。

  • 限制我在我的请求中下载的URL有多少到150kb。由于我只是在HTML页面之后,所以这会覆盖它。

我想为这个项目使用Guzzle,但是查看文档我不确定这是否可以完成。

我的主要问题是确保我没有下载ISO文件或视频并使用所有的RAM或带宽。

+0

您使用的是什么版本的Guzzle? Goutte 1.0.6使用3,更高版本至少使用4个。如果您使用的是早期版本,那么'request.before_send'事件可能会在插件中执行。 – halfer 2015-01-22 20:21:20

+0

如果其他人正在寻找这个功能,似乎有[一些Guzzle事件](https://github.com/guzzle/guzzle3/blob/master/docs/http-client/request.rst#events-emitted-从请求),特别是'curl.callback.progress',这是值得调查的。看起来它需要一个cURL选项来设置事件在下载过程中触发。 – halfer 2015-03-26 23:09:45

+0

我想我有一个未经测试的解决方案,对于Guzzle 3.如果有人愿意,可以在这里ping我,这样我就可以快速测试它,因此可以发布。 – halfer 2015-03-29 16:38:51

回答

0

来自guzzle 6文档。 stream:设置为true来传输响应,而不是预先下载。

您只能使用此功能下载第一个150 KB。

$client = new Client(); 
$response = $client->get($url, [ 
    'stream' => true, 
]); 
$body = $response->getBody(); 

$bytesRead = 0; 
$dataRead = ""; 
while (!$body->eof()) { 
    $data = $body->read(1024); 
    $dataRead .= $data; 
    $bytesRead += strlen($data); 
    if($bytesRead >= 150*1024) { 
     $body->close(); 
     throw new \Exception("exceeded download limit"); 
    } 
}