还是关于去重,想着有些请求可能失败以后,虽然回滚了当前爬取失败的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)