爬虫框架Scrapy之scrapy.CrawlSpider

Scrapy提供了如下Spiders:

  • scrapy.spiders.Spider
  • scrapy.spiders.CrawlSpider
  • scrapy.spiders.XMLFeedSpider
  • scrapy.spiders.CSVFeedSpider
  • scrapy.spiders.SitemapSpider

scrapy.spiders.Spider是之前一直介绍的,下面介绍另一个常用的,scrapy.spiders.CrawlSpider:

在爬取一些特殊类型的网站时,比如一些博客类网站,其网页的链接都会有一些特殊的形式,简单的例子,博客园的博客内容,http://www.cnblogs.com/cnkai/p/7397421.html,http://www.cnblogs.com/cnkai/p/7396835.html比如我们想爬取我的博客内容,会发现,除了最后的几个数字不同,其他的内容是相同的,因此,我们就可以通过这个类来进行自动抓取相似的链接,而无需我们自己定义。
CrawlSpider类定义了如下的属性和方法。

直接来个代码:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class MySpider(CrawlSpider):
    name = 'cnblog'
    allowed_domains = []
    start_urls = ['http://www.cnblogs.com']

    rules = (
        Rule(LinkExtractor(allow=('http://www.cnblogs.com/\w+/p/\d+.html', )), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        print(response.url)

简单的解释:
rules()中的allow=('http://www.cnblogs.com/\w+/p/\d+.html', )表示我们需要匹配的格式,其中包含了正则表达式,\w+表示匹配任意的字母数字下划线汉字至少一次,\d+表示匹配任意的数字至少一次,callback设置回调函数,follow=True表示跟进response里面的链接,最终的结果就是提取出所有的满足要求的连接,并打印出来,这个数量会很庞大,如果你的爬虫没有被ban的话,这里我简单的运行一下,可以看到下面的链接被打印了出来。且这些链接是满足我们要求的格式。

posted @ 2018-05-01 21:35  wbinbin  阅读(164)  评论(0)    收藏  举报