如何“跟踪”和“过滤”

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

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

  1. from scrapy.contrib.spiders import CrawlSpider, Rule
  2. from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
  3. from scrapy.selector import Selector
  4. from scrapy.item import Item
  5. class Coder4Spider(CrawlSpider):
  6. name = 'coder4'
  7. allowed_domains = ['xxx.com']
  8. start_urls = ['http://www.xxx.com']
  9. rules = (
  10. Rule(SgmlLinkExtractor(allow=('page/[0-9]+', ))),
  11. Rule(SgmlLinkExtractor(allow=('archives/[0-9]+', )), callback='parse_item'),
  12. )
  13. def parse_item(self, response):
  14. self.log('%s' % response.url)

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

重点说下Rule:

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

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