2012-01-10 81 views
12

我正在使用scrapy在網站上檢索多個頁面。 變量start_urls用於定義要爬網的頁面。 我最初開始第1頁,從而確定start_urls = [1st page]文件example_spider.pyscrapy中的動態start_urls

在當從第1頁獲得更多的信息,我將確定什麼是被抓取網頁旁邊,然後將相應分配start_urls。因此,我必須覆蓋上面的example_spider.py,更改爲start_urls = [1st page, 2nd page, ..., Kth page],然後再次運行scrapy抓取。

這是最好的方法還是有更好的方法來動態分配使用scrapy API start_urls而不必覆蓋example_splider.py? 謝謝。

回答

21

start_urls class屬性包含啓動url - 僅此而已。如果你提取的其他網頁的網址,你想刮 - 產量從[其他]回調parse回調對應的請求:

class Spider(BaseSpider): 

    name = 'my_spider' 
    start_urls = [ 
       'http://www.domain.com/' 
    ] 
    allowed_domains = ['domain.com'] 

    def parse(self, response): 
     '''Parse main page and extract categories links.''' 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select("//*[@id='tSubmenuContent']/a[position()>1]/@href").extract() 
     for url in urls: 
      url = urlparse.urljoin(response.url, url) 
      self.log('Found category url: %s' % url) 
      yield Request(url, callback = self.parseCategory) 

    def parseCategory(self, response): 
     '''Parse category page and extract links of the items.''' 
     hxs = HtmlXPathSelector(response) 
     links = hxs.select("//*[@id='_list']//td[@class='tListDesc']/a/@href").extract() 
     for link in links: 
      itemLink = urlparse.urljoin(response.url, link) 
      self.log('Found item link: %s' % itemLink, log.DEBUG) 
      yield Request(itemLink, callback = self.parseItem) 

    def parseItem(self, response): 
     ... 

如果仍然要自定義開始請求創建,重寫方法BaseSpider.start_requests()

+0

是parseItem(self,response)是否返回該項目? – friddle 2013-12-02 12:39:15

+0

'parseItem'作爲任何其他回調可以返回一個'Item'或另一個'請求'與另一個回調 – warvariuc 2013-12-02 13:04:09

+0

謝謝你回答 – friddle 2013-12-03 11:58:04

相關問題