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 で、Site1 に Site2 と Site3 へのリンクがある場合の期待される出力:

Visiting [Site1]
Visiting [Site2]
Visiting [Site3]
4

1 に答える 1

2

どのように振る舞うべきか、特に別のページへのクロールをどのように決定するかについて、慎重に考える必要があります。このコードは、次のcrawlメソッドに集中しています。

  1. の場合n < 0は、十分に深くクロールしており、何もしたくありません。したがって、その場合は単に戻ります。

  2. それ以外の場合は、ページを分析します。次に、深さ の新しい URL のそれぞれにクロールしますn-1

混乱の一部は、アクセスする URL のキューを保持しているだけでなく、再帰的にクロールしていることだと思います。1 つには、キューには、順番にアクセスしたい最後にクロールされた URL の子だけでなく、クロールされたがまだ完全には処理されていない他のノードの子も含まれることを意味します。そのように深さ優先検索の形状を管理するのは困難です。

will_visit代わりに、変数を削除してanalyze、見つかったリンクのリストを返します。次に、上記の手順 2 に従ってそのリストを次のように処理します。

# 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)

analyzeこれを機能させるには、URL をスタックに入れるのではなく、単に URL のリストを返すように変更する必要もあります。

def analyze(self, url):
    ...
    urls = collector.getLinks()
    returns urls
于 2012-11-12T03:29:07.587 に答える