2014-10-22 29 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"); 
    } 
}