PHP批量採集下載美女圖片的實現代碼_PHP教程

來源:互聯網
上載者:User
設計思路

考慮到單純的採集一個網頁的圖片,太麻煩,所以直接採集他的列表頁,擷取列表的url然後在一一採集,但是用php匹配列表頁的url太麻煩,第一列表頁有很多無效url這對我這個正則小菜鳥實在是個問題,看了一下列表頁的結構,果斷採用jquery擷取url,jquery的萬能選取器又再次強大起來了。

jquery擷取url,然後ajax傳遞url—>對應PHP檔案,遍曆url參數—->單頁面採集儲存圖片

jquery程式
複製代碼 代碼如下:




這裡把url拼接成‘,'分割的字串傳遞url,使用getjson是為了跨域需要,關於getjson常見的幾個問題可以參看<$.getjson遇到的幾個問題>

PHP採集程式
複製代碼 代碼如下:
// 抓起365圖片
error_reporting(E_ALL ^ E_NOTICE);
set_time_limit(0);//設定PHP逾時時間
/**
* 得到目前時間
*/
function getMicrotime() {

list ($usec, $sec) = explode(" ", microtime());
return ((float) $usec + (float) $sec);
}
$stime = getMicrotime();

$callback = $_GET['callback'];
$hrefs = $_GET['hrefs'];
$urlarray = explode(',',$hrefs);

//擷取指定url的所有圖片
function getimgs($url){
$dirname = basename($url,".php");
if(!file_exists($dirname)){
mkdir('365/'.$dirname.'');
}
clearstatcache();
$data = file_get_contents($url);
preg_match_all("/(href|src)=(["|']?)([^ "'>]+.(jpg|png|PNG|JPG|gif))\2/i", $data, $matches);
//$matches[3] = array_unique($matches[3]);
unset($data);
$i=0;

if(count($matches[3])>0){
foreach($matches[3] as $k=>$v){
//簡單判斷是否是標準url,而不是相對路徑
if(substr($v,0,4)=='http'){

$ext = pathinfo($v,PATHINFO_EXTENSION);//圖片擴充

if(!file_exists('365/'.$dirname.'/'.$k.'.'.$ext)){
file_put_contents('365/'.$dirname.'/'.$k.'.'.$ext,file_get_contents($v));
$i++;
}else{
unset($v);
}
clearstatcache();
}else{
unset($v);
}
}
unset($matches);
return $i;
}
}

foreach($urlarray as $k=>$v){
if($v!=''){
$j +=getimgs($v);
}
}
$etime = getMicrotime();
echo "合計採集了".$j."張圖片";
echo "用時".($etime-$stime)."秒";


考慮到效能問題:在getimgs方法中所用的變數都是使用後便登出(unset)了,以便釋放記憶體。

設計到的幾個知識點

判斷是否是標準有效圖片url
if(substr($v,0,4)=='http')這個只是簡單的判斷一下匹配到的圖片url是否是標準的url,因為採集的圖片可能是相對路徑的,這裡我直接放棄這種圖片的採集,當然你也可以把這種圖片還原成標準圖片路徑,還有一個問題就是即使是標準url格式,這樣的圖片也未必可以採集,因為你不知道這個圖片是否還有,也許這個圖片url已經無效了,如果你想更嚴格的判斷這個圖片url是否真實有效可以推薦看我之前的《PHP判斷遠程url是否有效幾種方法》有三種方法可以驗證是否是有效url。

擷取圖片格式

$ext = pathinfo($v,PATHINFO_EXTENSION);//圖片擴充

這裡使用了pathinfo的方法,總結有7種方法可以擷取到檔案的格式,推薦文章:《PHP判斷圖片格式的七種方法》

下載儲存到本地

file_put_contents('365/'.$dirname.'/'.$k.'.'.$ext,file_get_contents($v));
file_put_contents() 函數把一個字串寫入檔案中。
與依次調用 fopen(),fwrite() 以及 fclose() 功能一樣。
file_get_contents() 函數把整個檔案讀入一個字串中。

因為伺服器支援file_get_contents,如果伺服器把這個函數禁用了,可以使用curl,這個工具要比file_get_contents更加強大,推薦學習《CURL的學習和應用(附多線程)》,可以使用curl的多線程下載儲存,效果更牛逼

清除檔案操作緩衝

clearstatcache() 函數清除檔案狀態緩衝。clearstatcache() 函數會緩衝某些函數的返回資訊,以便提供更高的效能。但是有時候,比如在一個指令碼中多次檢查同一個檔案,而該檔案在此指令碼執行期間有被刪除或修改的危險時,你需要清除檔案狀態緩衝,以便獲得正確的結果。要做到這一點,就需要使用 clearstatcache() 函數。官方手冊:

程式執行時間計算

複製代碼 代碼如下:
/**

* 得到目前時間

*/

function getMicrotime() {
list ($usec, $sec) = explode(" ", microtime());
return ((float) $usec + (float) $sec);
}


可以參考本部落格文章;《擷取php頁面執行時間,資料庫讀寫次數,函數調用次數等【THINKPHP】》

最後看一下效果;



409秒採集了214張圖片,大概2秒下載儲存了一張圖片,圖片總大小約62M,這樣看來:

一個小時60*60可以大約下載1800張美女圖片。

http://www.bkjia.com/PHPjc/327182.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327182.htmlTechArticle設計思路 考慮到單純的採集一個網頁的圖片,太麻煩,所以直接採集他的列表頁,擷取列表的url然後在一一採集,但是用php匹配列表頁的...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.