如何“跟踪”和“过滤”

在很多情况下,我们并不是只抓取某个页面,而需要“顺藤摸瓜”,从几个种子页面,通过超级链接索,最终定位到我们想要的页面。

Scrapy对这个功能进行了很好的抽象:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.item import Item
class Coder4Spider(CrawlSpider):
      name = 'coder4'
      allowed_domains = ['xxx.com']
      start_urls = ['http://www.xxx.com']
      rules = ( 
      Rule(SgmlLinkExtractor(allow=('page/[0-9]+', ))),
      Rule(SgmlLinkExtractor(allow=('archives/[0-9]+', )), callback='parse_item'),
      )   
      def parse_item(self, response):
        self.log('%s' % response.url)

在上面,我们用了CrawlSpider而不是Spider,name、 allowed_domains、start_urls就不解释了。

重点说下Rule:

  • 第1条不带callback的,表示只是“跳板”,即只下载网页并根据allow中匹配的链接,去继续遍历下一步的页面,实际上Rule还可以指定deny=xxx 表示过滤掉哪些页面。

  • 第2条带callback的,是最终会回调parse_item函数的网页。