還是關於去重,想着有些請求可能失敗以後,雖然回滾了當前爬取失敗的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)