2017-02-28 9 views
1

現在、私は、スクラップを使用して小さなWeb廃棄プロトタイプを作成しようとしています。 私の現在の問題は、リンク抽出とそれに続くものです。深いクロールが動作しない

私はページを探索し、ページへのリンクを見つけようとしていますが(画像やその他のコンテンツは現在ありません)、正しくパラメータを設定する方法はわかりません。

これは私が使用しているクモです:

class DefaultSpider(CrawlSpider): 

    name = "default" 
    session_id = -1 
    rules = [Rule(LinkExtractor(allow=()),callback='parse', follow=True)] 

def start_requests(self): 
    #not relevent code that gives an URL list to be scrawled 
    for url in listurl: 

    #make scrappy follow only the current domain url. 
    self.rules[0].allow=url 
     yield scrapy.Request(url=url, callback=self.parse) 

def parse(self, response): 
    page = Website(response.url,response.text) 
    DBInterface.store(page) 

をページ内のすべてのリンクを見つけるように見えるdoesntのクモ。私はそれが正しい方法ではないと思う。私は、parseメソッドの代わりにコールバックとして別の関数を試しました。 (あまりにもルールのコールバックパラメータを変更)

def processlinks (self,response) 
    page = Website(response.url,response.text) 
    DBInterface.store(page) 

編集:適切な理解のための更新コード+タイトル...

答えて

0

CrawlSpiderは(ところでそれらを抽出していない)リンクをたどるためにrulesサポートを追加するクモの特別な種類です。仕事へのこのクモの場合

、あなたのリンクを得ることについてcan't overridestart_requestsparse方法

、私が抽出クリーナーを作るLinkExtractorを使用することをお勧めします:

scrapy

def find_links(self, response): 
    for link in LinkExtractor().extract_links(response): 
     logging.info('Extracting new url' + link.url) 
     yield scrapy.Request(link.url, callback=self.insert_linkDB) 

からLinkExtractorの最新情報があります。in the documentation

+0

私はきちんとそれをより明確にするために、タイトルと私のコードを編集し、私はあなたの提案を理解し、私はあなたが私が何を意味するか誤解だと思います。私は心配しています! – Neil

+1

多分あなたは私の答えの最初の部分を読まなかったかもしれませんが、 'CrawlSpider'を使うときは、' start_requests'と 'parse'メソッドをオーバーライドできません。私はあなたのコードの中でそれらを見ているので、あなたのクモが動作していない理由になる可能性があります。 – eLRuLL

+0

"parseメソッドの代わりにコールバックとして別の関数を試しました。(ルールコールバックパラメータも変更しました)"私は引用しています。これは、解析をオーバーライドするか、別のメソッドをコールバックとして使用する場合と同じように動作します。 – Neil

0

CrawlSpiderは、後でLinkExtractorで抽出するものと同じ方法で初期URLを処理するのがやや難しいです。問題は、が手動で開始するすべての要求に対してカスタムコールバックを定義してはならないことです。LinkExtractorが機能しないようにするためです。一方、最初のURLを含め、クロールされたURLごとに何らかのアクションを実行する必要があります。 LinkExtractorで抽出されたURLの場合、ルールを定義するときにコールバックを提供できますが、これらのルールを使用して抽出されない初期URLでは明らかに機能しません。この目的のために、Scrapyは別の方法を提供しています。これを無効にする必要があります。だからあなたの場合には、次はあなたがやりたいことになります。

class DefaultSpider(CrawlSpider): 

    name = "default" 
    session_id = -1 
    rules = [Rule(LinkExtractor(allow=()),callback='parse_results', follow=True)] 

def start_requests(self): 
    #not relevent code that gives an URL list to be scrawled 
    for url in listurl: 

    #make scrappy follow only the current domain url. 
    self.rules[0].allow=url 
     yield scrapy.Request(url=url) 

def parse_start_url(self, response): 
    self.parse_results(response) 

def parse_results(self, response): 
    page = Website(response.url,response.text) 
    DBInterface.store(page) 
関連する問題