2011-07-06 6 views
8

Scrapyのドキュメントにいくつかの読書をした後、私はまだCrawlSpiderのルールを使用して、独自のリンク抽出メカニズムをコールバックメソッドに実装すること間の違いをキャッチしていません。リンクをたどる、Scrapy Webクローラフレームワーク

私は、後者のアプローチを使用して新しいWebクローラを作成しようとしていますが、過去のプロジェクトでルールを使用していたために悪い経験をしました。私は本当に何をやっているのか、その理由を正確に知りたいです。

このツールに詳しい方は、

ありがとうございました!

答えて

10

CrawlSpiderはBaseSpiderを継承します。リンクを抽出して追跡するためのルールが追加されました。 これらのルールは、あなたのために十分に柔軟でない場合 - BaseSpiderを使用します。

class USpider(BaseSpider): 
    """my spider. """ 

    start_urls = ['http://www.amazon.com/s/?url=search-alias%3Dapparel&sort=relevance-fs-browse-rank'] 
    allowed_domains = ['amazon.com'] 

    def parse(self, response): 
     '''Parse main category search page and extract subcategory search link.''' 
     self.log('Downloaded category search page.', log.DEBUG) 
     if response.meta['depth'] > 5: 
      self.log('Categories depth limit reached (recursive links?). Stopping further following.', log.WARNING) 

     hxs = HtmlXPathSelector(response) 
     subcategories = hxs.select("//div[@id='refinements']/*[starts-with(.,'Department')]/following-sibling::ul[1]/li/a[span[@class='refinementLink']]/@href").extract() 
     for subcategory in subcategories: 
      subcategorySearchLink = urlparse.urljoin(response.url, subcategorySearchLink) 
      yield Request(subcategorySearchLink, callback = self.parseSubcategory) 

    def parseSubcategory(self, response): 
     '''Parse subcategory search page and extract item links.''' 
     hxs = HtmlXPathSelector(response) 

     for itemLink in hxs.select('//a[@class="title"]/@href').extract(): 
      itemLink = urlparse.urljoin(response.url, itemLink) 
      self.log('Requesting item page: ' + itemLink, log.DEBUG) 
      yield Request(itemLink, callback = self.parseItem) 

     try: 
      nextPageLink = hxs.select("//a[@id='pagnNextLink']/@href").extract()[0] 
      nextPageLink = urlparse.urljoin(response.url, nextPageLink) 
      self.log('\nGoing to next search page: ' + nextPageLink + '\n', log.DEBUG) 
      yield Request(nextPageLink, callback = self.parseSubcategory) 
     except: 
      self.log('Whole category parsed: ' + categoryPath, log.DEBUG) 

    def parseItem(self, response): 
     '''Parse item page and extract product info.''' 

     hxs = HtmlXPathSelector(response) 
     item = UItem() 

     item['brand'] = self.extractText("//div[@class='buying']/span[1]/a[1]", hxs) 
     item['title'] = self.extractText("//span[@id='btAsinTitle']", hxs) 
     ... 

BaseSpiderのstart_urlsはあなたのために柔軟に十分でない場合でも、start_requestsメソッドをオーバーライドします。

+0

ありがとう!私はアマゾンをクロールしているとは言いませんでしたので、あなたは信じられないほど有用なリソースを与えました:D。 Amazonにはハッシュ文字を含むいくつかのURLがあり、Scrapyはそのハッシュ記号から最後までURLを削除しています。この動作を変更してURL全体を保持する方法がある場合は、あなたにお答えください。 T.I.A、あなたの助けに感謝します。 – romeroqj

+0

どこがストリップですか? request.url、xpathセレクタまたは? – warvariuc

+0

チェックするのに気にしない場合は、このために新しいスレッドを作成します。 http://stackoverflow.com/questions/6604690/scrapy-hash-tag-on-urls – romeroqj

1

ページネーションなどのために「次へ」リンクを取得するような、選択的なクロールが必要な場合は、独自のクローラを作成することをお勧めします。しかし、一般的なクロールでは、crawlspiderを使用して、ルール& process_links関数を使用して従う必要のないリンクを除外する必要があります。

\scrapy\contrib\spiders\crawl.pyのクロールスパイダーコードを見てください。複雑すぎるわけではありません。

+0

その場ですぐに!実際に私は "次の"リンクに従うつもりであることを忘れていました!参照ありがとう。 – romeroqj

関連する問題