隨便寫的一個python小程式,從網頁中下載圖片

來源:互聯網
上載者:User

在diveintopython網站上,http://diveintopython.org/html_processing/extracting_data.html可以找到一些html處理的例子,比如這個類可以用來擷取html頁面中的href標籤內容。

from sgmllib import SGMLParserclass URLLister(SGMLParser):    def reset(self):                                      SGMLParser.reset(self)        self.urls = []    def start_a(self, attrs):                             href = [v for k, v in attrs if k=='href']          if href:            self.urls.extend(href)



將這個檔案href的地方都改成src,start_a改成start_img
即:
from sgmllib import SGMLParser
class URLLister(SGMLParser):
    def reset(self):                             
        SGMLParser.reset(self)
        self.urls = []
    def start_img(self, attrs):                     
        src = [v for k, v in attrs if k=='src']
        if src:
            self.urls.extend(src)
儲存代碼內容為urllister.py檔案,放在python安裝目錄即可,這樣就可以用來分析網頁的圖片地址了。








下面為圖片下載的程式內容

import urllib2
import urllib
import os
import urllister
# 這是來自http://diveintopython.org/html_processing/extracting_data.html#dialect.extract.urllib的一個分析html頁面的類

imagepath=[]

#cd 函數用於判斷路徑是否正確,如正確則改變當前工作路徑
def cd(ss):
    try:
        os.chdir(ss)
        print '改變工作目錄為'+ss
        return 0
    except:
        print '輸入圖片儲存路徑有誤,請重新輸入'
        return 1
#addimagepath,該函數將圖片路徑添加到imagepath這個list中
def addimagepath(surl):
    if 'http://' in surl 
        imagepath.append(surl)
        print '找到圖片:'+surl.split('/')[-1]+'圖片地址為:'+surl
    else:
        surl=str_url+surl
        imagepath.append(surl)
        print '找到圖片:'+surl.split('/')[-1]+'圖片地址為:'+surl

#download images
def image_down(list_image):
    if not list_image:
        print "該頁面沒有任何圖片"
    else:
        for image in list_image:
            try:
                urllib.urlretrieve(image,image.split('/')[-1]) #利用image.split('/')[-1]獲得檔案名稱
                print "來自"+image+"的圖片儲存成功!"
            except:
                print "來自"+image+"圖片沒有儲存成功,繼續儲存下一張圖片...."

print "請輸入網頁的url地址:"
str_url=raw_input()

print "請輸入圖片儲存地址,如果直接斷行符號將預設儲存到我的文件"

temp=1
while temp:
    str_save=raw_input()
    if not str_save:
        str_save='E:/Fei_Doc'
    temp=cd(str_save)
   

try:
    sock=urllib2.urlopen(str_url)
    print "頁面串連成功!開始擷取圖片地址……"
except:
    print "sorry,輸入的地址有誤或頁面無法串連,程式將自動結束"

parser=urllister.URLLister()
parser.feed(sock.read())
sock.close()
parser.close()
for url in parser.urls:
    addimagepath(url)

#調用圖片下載函數
image_down(imagepath)

#程式結束

儘管這個程式能基本上解決問題,不過我發現有一些不足:
1、如果頁面的img標籤後面沒有直接跟src屬性,比如複雜一點的img代碼:
 <img border="0" onload="
function onload(event) {
javascript:
    if (this.width > screen.width - 333) {
        this.width = screen.width - 333;
    }
}
" src="http://bbs.263.net/forumData/119/2860134_1.jpg" alt="按此在新視窗瀏覽圖片" />

那麼urllister便無法識別了。不過這個問題解決起來比較容易,直接對html代碼每行代碼進行分析,利用split('src'),可以得到所有src標籤的內容,然後根據尾碼是否為jpg,gif等得到圖片檔案地址。
       

2、上面的程式只是對地址為http開始的圖片以及當前url下面目錄的圖片進行處理,如果src裡面的內容以“../images“ 或者 “/“開頭,則需另外處理。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.