本篇介绍Crawlspider,相比于Spider,Crawlspider更适用于批量爬取网页。
Crawlspider
- Crawlspider适用于对网站爬取批量网页,相对比Spider类,CrawSpider主要使用规则(rules)来提取链接,通过定义一组规则为跟踪链接提供了遍历的机制。
- Crawlspider 的强大体现在自动爬取页面所有符合规则的链接并深入下去!
全站数据爬取
编码流程
- 新建一个工程 
- cd 工程 
- 创建爬虫文件: - scrapy genspider -t crawl spiderName 地址(crawlspider 继承 scrapy.Spider)- 链接提取器 LinkExtractor- 可以根据指定的规则对指定的链接进行提取- 提取的规则就是构造方法中的 allow(‘正则表达式’) 参数决定
 
 
- 可以根据指定的规则对指定的链接进行提取
- 规则解析器 Rule- 可以将链接提取器提到的链接进行请求,可以根据指定的规则(callback)对请求到的数据进行解析
 
 - Rule(link, callback='parse_item', follow=True)- follow = True 表示每一个页码都当作起始url 然后进行链接提取,如果为 false 只能提取到第一页的几个页码。 
- follow = True; 将链接提取器 继续作用到 连接提取器提取到的链接 所对应的 页码源码中。 
 
- 链接提取器 LinkExtractor
scrapy中发送请求的几种方式:
- start_url
- self.Request()
- 链接提取器
例子
使用CrawlSpider模板批量爬取(阳光热线问政平台的投诉帖子)的主题、状态和详细内容
地址为:http://wz.sun0769.com/html/top/reply.shtml
① 定义spider
scrapy genspider -t crawl sun 创建一个spider
在该spider文件中:
- 定义 LinkExtractor获取每个页面中的页码的url地址。
- 定义 Rule,放入LinkExtractor以及callback,对于 follow 值得话,如果为True得话,将继续作用到LinkExtractor提取到的链接 所对应的 页码源码中。
| 1 | # sun.py | 
② 定义Item类
- 两个Rule是为了拿到所有页码的url,它对应着 Item2
- 另一个Rule是为了拿到所有详情页的url,它对应着 Item1
| 1 | # items.py | 
③ 定义pipeline
定义pipeline做持久化存储!
- 在 open_spider中开起连接
- 在 close_spider中关闭连接
- 在 process_item中执行数据库得插入操作。
遇到的问题:
- 第一个问题:主题和状态与详细内容如何对应起来呢? - 通过对页面进行分析发现,使用在这两个页面中都有编号,所以增加一个新的字段变化,来连接这两块。
 
- 两个数据解析函数不同于使用scrapy.Request进行手动传参,然后通过回调来进行连接。而现在只能定义两个 Item ,在管道中如何判断item类型: - item.__class__.__name__表示类名
 
| 1 | # pipeline.py | 

