python实现图片爬虫,, #encodin


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

评论关闭