2011-07-06 42 views
8

經過多次閱讀Scrapy文檔,我仍然沒有捕捉到使用CrawlSpider規則和在回調方法上實現我自己的鏈接提取機制之間的區別。以下鏈接,Scrapy網頁爬蟲框架

我正在寫一個使用後一種方法的新網絡爬蟲,但是因爲我在使用規則的過去項目中遇到了不好的經歷。我真的很想知道我在做什麼以及爲什麼。

任何人都熟悉這個工具?

感謝您的幫助!

回答

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。 亞馬遜有一些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

如果您想要選擇性抓取,比如抓取分頁等的「下一步」鏈接,最好編寫自己的抓取工具。但是對於一般抓取,您應該使用爬網搜索器並使用規則& process_links函數篩選出不需要遵循的鏈接。

看一看在\scrapy\contrib\spiders\crawl.py的抓取器代碼,它不是很複雜。

+0

就在當場!其實我忘了提及我打算按照「下一步」鏈接!感謝您的參考。 – romeroqj