程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> bash搭配php批量下載圖片實現代碼

bash搭配php批量下載圖片實現代碼

編輯:PHP基礎知識
 

看到一個圖片網站,很多漂亮圖片,所以想要保存下來. 但是圖片太多了.一個一個右鍵保存的話,不知道要保存到什麼時候.

批量保存的話,Linx中好像還沒有像迅雷那樣的保存本網頁所有圖片的選項,況且,有好多好多的網頁都需要保存.一個一個網頁打開的話也太慢了. 所以就想找個方便的方法.於是就有了這篇文章.

使用bash和php配合一下 具體分工:

php負責獲取目標網頁的源代碼,然後提取出圖片的地址,輸出為地址列表文件,然後用bash寫成sh腳本,在腳本中使用wget工具批量下載,在下載的過程中重命名文件.

為什麼要寫成sh腳本呢?因為直接使用wget下載文件的過程中,雖然可以使用-O參數重命名文件,但是那是對下載單個文件而言的.

當使用-i參數從一個下載地址列表中依次讀取下載地址來下載的時候無法重命名.也即-i 和-O參數無法同時使用.

解決辦法

首先是php部分獲取源代碼,然後提取圖片地址

<?php
$str =file_get_contents('http://127.0.0.1/?p=20');
$list = array(); //這裡存放結果map
$c1 = preg_match_all('/<imgs.*?>/', $str, $m1); //先取出所有img標簽文本
for($i=0; $i<$c1; $i++)
{ //對所有的img標簽進行取屬性
$c2 = preg_match_all('/(w+)s*=s*(?:(?:(["'])(.*?)(?=2))|([^/s]*))/', $m1[0][$i], $m2); //匹配出所有的屬性
for($j=0; $j<$c2; $j++)
{ //將匹配完的結果進行結構重組
$list[$i][$m2[1][$j]] = !empty($m2[4][$j]) ? $m2[4][$j] : $m2[3][$j];
}
}
$fp=fopen("url.txt","a");//打開文件,指針指向文件尾部進行追加
foreach($list as $list=>$sum)
{
if(preg_match('/http://127.0.0.1.*?/i',$sum['src']))//對結果進行篩選,篩選條件不唯一
{ $out= $sum['src']."n";
echo $out."<br />";
fwrite($fp,$out);//將結果追加到文件尾部
}
}
fclose($fp);//關閉寫入文件
echo "write OK";
?> 此處的img標簽匹配條件不唯一.看個人的需求了.也不一定要把所有的img都匹配出來.可以在匹配img標簽之前就進行篩選.我這樣做是為了方便吧,省事.呵呵


我是先把 img標簽全部匹配,然後再用preg_match函數把想要的地址留下來. 再說一遍,方法不唯一

這樣得到一個url.txt文件,裡面是下載地址列表,每行一個.

然後是bash登場

#!/bin/bash
count=0
while read line
do
wget -O $count.jpg $line
((count+=1))
#使用let count=$count+1 也正確
#使用((count++)) 也正確
done<$1 將以上代碼保存為img.sh 增加可執行權限

chmod +x img.sh 然後就可以執行了

./img.sh url.txt 這樣 就間接的完成了-i 和-O參數同時使用,重命名是按照下載順序,保存為 1.jpg 2.jpg 3.jpg ....


上面是在一個網頁中進行保存,想要保存所有的圖片話,就先獲取歸檔頁面中的地址列表,然後順序訪問地址數組,每訪問一個地址,用上面說到的方法,提取此網頁中的圖片地址,最後將所有的圖片地址寫入到一個文本文件,用sh腳本一次性批量下載

我就是這麼干的,一次下載了1000+張圖片

<?php //獲取歸檔目錄中的所有href
$str =file_get_contents('http://127.0.0.1/?page_id=29'); //此處地址是我本地wp環境的歸檔目錄頁面
$list = array(); //這裡存放結果map
$c1 = preg_match_all('/<as.*?>/', $str, $m1); //先取出所有a標簽文本
for($i=0; $i<$c1; $i++)
{ //對所有的a標簽進行取屬性
$c2 = preg_match_all('/(w+)s*=s*(?:(?:(["'])(.*?)(?=2))|([^/s]*))/', $m1[0][$i], $m2); //匹配出所有的屬性
for($j=0; $j<$c2; $j++)
{ //將匹配完的結果進行結構重組
$list[$i][$m2[1][$j]] = !empty($m2[4][$j]) ? $m2[4][$j] : $m2[3][$j];
}
}
foreach($list as $list=>$sum)
{
if(preg_match('/http://127.0.0.1/?p=d+$/i',$sum['href']))//對結果進行篩選,篩選條件不唯一
{ $out= $sum['href']."<br />";
echo $out;
}
}
/*
輸出結果為滿足
http://127.0.0.1/?p=*
http://127.0.0.1/?p=*
的地址列表*/
?>

 

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