不点蓝字,我们哪来故事?
01
引言
本篇文章我们来说说CrawlSpider。通过 Scrapy,我们可以轻松地完成一个站点爬虫的编写。但如果抓取的站点量非常大,假设爬取多个站点下多级链接下的内容,Spider 会显的力不从心。如果用Spider继续爬取深度网址需要使用xpath或css selector去解析response中想要继续爬取的网址,再用Scrapy.Request发送请求,得到的Response使用Request中指定的callback函数去解析。
这无疑增加了代码的复杂度,那么,有什么更简单的方法呢?接下来我们来看看CrawlSpider。
02
CrawlSpider
CrawlSpider 是 Scrapy 提供的一个通用 Spider。在 Spider 里,我们可以指定一些爬取规则来实现页面的提取,这些爬取规则由一个专门的数据结构 Rule 表示。Rule 里包含提取和跟进页面的配置,Spider 会根据 Rule 来确定当前页面中的哪些链接需要继续爬取、哪些页面的爬取结果需要用哪个方法解析等。CrawlSpider 继承自 Spider 类。除了 Spider 类的所有方法和属性,它还提供了一些非常重要的属性和方法。
下面以某家五和附近的房源进行说明。
新建一个Scrapy项目
scrapy startproject scrapy_test
创建一个 CrawlSpider,需要先制定一个模板。在这之前我们可以先看看有哪些可用模板:
scrapy genspider -l# 输出Available templates: basic crawl csvfeed xmlfeed
之前文章创建 Spider 的时候,默认使用了第一个模板 basic。这次我们要创建 CrawlSpider,选择使用第二个模板 crawl。
scrapy genspider -t crawl testing sz.lianjia.com
运行之后会生成一个 CrawlSpider,内容代码如下所示:
from scrapy.linkextractors import LinkExtractorfrom scrapy.spiders import CrawlSpider, Ruleclass TestingSpider(CrawlSpider): name = 'testing' allowed_domains = ['sz.lianjia.com'] start_urls = ['https://sz.lianjia.com/zufang/rs%E4%BA%94%E5%92%8C/'] rules = ( Rule(LinkExtractor(allow=r'Items/'), callback=