程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 超囧的圖片鏈接批量獲取和下載

超囧的圖片鏈接批量獲取和下載

編輯:關於PHP編程

以前在windows下經常去一些壁紙網站,或者是美女的QQ相冊,又或者是一個激情美女圖片網站下載圖片,經常需要點擊右鍵然後“另存為”,要是遇見經典套圖,這種重復的操作肯定會讓你失去下載的動力。後來用了Firefox有個插件好像是DownloadThemAll(記得不清除了,反正就是批量下載網頁鏈接的,可以篩選格式下載圖片),結合迅雷使用可以極大的提高圖片下載的效率(但是如果頁面小圖片過多,下完之後也需要很長時間來篩選刪除廢文件)。現在用了ubuntu,沒有windows和迅雷,也不用firefox很多年了。我們如何來批量下載網頁中的美圖?在chrome下我一直想找這樣一款插件,可惜只找到IMG inspector這個插件,這個插件的工作方式是定義一個基准URL,利用占位符,定義好的步長和循環范圍來重新生成鏈接並預覽。不得不說這樣的功能是在太弱了,即使是套圖的URL也不一定是有規律可循的,所以這種方法並不可取也不實用。
  於是後來琢磨著學學Chrome插件開發,自己來做一個 可惜一直沒有什麼動力。而且我也不清楚chrome插件能不能解決圖片下載的問題:是調用客戶端下載軟件還是調用原生浏覽器下載,而且這樣一來,還得好好學習chrome的API的一些高級方法,開發成本頓增。遂放棄之。於是轉換思路繼續琢磨。然後把幾個難點問題一一分拆開來分析(環境:UBUNTU+CHROME/FIREFOX):

  1)如何獲取當前頁面的圖片地址?

  這個最簡單的莫過於在chrome的控制台或者firebug中執行腳本程序了,我也想過利用網頁爬蟲工具比如SimpleHtmlDom這個強大的開源框架(如果你熟悉jquery這個框架讓你在服務器端使用jquery獲取標簽,十分方便),不過這樣可能執行的效率上差了一截。復雜性也增加了一些。

  2)如何確定當前頁面的圖片大小是否符合我的“胃口”?

  這個問題得分兩種情況考慮:網頁圖片一般分為縮略圖和原圖。縮略圖一般都附帶原圖鏈接。也就是用a標簽包裹img標簽,我們需要獲取a標簽的href值而不是img標簽的src值;原圖一般只是一個img標簽,這樣你可以利用Image對象的width和height來篩選這些圖片。對於縮略圖篩選可以new一個Image對象設置src的值以後對其高度和寬度進行篩選。不過對於縮略圖我一般不篩選,這樣的圖片一般都是很大的,相反你最可能要篩選的是a標簽裡面的img對象,因為很多logo和button的圖片都是鏈接包裹的小圖片。

  3)如何下載圖片?

   上面兩步都是使用控制台的腳本程序來完成的,整個代碼不超過10行(包含jquery相機加載的代碼)。最後你可以不廢吹灰之力得到當前頁面篩選之後的圖片的地址。可惜就在這一步了,得到了地址沒有用,真正廢操作的步驟在如何一次性的把這些圖片下載到本地的機器。如果我會chrome插件開發,知道chrome如何調用系統的方法(其實我也不確定chrome是否可以,如果浏覽器的安全限制足夠嚴格那麼這肯定是行不通的),然後熟悉下wget這個強悍無比的下載命令。這就迎刃而解了。遺憾的是,前兩個我都不熟悉,不過沒關系天無絕人之路,條條大道通羅馬,一定會有另外一種方法的。

  4)飛越控制台Console

  現在我們的思路被卡在chrome的控制台裡了,空有大把圖片鏈接卻不知道怎麼下載他們(其實也只是當前窗口的圖片鏈接)。對於chrome插件開發我始終抱有一絲幻想,可惜學習動力實在沒有,而且自己也始終質疑chrome這麼安全嚴格的浏覽器會允許js與客戶端交互嗎?

  於是我開始退步思考問題了,不下載文件,直接把這些文件存儲在本地的任何一個我能日後讀取的地方就行。於是思路延續到html5 的本地存儲localStorage和本地數據庫,也考慮了Google Gears的本地數據庫,後來發現要麼搞得過於復雜,要麼行不通。慢慢的思路開始朝著一個簡單的方向漂移--jQuery,沒錯就是他--$.getJSON()。如果能夠跨域將圖片地址發到本地的一個網站然後在後台下載不就行了嗎?於是馬上用Code Igniter制作了一個網站:只在控制器裡面加入了一個只有一個方法的php的控制器類文件,代碼仍然不超過10行。代碼的作用只是將所有的圖片鏈接換行寫入一個文本文件(urls.txt)。

  5) 無敵下載器

  到這快要結束了,也許有人問我,你這不還是沒有實現下載圖片嗎?嘿嘿,nb人物要登場了:wget -i -b urls.txt 。在終端裡面進入網站目錄,執行該命令,自動後台下載文本文件裡面的每一行的圖片地址。

  PS:前幾天對這個命令不熟悉,拿一H網做實驗,誤用了參數在後台默默的下載了1.1G的黃圖,後來發現了強行kill了該進程。總之這個命令下載網站內容那是強悍到不行。 如果你用linux,這個命令很邪惡,想干壞事到了個位哦!

  6) 能不囧嗎?

  這個操作流程,真的很囧。

  囧一:a)部署好本地的網站--》b)右鍵打開chrome控制台或者firebug--》c)復制腳本--》d)粘貼--》e)Enter--f》打開終端--g》wget。這個操作對於一個頁面很多圖片(縮略圖,套圖)的網頁來說,很便利。但是如果我打開了十個網頁,每個頁面就都要執行b和d以及e操作,如果這段腳本能夠做成chrome插件嵌入到浏覽器中那麼至少可以省下2步:打開頁面手動點一下插件圖標或者設置為自動執行腳本。這樣易用性就大大提升了。

  囧二:如何省去wget這一步,直接在php後台執行下載。這就需要考慮使用php調用ubuntu系統方法了,不熟,有待研究。

  囧三:如何省去部署網站這一步,需要網站的根本原因是我無法將多個頁面的圖片地址合並存儲在一起,考慮過cookie但是大小限制是個問題,圖片地址過百很正常(尤其是包含中文的時候)。而且還要考慮存儲後方讀取便調用的問題。

   這幾個問題還沒有考慮好,現在只是在考慮實現囧二。其實這個過程對技術本身沒有多大提升,但是後來回想整個流程,發現對面對問題時的思路和方法論上面都有了明顯的提高。歡迎大家來討論!


摘自 Hurry的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved