之前写的爬虫目前需要调优,所以重写。
我必须做到不依赖数据库,不然的话太麻烦了。
昨晚睡不着,好好思考了下,发现BUG还有几处。
今天记录下。
#coding:utf-8 import sys,urllib2,re,Queue sys.path.append("..") from lib.Http_Class import Http_Class from BeautifulSoup import BeautifulSoup #################################### # # Spider 爬虫模块 # #################################### class Spider_module: def setW3AScan(self,w3ascan): self.w3ascan=w3ascan self.result_list=[] self.q_list=Queue.Queue() self.tmp_list=Queue.Queue() def start(self,aa): url="http://www.163.com/" print "[*] 爬虫目标:"+url self.result_list.append({url:0}) try: while True: # 判断爬虫是否有爬过 for url_tmp in self.result_list: for url_target in url_tmp: if url_tmp[url_target]==0: # 设置键值 url_tmp[url_target]=1 # 放入目标队列 self.q_list.put(url_target) # 判断任务队列是否为空,如果是则直接退出 # 否则处理任务 if self.q_list.empty(): print "[*] 结束爬虫任务." break else: for tmp in range(self.q_list.qsize()): spider_url=self.q_list.get() obj=Http_Class() html=obj._do("get",spider_url) soup=BeautifulSoup(html) links=soup.findAll('a') for link in links: _url=str(link.get('href')) if re.match('^(javascript|:;|#|mailto)',_url) or _url is None or re.match('.(jpg|png|bmp|mp3|wma|wmv|gz|zip|rar|iso|pdf|txt|db)$',_url): continue if re.match('^(http|https)',_url): if not re.match('^'+url,spider_url): continue else: print "[*][!] 发现新连接: "+_url self.result_list.append({_url:0}) else: self.result_list.append({url+_url:0}) print "[*][!] 发现新连接: "+url+_url # rst=list(set(self.result_list)) except Exception,error: print "[*] 发生异常情况,捕获并写入日志。" self.w3ascan.log_create("Url: %s get Url Error! Source: %s" % (url,error),"Spider_module") def save(self): print "[*]保存爬虫结果" def getPluginClass(): return Spider_module if __name__=="__main__": t=Spider_module() t.start("aaa")