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 ...'  

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/8041.html

(0)
上一篇 2021年7月18日
下一篇 2021年7月18日

相关推荐

发表回复

登录后才能评论