2012-11-12 10 views
0
class Crawler1(object): 
    def __init__(self): 
     'constructor' 
     self.visited = [] 
     self.will_visit = [] 

    def reset(self): 
     'reset the visited links' 
     self.visited = [] 
     self.will_visit = [] 

    def crawl(self, url, n): 
     'crawl to depth n starting at url' 
     self.analyze(url) 
     if n < 0: 
      self.reset() 
     elif url in self.visted: 
      self.crawl(self.will_visit[-1],n-1) 
     else: 
      self.visited.append(url) 
      self.analyze(url) 
      self.visited.append(url) 
      self.will_visit.pop(-1) 
      self.crawl(self.will_visit[-1],n-1) 


    def analyze(self, url): 
     'returns the list of URLs found in the page url' 
     print("Visiting", url) 
     content = urlopen(url).read().decode() 
     collector = Collector(url) 
     collector.feed(content) 
     urls = collector.getLinks() 
     for i in urls: 
      if i in self.will_visit: 
       pass 
      else: 
       self.will_visit.append(i) 

나는이 프로그램은 지금까지 "N"웹 크롤러 클래스

내가 확신하지만 내가 코드에 어떤 문제가 있는지 확실하지 않다 그것을 할 수 있습니다로 연결하는 일련의를 통해 실행 만 할 그것은 충분합니다. 힌트는 좋을 것이다.

예상 출력의 경우 N = 1 및 사이트 2와 Site3에 대한 링크가있는 사이트 개발에 : 당신은 특히 또 다른 페이지를 크롤링 결정하는 방법으로,이 행동해야하는 방법에 대해 신중하게 생각해야

Visiting [Site1] 
Visiting [Site2] 
Visiting [Site3] 
+0

프로그램을 어떻게 실행하며 지금까지 어떤 행동을 보았습니까? 나는'c = Crawler1(); c.crawl ('Site1', 3)'. – Edmund

+0

정확히 그렇게. 그리고 내가 'visted Site1'다음 에러 코드 'AttributeError :'Crawler1 '객체에'visted '속성이 없습니다. –

+0

"visted"에서'i '가 누락 되었기 때문에 그럴 수 있습니다.) 그 이후의 다른 오류 ? – Edmund

답변

2

가. 이 코드는 crawl 방법에 집중되어있다 :

  1. n < 0 경우에, 당신은 충분히 깊은 크롤하고 아무것도하고 싶지 않아요. 이 경우 단순히 반환하십시오.

  2. 그렇지 않으면 페이지를 분석하십시오. 그런 다음 각 새 URL에 크롤링하고 깊이는 n-1입니다.

혼란의 부분은, 내가 생각하기에, 당신은 방문 대기열을 지키고 있지만 재귀 적으로 기어 다니는 것입니다. 첫 번째로 대기열에는 순서대로 방문하려는 마지막 크롤링 된 URL의 하위 노드뿐만 아니라 크롤링되었지만 아직 완전히 처리되지 않은 다른 노드의 하위 노드가 포함됩니다. 그렇게 깊이 우선 검색의 모양을 관리하는 것은 어렵습니다.

대신 will_visit 변수를 제거하고 analyze에 찾은 링크 목록을 반환합니다. 그런 다음 위의 2 단계를 따라 그 목록을 처리, 뭔가 같은 :

def analyze(self, url): 
    ... 
    urls = collector.getLinks() 
    returns urls 
이 들어

# Crawl this page and process its links 
child_urls = self.analyze(url)  
for u in child_urls: 
    if u in self.visited: 
     continue # Do nothing, because it's already been visited 
    self.crawl(u, n-1) 

당신은 또한 단순히 오히려 스택에 넣어보다, URL의 목록을 반환 analyze을 변경해야 작동합니다

+1

OK 모든 것을 설정했지만 NoneType은 반복 할 수 없다고 말합니다. 그리고 그것이 의미하는 바를 봅니다. 어떻게 함수를 반복 할 수 있습니까? –

+0

'analyze' 메소드도 변경해야한다는 점을 잊어 버렸습니다. – Edmund

+0

나는 그것을 이미 변경했으나 같은 오류 –