爬蟲url去重(二)

還是關於去重,想着有些請求可能失敗以後,雖然回滾了當前爬取失敗的url,可是要是此url一直請求失敗,應該是要刪除的,重新學習了一邊基礎知識。

# -*- coding: utf-8 -*-

import redis


class UrlOption(object):
    '''
    這是一個爬蟲的url管理器類
    
    '''
    def __init__(self,spider_name='',host='127.0.0.1',port=6379,**kwargs):
        '''
        @params:spider_name 爬蟲名稱
        @params:host redis主機地址
        @params:port redis服務端口
        @params:kwargs redis其他需要參數
        '''
        self.counts = 1
        self.__conn = redis.Redis(host=host,port=port)
        self.__new = spider_name+'_new'
        self.__old = spider_name+'_old'
        
    def adds(self,*values):
        '''
        向管理器加入url
        '''

        for url in values:
            if not self.__conn.sismember(self.__old,'{"%s":%s}'%(url,self.counts)):#判斷是否存在已經爬取過的url集合裏面,存在返回TRUE

                self.__conn.sadd(self.__new,'{"%s":%s}'%(url,self.counts))#不存在則加入待爬取隊列
        else:
            return True#已經爬取過了,返回爬取完成的標識爲TRUE
     
        
    def get_url(self):
        '''
        獲取一條爲待抓取的url
        '''
        url = self.__conn.spop(self.__new) #從待爬取集合裏面獲取url,type爲{url:1}需要
        # 這般操作json.loads(sf)>list(js.keys())[0]
        if url:
            self.__conn.sadd(self.__old,'{"%s":%s}'%(url,self.counts))#加入到已經爬取完成的集合,並且返回該條url供調度器爬取
            return url
        else:
            return False
    
    def back_error(self,url,score):
        '''
        未成功抓取url的處理方法
        '''
        try:
            self.__conn.smove(self.__old,self.__new,'{"%s":%s}'%(url,score))#正確移動返回爲TRUE
            return True
        except:
            return False#未移動成功,返回false

    def count(self):
        '''
        未抓取url數量獲取
        '''
        return self.__conn.scard(self.__new)
        


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章