首頁 後端開發 php教程 PHP抓取網站圖片腳本

PHP抓取網站圖片腳本

Jul 29, 2016 am 09:14 AM
CAPTURE download img path url

方法一:

<code><span><?php</span>
header(<span>"Content-type:image/jpeg"</span>); 
<span><span>class</span><span>download_image</span>{</span><span><span>function</span><span>read_url</span><span>(<span>$str</span>)</span>    {</span><span>$file</span>=fopen(<span>$str</span>,<span>"r"</span>);
        <span>$result</span> = <span>''</span>; 
        <span>while</span>(!feof(<span>$file</span>)) 
        { 
            <span>$result</span>.=fgets(<span>$file</span>,<span>9999</span>); 
        } 
        fclose(<span>$file</span>); 
        <span>return</span><span>$result</span>; 

    } 
    <span><span>function</span><span>save_img</span><span>(<span>$str</span>)</span>    {</span><span>$result</span>=<span>$this</span>->read_url(<span>$str</span>); 
        <span>$result</span>=str_replace(<span>"\""</span>,<span>""</span>,<span>$result</span>); 
        <span>$result</span>=str_replace(<span>"\'"</span>,<span>""</span>,<span>$result</span>); 

        preg_match_all(<span>'/<img\ssrc=(http:\/\/.*?)(\s(.*?)>|>)/i'</span>,<span>$result</span>,<span>$matches</span>); 

        <span>foreach</span>(<span>$matches</span>[<span>1</span>] <span>as</span><span>$value</span>) 
        { 
            <span>echo</span><span>$value</span>.<span>"\n"</span>; 
            <span>$this</span>->GrabImage(<span>$value</span>,<span>$filename</span>=<span>""</span>); 
        } 
    } 
    <span>// $url 是远程图片的完整URL地址,不能为空。 </span><span>// $filename 是可选变量: 如果为空,本地文件名将基于时间和日期 </span><span>// 自动生成. </span><span><span>function</span><span>GrabImage</span><span>(<span>$url</span>,<span>$filename</span>=<span>""</span>)</span> {</span><span>if</span>(<span>$url</span>==<span>""</span>):<span>return</span><span>false</span>;<span>endif</span>; 
        <span>$path</span>=<span>"download/"</span>; <span>//指定存储文件夹 </span><span>//若文件不存在,则创建; </span><span>if</span>(!file_exists(<span>$path</span>)){ 
            mkdir(<span>$path</span>); 
        } 

        <span>if</span>(<span>$filename</span>==<span>""</span>) { 
            <span>$ext</span>=strrchr(<span>$url</span>,<span>"."</span>); 
            <span>if</span>(<span>$ext</span>!=<span>".gif"</span> && <span>$ext</span>!=<span>".jpg"</span>):<span>return</span><span>false</span>;<span>endif</span>; 
            @<span>$filename</span>=<span>$path</span>.date(<span>"YHis"</span>).<span>$ext</span>; 
        } 

        ob_start(); 
        readfile(<span>$url</span>); 
        <span>$img</span> = ob_get_contents(); 
        ob_end_clean(); 
        <span>$size</span> = strlen(<span>$img</span>); 

        <span>$fp2</span>=@fopen(<span>$filename</span>, <span>"a"</span>); 
        fwrite(<span>$fp2</span>,<span>$img</span>); 
        fclose(<span>$fp2</span>); 

        <span>return</span><span>$filename</span>; 
    }
}
<span>$download_img</span>=<span>new</span> download_image();
<span>$download_img</span>->save_img(<span>"http://www.jb51.net"</span>); 
<span>?></span></span></code>
登入後複製

方法一想法比較簡單清晰,不過有個BUG,圖片沒有完全抓取,有時間再檢查看!

方法二:

<code><span><span><?php</span><span><span>class</span><span>download_image</span>{</span><span>//抓取图片的保存地址</span><span>public</span><span>$save_path</span>;   
    <span>//抓取图片的大小限制(单位:字节) 只抓比size比这个限制大的图片</span><span>public</span><span>$img_size</span>=<span>0</span>; 
    <span>//定义一个静态数组,用于记录曾经抓取过的的超链接地址,避免重复抓取       </span><span>public</span><span>static</span><span>$a_url_arr</span>=<span>array</span>();

    <span>/**
     *<span> @param</span> String $save_path    抓取图片的保存地址
     *<span> @param</span> Int    $img_size     
     */</span><span>public</span><span><span>function</span><span>__construct</span><span>(<span>$save_path</span>,<span>$img_size</span>)</span>{</span><span>$this</span>->save_path=<span>$save_path</span>;
        <span>$this</span>->img_size=<span>$img_size</span>;
        <span>if</span>(!file_exists(<span>$save_path</span>)){
            mkdir(<span>$save_path</span>,<span>0775</span>);
        }
    }
    <span>/**
     * 递归下载抓取首页及其子页面图片的方法  ( recursive 递归)
     *<span> @param</span>   String  $capture_url  用于抓取图片的网址
     */</span><span>public</span><span><span>function</span><span>recursive_download_images</span><span>(<span>$capture_url</span>)</span>{</span><span>if</span> (!in_array(<span>$capture_url</span>,<span>self</span>::<span>$a_url_arr</span>)){   <span>//没抓取过</span><span>self</span>::<span>$a_url_arr</span>[]=<span>$capture_url</span>;   <span>//计入静态数组</span>
        } <span>else</span> {   <span>//抓取过,直接退出函数</span><span>return</span>;
        }
        <span>$this</span>->download_current_page_images(<span>$capture_url</span>);  <span>//下载当前页面的所有图片</span><span>//用@屏蔽掉因为抓取地址无法读取导致的warning错误</span><span>$content</span>=@file_get_contents(<span>$capture_url</span>); 
        <span>//匹配<strong>a标签</strong>href属性中?之前部分的正则</span><span>$a_pattern</span> = <span>"|<a[^>]+href=['\" ]?([^ '\"?]+)['\" >]|U"</span>;   
        preg_match_all(<span>$a_pattern</span>, <span>$content</span>, <span>$a_out</span>, PREG_SET_ORDER);
        <span>$tmp_arr</span>=<span>array</span>();  <span>//定义一个数组,用于存放当前<strong>循环</strong>下抓取图片的超链接地址</span><span>foreach</span> (<span>$a_out</span><span>as</span><span>$k</span> => <span>$v</span>) {
            <span>/**
             * 去除超链接中的 空'','#','/'和重复值  
             * 1: 超链接地址的值 不能等于当前抓取页面的url, 否则会陷入死<strong>循环</strong>
             * 2: 超链接为''或'#','/'也是本页面,这样也会陷入死<strong>循环</strong>,  
             * 3: 有时一个超连接地址在一个网页中会重复出现多次,如果不去除,会对一个子页面进行重复下载)
             */</span><span>if</span> ( <span>$v</span>[<span>1</span>] && !in_array(<span>$v</span>[<span>1</span>],<span>self</span>::<span>$a_url_arr</span>) &&!in_array(<span>$v</span>[<span>1</span>],<span>array</span>(<span>'#'</span>,<span>'/'</span>,<span>$capture_url</span>) ) ) { 
                <span>$tmp_arr</span>[]=<span>$v</span>[<span>1</span>];
            }
        }
        <span>foreach</span> (<span>$tmp_arr</span><span>as</span><span>$k</span> => <span>$v</span>){ 
            <span>//超链接路径地址</span><span>if</span> ( strpos(<span>$v</span>, <span>'http://'</span>)!==<span>false</span> ){ <span>//如果url包含http://,可以直接访问</span><span>$a_url</span> = <span>$v</span>;
            }<span>else</span>{   <span>//否则证明是相对地址, 需要重新拼凑超链接的访问地址</span><span>$domain_url</span> = substr(<span>$capture_url</span>, <span>0</span>,strpos(<span>$capture_url</span>, <span>'/'</span>,<span>8</span>)+<span>1</span>);
                <span>$a_url</span>=<span>$domain_url</span>.<span>$v</span>;
            }
            <span>$this</span>->recursive_download_images(<span>$a_url</span>);
        }
    }
    <span>/**
     * 下载当前网页下的所有图片 
     *<span> @param</span>   String  $capture_url  用于抓取图片的网页地址
     *<span> @return</span>  Array   当前网页上所有图片img标签url地址的一个数组
     */</span><span>public</span><span><span>function</span><span>download_current_page_images</span><span>(<span>$capture_url</span>)</span>{</span><span>$content</span>=@file_get_contents(<span>$capture_url</span>);   <span>//屏蔽warning错误</span><span>//匹配img标签src属性中?之前部分的正则</span><span>$img_pattern</span> = <span>"|<img[^>]+src=['\" ]?([^ '\"?]+)['\" >]|U"</span>;   
        preg_match_all(<span>$img_pattern</span>, <span>$content</span>, <span>$img_out</span>, PREG_SET_ORDER);
        <span>$photo_num</span> = count(<span>$img_out</span>);
        <span>//匹配到的图片数量</span><span>echo</span><span>$capture_url</span> . <span>"共找到 "</span> . <span>$photo_num</span> . <span>" 张图片\n"</span>;
        <span>foreach</span> (<span>$img_out</span><span>as</span><span>$k</span> => <span>$v</span>){
            <span>$this</span>->save_one_img(<span>$capture_url</span>,<span>$v</span>[<span>1</span>]);
        }
    }

    <span>/**
     * 保存单个图片的方法 
     *<span> @param</span> String $capture_url   用于抓取图片的网页地址
     *<span> @param</span> String $img_url       需要保存的图片的url
     */</span><span>public</span><span><span>function</span><span>save_one_img</span><span>(<span>$capture_url</span>,<span>$img_url</span>)</span>{</span><span>//图片路径地址</span><span>if</span> ( strpos(<span>$img_url</span>, <span>'http://'</span>)!==<span>false</span> ){ 
            <span>// $img_url = $img_url;</span>
        }<span>else</span>{   
            <span>$domain_url</span> = substr(<span>$capture_url</span>, <span>0</span>,strpos(<span>$capture_url</span>, <span>'/'</span>,<span>8</span>)+<span>1</span>);
            <span>$img_url</span>=<span>$domain_url</span>.<span>$img_url</span>;
        }           
        <span>$pathinfo</span> = pathinfo(<span>$img_url</span>);    <span>//获取图片路径信息        </span><span>$pic_name</span>=<span>$pathinfo</span>[<span>'basename'</span>];   <span>//获取图片的名字</span><span>if</span> (file_exists(<span>$this</span>->save_path.<span>$pic_name</span>)){  <span>//如果图片存在,证明已经被抓取过,退出函数</span><span>echo</span><span>$img_url</span>.<span>'该图片已经抓取过!'</span>.<span>"\n"</span>; 
            <span>return</span>;
        }                
        <span>//将图片内容读入一个字符串</span><span>$img_data</span> = @file_get_contents(<span>$img_url</span>);   <span>//屏蔽掉因为图片地址无法读取导致的warning错误</span><span>if</span> ( strlen(<span>$img_data</span>) > <span>$this</span>->img_size ){   <span>//下载size比限制大的图片</span><span>$img_size</span> = file_put_contents(<span>$this</span>->save_path . <span>$pic_name</span>, <span>$img_data</span>);
            <span>if</span> (<span>$img_size</span>){
                <span>echo</span><span>$img_url</span>.<span>'图片保存成功!'</span>.<span>"\n"</span>;
            } <span>else</span> {
                <span>echo</span><span>$img_url</span>.<span>'图片保存失败!'</span>.<span>"\n"</span>;
            }
        } <span>else</span> {
            <span>echo</span><span>$img_url</span>.<span>'图片读取失败!'</span>.<span>"\n"</span>;
        } 
    } 
}
set_time_limit(<span>120</span>);     <span>//设置脚本的最大执行时间  根据情况设置 </span><span>$download_img</span>=<span>new</span> download_image(<span>'imgages/'</span>,<span>0</span>);   <span>//实例化下载图片<strong>对象</strong></span><span>//$download_img->recursive_download_images('http://www.oschina.net/');      //递归抓取图片方法</span><span>//$download_img->download_current_page_images($_POST['capture_url']);     //只抓取当前页面图片方法</span><span>$download_img</span>->download_current_page_images(<span>'http://www.jb51.net'</span>);     <span>//只抓取当前页面图片方法</span><span>?></span></span></span></code>
登入後複製

http://blog.csdn.net/china_skag/article/details/18452883
http://www.jb51.net/article/21738.htm

版權聲明:轉載請保留文章署名和連結

以上就介紹了PHP抓取網站圖片腳本,包括了方面的內容,希望對PHP教學有興趣的朋友有幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
img檔案怎麼打開 img檔案怎麼打開 Sep 18, 2023 am 09:40 AM

開啟img檔案的方法有使用虛擬光碟機軟體開啟、使用壓縮軟體開啟和使用專用工具開啟。詳細介紹:1、使用虛擬光碟機軟體打開,下載並安裝一個虛擬光碟機軟體,右鍵單擊img文件,選擇“打開方式”或“關聯程序”,在彈出的對話框中選擇安裝的虛擬光驅軟體,虛擬光碟機軟體會自動載入img文件,並將其作為虛擬光碟機中的光碟映像,雙擊虛擬光碟機中的光碟圖標,即可開啟img檔案並存取其中的內容等等。

為什麼NameResolutionError(self.host, self, e) from e,怎麼解決 為什麼NameResolutionError(self.host, self, e) from e,怎麼解決 Mar 01, 2024 pm 01:20 PM

報錯的原因NameResolutionError(self.host,self,e)frome是由urllib3函式庫中的例外類型,這個錯誤的原因是DNS解析失敗,也就是說,試圖解析的主機名稱或IP位址無法找到。這可能是由於輸入的URL位址不正確,或DNS伺服器暫時無法使用所導致的。如何解決解決此錯誤的方法可能有以下幾種:檢查輸入的URL地址是否正確,確保它是可訪問的確保DNS伺服器可用,您可以嘗試在命令行中使用"ping"命令來測試DNS伺服器是否可用嘗試使用IP位址而不是主機名稱來存取網站如果是在代理

PHP函數介紹—get_headers(): 取得URL的回應頭訊息 PHP函數介紹—get_headers(): 取得URL的回應頭訊息 Jul 25, 2023 am 09:05 AM

PHP函數介紹—get_headers():取得URL的回應頭資訊概述:在PHP開發中,我們經常需要取得網頁或遠端資源的回應頭資訊。 PHP函數get_headers()能夠方便地取得目標URL的回應頭訊息,並以陣列形式傳回。本文將介紹get_headers()函數的用法,以及提供一些相關的程式碼範例。 get_headers()函數的用法:get_header

設定Linux系統的PATH環境變數步驟 設定Linux系統的PATH環境變數步驟 Feb 18, 2024 pm 05:40 PM

Linux系統如何設定PATH環境變數在Linux系統中,PATH環境變數用來指定係統在命令列中搜尋執行檔的路徑。正確設定PATH環境變數可以方便我們在任何位置執行系統指令和自訂指令。本文將介紹如何在Linux系統中設定PATH環境變量,並提供詳細的程式碼範例。查看目前的PATH環境變數在終端機中執行以下指令,可以查看目前的PATH環境變數:echo$P

html和url的差別是什麼 html和url的差別是什麼 Mar 06, 2024 pm 03:06 PM

區別:1、定義不同,url是是統一資源定位符,而html是超文本標記語言;2、一個html中可以有很多個url,而一個url中只能存在一個html頁面;3、html指的是網頁,而url指的是網站位址。

img檔案如何開啟 img檔案如何開啟 Jul 06, 2023 pm 04:17 PM

img檔案開啟的方式:1、確認img檔案路徑;2、使用img檔案開啟器;3、選擇開啟方式;4、檢視圖片;5、儲存圖片。 img檔案是一種常用的圖像檔案格式,通常用於儲存圖片資料。

怎樣透過幾個步驟取得您的 Steam ID? 怎樣透過幾個步驟取得您的 Steam ID? May 08, 2023 pm 11:43 PM

現在許多熱愛遊戲的windows用戶都進入了Steam客戶端,可以搜尋、下載和玩任何好遊戲。但是,許多用戶的個人資料可能具有完全相同的名稱,這使得查找個人資料或甚至將Steam個人資料連結到其他第三方帳戶或加入Steam論壇以共享內容變得困難。為設定檔分配了一個唯一的17位id,它保持不變,用戶無法隨時更改,而用戶名或自訂URL可以更改。無論如何,有些用戶並不知道他們的Steamid,這對於了解這一點非常重要。如果您也不知道如何找到您帳戶的Steamid,請不要驚慌。在這篇文

如何在Java中使用URL編碼和解碼 如何在Java中使用URL編碼和解碼 May 08, 2023 pm 05:46 PM

使用url進行編碼和解碼編碼和解碼的類別java.net.URLDecoder.decode(url,解碼格式)解碼器.解碼方法。轉換成普通字串,URLEncoder.decode(url,編碼格式)將普通字串變成指定格式的字串packagecom.zixue.springbootmybatis.test;importjava.io.UnsupportedEncodingException;importjava.net.URLDecoder;importjava.net. URLEncoder

See all articles