爬虫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)
        


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