python實現圖片爬蟲

pw36 9年前發布 | 3K 次閱讀 Python

    #encoding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

from sgmllib import SGMLParser  
import re  
import urllib  

class URLLister(SGMLParser):    

    def start_a(self, attrs):  
        url = [v for k, v in attrs if k=='href']  
        if url : urll = url[0]  
        else : return   
        if urll :  
                if urll in globalList : return  
                if isSou(urll) :  
                    if sechDir(imgList , urll) > 0 :   
                        print 'Fetcher page at ' + ' img alredy saved ... ignore . Queue size : '+str(Queue.__len__())  
                        imgList.append(urll)  
                        return  
                    else :    
                        savImg(urll)  
                        imgList.append(urll)  
                        globalList.append(urll)  
                        print 'Fetcher page at ' + urll + ' save img complete as . Queue size : '+str(Queue.__len__())  
                else :  
                        if sechDir(fetList , urll) > 0 :  
                                imgList.append(urll)  
                                return   
                        else :  
                                imgList.append(urll)   
                                enQ(urll)  
                                print 'Fetcher page at ' + urll + ' a new url , append in Queue . Queue size : '+str(Queue.__len__())  

    def unknown_starttag(self , tag , attrs) :   
        return  

fetList = [] # list of url listener fetched . 這是非資源url的歷史列表,存在于此表中的url將不會再被爬取  
imgList = [] # list of url saved pictures #這是資源url的歷史列表,存在于此表中的資源不會再被下載  
rgxStr = r'(http://www.bizhijidi.com/)*/wallpapers/[0-9]*/[0-9]*/[^x00-xff]*-900x1600.jpg' #這是需要下載資源的正則表達式,正則#表達式是啥我就不說了,不知道的自己去面壁。。  
regrgStr = r'^(http://www.bizhijidi.com/)' #這是全局的網址正則匹配式  
staURL = r'http://www.bizhijidi.com/' #這是起始的url  
imgPath = r'/home/zhangjilun/bizhijidi/' #存放圖片的本地路徑  
Queue = ['http://www.bizhijidi.com/'] #這是url隊列,起始時只有起始url在里面  
fileName = [] #filename全局列表。。。暫時木有用。。。留著備用  
globalList = [] #全局url列表,用于第一次篩選url  


#這是動態生成圖片文件名的函數,就是取的url里的文件名  
def changeName(url) :   
    if url :  
        s=url.split('/')  
    return s[-1]  

#保存圖片的函數,很簡單的fileIO  
def savImg(url) :  
    if url :  
        url = 'http://www.bizhijidi.com' + url   
        imgData = urllib2.urlopen(url).read()  
        imgName = changeName(url)  
        print imgName  
        p = imgPath + imgName  
        print 'File Path : '+p  
        output = open(p,'wb+')  
        print 'Saving img ... '  
        output.write(imgData)  
        output.close()  
        return 1  
    else :  
        return 0  

#判斷連接url是否符合站類url正則式,否則為站外連接,會被ignore掉  
def inRange(url) :   
    if url :  
        #print 'cheak url is inrange : '  
        #print regrgStr  
        #print url  
        m = re.match(regrgStr , url)  
        if m : return 1  
        else : return 0  
    return 0  

#判斷url是否是一個資源圖片url,同樣用正則式實現  
def isSou(url) :  
    if url :  
        #print 'cheak url is in source : '  
        #print url  
        m = re.match(rgxStr , url)  
        if m : return 1  
        else : return 0  
    return 0  

#檢查列表,如果列表中存在了該url,那么url會被ignore掉  
def sechDir(List , url) :   
    if List : return -1  
    if url :   
        if List.__len__() == 0 :   
            List.append(url)  
        else :  
            if url in List : return 1  
            else : return 0  
#入隊列函數  
def enQ(url) :  
    Queue.insert(0 , url)  
    return 1  

#出隊列函數  
def deQ() :  
    url = Queue.pop()  
    print 'Pop url : ' + url  
    return url  
#判斷隊列是否為空  
def cheakQ() :  
    if Queue.__len__() != 0 : return 1  
    else : return 0  

#最后有一個主方法:  

def readPage(url):  
    sock=urllib.urlopen(url)  
    listener = URLLister()  
    listener.feed(sock.read())  
    sock.close()  
    listener.close()  
    return  

#每彈出一個url,就調用這個主方法。  

#就像這樣:  

while cheakQ() != 0 :  
    #print 'Reading page ... Queue len : ' + str(Queue.__len__())   
    readPage(deQ())  
print 'Fetcher complete ...'  </pre> 


 本文由用戶 pw36 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!