php遠端抓取網站圖片並保存的程式碼

WBOY
發布: 2016-07-25 09:12:59
原創
1032 人瀏覽過

例子,php抓取網站資料的程式碼。

  1. /**
  2. * 一個用來抓取圖片的類別
  3. *
  4. * @package default
  5. * @author WuJunwei
  6. */
  7. class download_image
  8. {
  9. public $save_path;抓取圖片的保存位址
  10. //抓取圖片的大小限制(單位:位元組) 只抓比size比這個限制大的圖片
  11. public $img_size=0;
  12. //定義一個靜態陣列,用來記錄曾經抓取過的的超連結位址,避免重複抓取
  13. public static $a_url_arr=array();
  14. /**
  15. * @param String $save_path 抓取圖片的保存位址
  16. * @param Int $img_size 抓取圖片的保存位址
  17. * /
  18. public function __construct($save_path,$img_size)
  19. {
  20. $this->save_path=$save_path;
  21. $this->img_size=$img_size
  22. }
  23. ; 🎜> /**
  24. * 遞歸下載抓取首頁及其子頁圖片的方法 ( recursive 遞歸)
  25. *
  26. * @param String $capture_url 用於抓取圖片的網址
  27. *
  28. */
  29. public function recursive_download_images($capture_url)
  30. {
  31. if (!in_array($capture_url,self::$a_url_arr)) //沒抓取
  32. {
  33. self::$a_url_arr[]=$capture_url; //計入靜態陣列
  34. } else //抓取過,直接退出函數
  35. {
  36. return;
  37. }
  38. $this->download_current_page_images($capture_url); //下載目前頁面的所有圖片
  39. //用@屏蔽掉因為抓取位址無法讀取導致的warning錯誤
  40. $ content=@file_get_contents($capture_url);
  41. //符合a標籤href屬性中?之前部分的正規
  42. $a_pattern = "|]+href=['" ]? ([^ '"?]+)['" >]|U";
  43. preg_match_all($a_pattern, $content, $a_out, PREG_SET_ORDER);
  44. $tmp_arr=array(); //定義一個陣列,用來存放目前迴圈下抓取圖片的超連結位址
  45. foreach ($a_out as $k => $v)
  46. {
  47. /**
  48. * 去除超連結中的空'','#','/'和重複值
  49. * 1: 超連結位址的值不能等於目前抓取頁面的url, 否則會陷入死循環
  50. * 2: 超連結為''或'#','/'也是本頁,這樣也會陷入死循環,
  51. * 3: 有時一個超連接地址在一個網頁中會重複出現多次,如果不去除,會對一個子頁面進行重複下載)
  52. */
  53. if ( $v[1] && !in_array($v[1],self::$a_url_arr) &&!in_array($v[1],array('#','/',$capture_url) ) )
  54. {
  55. $tmp_arr[]=$v[1];
  56. }
  57. }
  58. foreach ($tmp_arr as $k => $v)
  59. {
  60. / /超連結路徑位址
  61. if ( strpos($v, 'http://')!==false ) //如果url包含http://,可以直接存取
  62. {
  63. $a_url = $v;
  64. }else //否則證明是相對位址, 需要重新拼湊超連結的存取位址
  65. {
  66. $domain_url = substr($capture_url, 0,strpos($capture_url, '/', 8)+1);
  67. $a_url=$domain_url.$v;
  68. }
  69. $this->recursive_download_images($a_url);
  70. }
  71. }
  72. }
  73. }
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85. }
  86. /**
  87. * 下載目前網頁下的所有圖片
  88. *
  89. * @param String $capture_url 用於抓取圖片的網頁位址
  90. * @return Array 目前網頁上所有圖片img標籤url位址的一個數組
  91. */
  92. public function download_current_page_images($capture_url)
  93. { $content=@file_get_contents($capture_url); //屏蔽錯誤 $content=@file_get_contents($capture_url); //屏蔽錯誤 符合img標籤src屬性中?之前部分的正規 $img_pattern = "|php遠端抓取網站圖片並保存的程式碼]+src=['" ]?([^ '"?]+)['" >]|U" ; preg_match_all($img_pattern, $content, $img_out, PREG_SET_ORDER); $photo_num = count($img_out); //符合到的圖片數量 echo '

    '.$capture_url . "共找到" . $photo_num . " 張圖片

    "; foreach ($img_out as $k => $v) { $this->save_one_img ($capture_url,$v[1]); } }
  94. /**
  95. * 儲存單一圖片的方法
  96. *
  97. * @param String $capture_url 用來抓取圖片的網頁位址
  98. * @param String $img_url 需要儲存的圖片的url
  99. *
  100. */
  101. public function save_one_img($capture_url,$img_url)
  102. {
  103. //圖片路徑位址
  104. if ( strpos($img_url, ' http://')!==false )
  105. {
  106. // $img_url = $img_url;
  107. }else
  108. {
  109. $domain_url = substr($capture_url, 0,strpos( $capture_url, '/',8)+1);
  110. $img_url=$domain_url.$img_url;
  111. }
  112. $pathinfo = pathinfo($img_url); //取得圖片路徑資訊
  113. $pic_name=$pathinfo['basename']; //取得圖片的名稱
  114. if (file_exists($this->save_path.$pic_name)) //如果圖片存在,證明已經被抓取過,退出函數
  115. {
  116. echo $img_url . '該圖片已經抓取過!
    ';
  117. return;
  118. }
  119. //將圖片內容讀入一個字串
  120. $img_data = @file_get_contents($img_url); //屏蔽掉因為圖片位址無法讀取導致的warning錯誤
  121. if ( strlen( $img_data) > $this->img_size ) //下載size比限制大的圖片
  122. {
  123. $img_size = file_put_contents($this->save_path . $pic_name, $img_data);
  124. if ($ img_size)
  125. {
  126. echo $img_url . '圖片儲存成功!
    ';
  127. } else
  128. {
  129. echo $img_url . '圖片儲存失敗!
    ';
  130. }
  131. } else
  132. {
  133. echo $img_url . '圖片讀取失敗!
    ';
  134. }
  135. }
  136. } // END
  137. set_time_limit(120); //設定腳本的最大執行時間依情況設定
  138. $download_img=new download_image('E:/images/',0); //實例化下載圖片物件
  139. $download_img->recursive_download_images('http://bbs.it-home.org/'); //遞迴抓取圖片方法
  140. //$download_img->download_current_page_images( $_POST['capture_url']); //只抓取目前頁面圖片方法
  141. ?>
複製程式碼


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!