안녕하세요! 파이썬으로 웹 크롤러를 작성하려고합니다. 나는 파이썬 다중 쓰레드를 사용하고 싶었다. 이전에 제안한 논문과 튜토리얼을 읽은 후에도 여전히 문제가 있습니다. 내 코드 (전체 소스 코드 here입니다) 여기에 있습니다 :파이썬 다중 쓰레드 크롤러
class Crawler(threading.Thread):
global g_URLsDict
varLock = threading.Lock()
count = 0
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
self.url = self.queue.get()
def run(self):
while 1:
print self.getName()+" started"
self.page = getPage(self.url)
self.parsedPage = getParsedPage(self.page, fix=True)
self.urls = getLinksFromParsedPage(self.parsedPage)
for url in self.urls:
self.fp = hashlib.sha1(url).hexdigest()
#url-seen check
Crawler.varLock.acquire() #lock for global variable g_URLs
if self.fp in g_URLsDict:
Crawler.varLock.release() #releasing lock
else:
#print url+" does not exist"
Crawler.count +=1
print "total links: %d"%len(g_URLsDict)
print self.fp
g_URLsDict[self.fp] = url
Crawler.varLock.release() #releasing lock
self.queue.put(url)
print self.getName()+ " %d"%self.queue.qsize()
self.queue.task_done()
#self.queue.task_done()
#self.queue.task_done()
print g_URLsDict
queue = Queue.Queue()
queue.put("http://www.ertir.com")
for i in range(5):
t = Crawler(queue)
t.setDaemon(True)
t.start()
queue.join()
필요에 따라이 스레드 1 일 이후에 어떤 결과를 제공하지 않으며 다르게 시간을 실행하고있을 작동하지 않습니다이 오류 제공 :
Exception in thread Thread-2 (most likely raised during interpreter shutdown):
을
어떻게 해결할 수 있습니까? 또한 이것은 for 루프보다 효과적이라고 생각하지 않습니다. 사람이 차이를 설명 할 수있는, 다른 장소에서,
def run(self):
while 1:
print self.getName()+" started"
self.page = getPage(self.url)
self.parsedPage = getParsedPage(self.page, fix=True)
self.urls = getLinksFromParsedPage(self.parsedPage)
for url in self.urls:
self.fp = hashlib.sha1(url).hexdigest()
#url-seen check
Crawler.varLock.acquire() #lock for global variable g_URLs
if self.fp in g_URLsDict:
Crawler.varLock.release() #releasing lock
else:
#print url+" does not exist"
print self.fp
g_URLsDict[self.fp] = url
Crawler.varLock.release() #releasing lock
self.queue.put(url)
print self.getName()+ " %d"%self.queue.qsize()
#self.queue.task_done()
#self.queue.task_done()
self.queue.task_done()
내가 task_done() 명령을 사용하여 실험 :
나는 실행()을 해결하기 위해 노력했다?
이 첫 번째 예는 어떤 들여 쓰기 누락인가요을? 반원들이 한 수준 씩 밀려나는 것처럼 보입니다. –
첫 번째 예를 업데이트했습니다. – torayeff
실례를 게시 할 수 있습니까? 어떤 모듈을 가져 옵니까? –