我試圖同時獲取10個網頁。如何在使用curl_multi時防止503錯誤
我正在使用curl_multi。
但是我最終在大部分被抓取的網頁上發現了很多503(太多的請求)錯誤。我怎樣才能解決這個問題?
這是我跑的php腳本。 http://pastebin.com/HhrffciC
你可以在任何支持php的服務器上運行它。
這是我的機器上的輸出看起來像。 http://i.imgur.com/dhnXJwz.jpg
我試圖同時獲取10個網頁。如何在使用curl_multi時防止503錯誤
我正在使用curl_multi。
但是我最終在大部分被抓取的網頁上發現了很多503(太多的請求)錯誤。我怎樣才能解決這個問題?
這是我跑的php腳本。 http://pastebin.com/HhrffciC
你可以在任何支持php的服務器上運行它。
這是我的機器上的輸出看起來像。 http://i.imgur.com/dhnXJwz.jpg
有一個名爲ParallelCurl的庫,可以讓您控制發送多少個同步請求。下面的腳本將最大值設置爲5,並簡單地向您的代碼中的URL發送一系列GET請求。如果這爲您顯示503錯誤(它不適合我),您可以根據您的需要降低$max_requests
。
<?php
require __DIR__ . '/parallelcurl.php';
function on_request_done($content, $url, $ch, $search) {
echo $content;
}
$data = array(
'http://www.codechef.com/status/CLETAB,tacoder',
'http://www.codechef.com/status/CRAWA,tacoder',
'http://www.codechef.com/status/EQUAKE,tacoder',
'http://www.codechef.com/status/MOU2H,tacoder',
'http://www.codechef.com/status/PRGIFT,tacoder',
'http://www.codechef.com/status/PUSHFLOW,tacoder',
'http://www.codechef.com/status/REVERSE,tacoder',
'http://www.codechef.com/status/SEASHUF,tacoder',
'http://www.codechef.com/status/SIGFIB,tacoder',
'http://www.codechef.com/status/TSHIRTS,tacoder'
);
$max_requests = 5;
$parallel_curl = new ParallelCurl($max_requests);
foreach ($data as $url) {
$parallel_curl->startRequest($url, 'on_request_done');
}
$parallel_curl->finishAllRequests();
GitHub自述文件解釋瞭如何進一步使用庫。
看起來你試圖聯繫的服務器不希望你一次發送很多請求(這實際上很聰明,以防止暴力攻擊)。嘗試一次一個請求嗎? – wavemode 2014-09-28 19:55:59
欣賞您的回覆。是的,似乎是這樣。問題是我想同時獲取10個網頁。如果我一個一個地做,它需要15-20秒,這是很多時間,因爲我需要每分鐘運行一次這個腳本。我想知道是否有一種方法可以配置curl_multi函數來延遲請求,以便服務器不會認爲我試圖強制它。任何其他實現該方法的方法也將被讚賞。 – tacoder 2014-09-28 20:12:23
因爲我只會返回json數據,所以我在考慮只是爲了防止php會成爲大腦中的痛苦,也許我可以完全使用不同的語言並在其中進行處理。任何指針,也將不勝感激。 – tacoder 2014-09-28 20:13:56