Scrapy 爬虫模板--CrawlSpider
从这篇文章开始,我将利用三篇文章分别讲解 Scrapy 爬虫模板。 Scrapy 爬虫模板包含四个模板:
- Basic :最基本的模板,这里我们不会讲解;
- CrawlSpider
- XMLFeedSpider
- CSVFEEDSpider
这篇文章我先来讲解一下 CrawlSpider 模板。
零、讲解
CrawlSpider 是常用的 Spider ,通过定制规则来跟进链接。对于大部分网站我们可以通过修改规则来完成爬取任务。 CrawlSpider 常用属性是 rules* ,它是一个或多个 Rule 对象以 tuple 的形式展现。其中每个 Rule 对象定义了爬取目标网站的行为。
Tip:如果有多个 Rule 对象命中同一个链接,那么只有第一个 Rule 对象生效。
我们来看一下 Role 的语法:
Rule(link_extractor [,callback = None] [,cb_kwargs = None] [,follow = None] [,process_links = None] [,process_request = None])
参数解析:
- link_extractor:Link Extrator 对象,是一个正则表达式。主要定义了从网页中提取哪些元素作为继续跟进的链接;
- callback:回调函数,也可以是回调函数的字符串名。接收 Response 作为参数,返回包含 Item 或者 Request 对象列表;
- cb_kwargs:字典类型的对象,传递给回调函数的参数;
- follow:是否根据这个 Rule 的 link_extractor 从 Response 中提取链接;
- process_links:回调函数,也可以是回调函数的字符串名。从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤;
- process_request:回调函数,也可以是回调函数的字符串名。用来过滤 Request ,该规则提取到每个 Request 时都会调用该函数。
一、案例
这个案例我们爬取的是名人名言网站,我们需要做的是提取名言内容、作者姓名和标签,然后通过作者链接进入到作者介绍的页面,最后我们爬取的作者的详细信息。
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class Quotes(CrawlSpider):
name = "quotes"
allow_domain = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com']
rules = (
Rule(LinkExtractor(allow='/page/d+'), callback='parse_quotes', follow=True),
Rule(LinkExtractor(allow='/author/w+_'), callback='parse_author')
)
def parse_quotes(self, response):
for quote in response.css('.quote'):
yield {
'content': quote.css('.text::text').extract_first(),
'author': quote.css('.author::text').extract_first(),
'tags': quote.css('.tag::text').extract()
}
def parse_author(self, response):
name = response.css('.author-title::text').extract_first()
author_born_date = response.css('.author_born_date::text').extract_first()
author_description = response.css('.author_description::text').extract_first()
return ({
'name': name,
'author_born_date': author_born_date,
'author_description': author_description
})
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class Quotes(CrawlSpider):
name = "quotes"
allow_domain = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com']
rules = (
Rule(LinkExtractor(allow='/page/d+'), callback='parse_quotes', follow=True),
Rule(LinkExtractor(allow='/author/w+_'), callback='parse_author')
)
def parse_quotes(self, response):
for quote in response.css('.quote'):
yield {
'content': quote.css('.text::text').extract_first(),
'author': quote.css('.author::text').extract_first(),
'tags': quote.css('.tag::text').extract()
}
def parse_author(self, response):
name = response.css('.author-title::text').extract_first()
author_born_date = response.css('.author_born_date::text').extract_first()
author_description = response.css('.author_description::text').extract_first()
return ({
'name': name,
'author_born_date': author_born_date,
'author_description': author_description
})
上述代码中 Rule(LinkExtractor(allow='/page/d+'), callback='parse_quotes', follow=True),
代码段定义了爬取所有名人名言页的规则,即只要符合 /page/d+
的所有链接就被视为名人名言页,然后我们调用 parse_quotes 方法提取相关数据。 在 Rule(LinkExtractor(allow='/author/w+_'), callback='parse_author')
代码段中我们定义了爬取作者信息页的规则,即只要符合 /author/w+_
的所有链接就被视为作者信息页,之后我们调用 parse_author 方法提取相关数据。
)代码段中我们定义了爬取作者信息页的规则,即只要符合
/author/w+_```的所有链接就被视为作者信息页,之后我们调用 parse_author 方法提取相关数据。
- Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
- Android-Universal-Image-Loader 图片异步加载类库的使用
- 工作组模式下专用队列(Private Queue)如何引用远程队列路径
- haproxy反向代理环境部署(http和https代理)
- 网站速度优化模块HttpCompressionModule
- mysql启动后随即关闭问题解决(ibdata1文件损坏导致)
- webvirtmgr-重命名kvm虚拟机的名称
- Lucene 2.0最基本的入门代码
- 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)
- 查看服务器系统资源(cpu,内容)利用率前几位的进程的方法
- 腾讯云平台部总经理陈磊:大数据背后的技术支撑
- DataSet与Xml相互转化
- SqlTransaction事务使用示例
- nginx的web缓存服务环境部署记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法