3

Pythonで小さなWebクローラーを作成しようとしています。今私をつまずかせているように見えるのは、この問題の再帰的な部分と深さです。そこからリンクしたいサイトの数のURLとmaxDepthを指定して、検索したサイトのセットにURLを追加し、サイトからすべてのテキストとリンクをダウンロードします。URLに含まれるすべてのリンクについて、各リンクを検索して、その単語とリンクを取得したいと思います。問題は、次のURLを再帰的に呼び出すと、深さがすでにmaxDepthにあり、あと1ページだけ移動すると停止することです。うまくいけば、それをきちんと説明しました。基本的に、私が尋ねている質問は、すべての再帰呼び出しを実行してから、self._depth + =1を設定する方法です。

def crawl(self,url,maxDepth):        

    self._listOfCrawled.add(url)

    text = crawler_util.textFromURL(url).split()

    for each in text:
        self._index[each] = url

    links = crawler_util.linksFromURL(url)

    if self._depth < maxDepth:
        self._depth = self._depth + 1
        for i in links:
            if i not in self._listOfCrawled:
                self.crawl(i,maxDepth) 
4

1 に答える 1

3

コードの問題はself.depth、関数を呼び出すたびに増加することです。これはインスタンスの変数であるため、次の呼び出しでも増加したままになります。たとえばmaxDepth、3で、Aページ、、、にリンクするURLBと、にリンクするURLがありC、にBリンクがあるDCEます。呼び出し階層は次のようになります(self._depth最初は0であると想定)。

crawl(self, A, 3)          # self._depth set to 1, following links to B and C
    crawl(self, B, 3)      # self._depth set to 2, following link to D
        crawl(self, D, 3)  # self._depth set to 3, no links to follow
    crawl(self, C, 3)      # self._depth >= maxDepth, skipping link to E

つまり、現在の呼び出しの代わりに、への呼び出しの累積depthを追跡します。crawl

代わりに、次のようなものを試してください。

def crawl(self,url,depthToGo):
    # call this method with depthToGo set to maxDepth
    self._listOfCrawled.add(url)
    text = crawler_util.textFromURL(url).split()
    for each in text:
        # if word not in index, create a new set, then add URL to set
        if each not in self._index:
            self._index[each] = set([])
        self._index[each].add(url)
    links = crawler_util.linksFromURL(url)
    # check if we can go deeper
    if depthToGo > 0:
        for i in links:
            if i not in self._listOfCrawled:
                # decrease depthToGo for next level of recursion
                self.crawl(i, depthToGo - 1) 
于 2012-09-18T20:45:44.307 に答える