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