首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
12.1 Charles 抓包工具的使用
12.2 mitmproxy 抓包工具的使用
12.3 mitmdump 实时抓包处理
12.4 Appium 的使用
12.5 基于 Appium 的 App 爬取实战
12.6 Airtest 的使用
12.7 基于 Airtest 的 App 爬取实战
12.8 手机群控爬取实战
12.9 云手机的使用
13.0 Android 逆向
13.1 jadx 的使用
13.2 JEB 的使用
13.3 Xposed 框架的使用
13.4 基于 Xposed 的爬取实战案例
13.5 Frida 的使用
13.6 SSL Pining 问题的解决方案
13.7 Android 脱壳技术简介与实战
13.8 利用 IDA Pro 静态分析和动态调试 so 文件
13.9 基于 Frida-RPC 模拟执行 so 文件
13.10 基于 AndServer-RPC 模拟执行 so 文件
13.11 基于 unidbg 模拟执行 so 文件
14.1 页面智能解析简介
14.2 详情页智能解析算法简介
14.3 详情页智能解析算法的实现
14.4 列表页智能解析算法简介
14.5 列表页智能解析算法的实现
14.6 如何智能分辨列表页和详情页
15.1 Scrapy框架介绍
15.2 Scrapy入门
15.3 Selector 的使用
15.4 Spider 的使用
15.5 Downloader Middleware的使用
15.6 Spider Middleware的使用
15.7 Item Pipeline的使用
15.8 Extension的使用
15.9 Scrapy 对接 Selenium
15.10 Scrapy 对接 Splash
15.11 Scrapy 对接 Pyppeteer
15.12 Scrapy 规则化爬虫
15.13 Scrapy 实战
16.1 分布式爬虫理念
16.2 Scrapy-Redis原理和源码解析
16.3 基于Scrapy-Redis的分布式爬虫实现
16.4 基于Bloom Filter进行大规模去重
16.5 基于RabbitMQ的分布式爬虫
17.1 Scrapyd和ScrapydAPI的使用
17.2 Scrapyd-Client 的使用
17.3 Gerapy 爬虫管理框架的使用
17.4 将Scrapy 项目打包成 Docker 镜像
17.5 Docker Compose 的使用
17.6 Kubernetes的使用
17.7 用 Kubernetes 部署和管理 Scrapy 爬虫
17.8 Scrapy 分布式爬虫的数据统计方案
17.9 基于Prometheus和Grafana的分布式爬虫监控方案
当前位置:
首页>>
技术小册>>
Python3网络爬虫开发实战(下)
小册名称:Python3网络爬虫开发实战(下)
### 15.12 Scrapy 规则化爬虫 #### 引言 在Python网络爬虫开发的广阔领域中,Scrapy作为一个快速高级且用户友好的Web爬取和网页抓取框架,以其强大的功能集和灵活的扩展性赢得了广泛的认可。Scrapy不仅支持异步请求,还内置了多种中间件、选择器以及强大的项目结构,使得开发者能够高效地构建复杂的爬虫系统。其中,Scrapy的“规则化爬虫”(也称为“爬虫规则”或“Spider Rules”)功能,通过定义一系列爬取规则,使得爬虫能够自动化地识别并抓取符合特定模式的网页内容,极大地提高了爬虫的灵活性和效率。本章将深入探讨Scrapy中的规则化爬虫实现方式,包括其基本原理、配置方法、使用场景及高级技巧。 #### Scrapy规则化爬虫基础 ##### 1. Scrapy Spider与CrawlSpider 在Scrapy中,`Spider`是用户编写用于分析response并提取数据的类。而`CrawlSpider`是`Spider`的一个子类,特别适用于处理需要通过链接来发现新页面的情况。`CrawlSpider`通过定义一组规则(`Rule`)来识别可以跟进的链接,并提取这些链接指向页面的数据。每个规则由一个或多个`LinkExtractor`(链接提取器)来定义哪些链接应该被跟进,以及一个或多个`Callback`函数来指定当链接被跟进后应如何处理响应。 ##### 2. LinkExtractor `LinkExtractor`是Scrapy中用于从网页中提取链接的类。它允许你通过正则表达式、CSS选择器或XPath表达式来指定哪些链接应该被提取。此外,你还可以设置是否允许相对URL、是否只提取符合特定属性的链接等选项。 ##### 3. Rule `Rule`类定义了`CrawlSpider`如何根据`LinkExtractor`提取的链接来继续爬取。每个`Rule`都包含至少一个`LinkExtractor`来指定哪些链接应该被跟进,以及一个`callback`函数(可选),该函数定义了当链接被跟进后如何处理响应。`Rule`还允许你设置跟进链接的优先级、是否允许重复请求等参数。 #### 规则化爬虫的实现 ##### 1. 定义CrawlSpider 首先,你需要从`scrapy.spiders`导入`CrawlSpider`类,并继承它来定义你的爬虫。在定义时,你需要指定爬虫的名称以及一个或多个起始URL。 ```python from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class MyCrawlSpider(CrawlSpider): name = 'my_crawl_spider' allowed_domains = ['example.com'] start_urls = ['http://example.com/category/page1.html'] rules = ( # 定义一个规则 Rule(LinkExtractor(allow=r'category/page\d+\.html'), callback='parse_item', follow=True), ) def parse_item(self, response): # 处理响应数据 pass ``` ##### 2. 编写Callback函数 `callback`函数是处理响应数据的地方。在这个函数中,你可以使用Scrapy的选择器(如XPath选择器或CSS选择器)来提取你感兴趣的数据。 ```python def parse_item(self, response): item = MyItem() # 假设MyItem是一个Item类 item['title'] = response.xpath('//h1/text()').get() item['description'] = response.css('p::text').getall() yield item ``` ##### 3. 配置与优化 - **设置请求深度**:通过`depth_limit`属性可以设置爬虫的最大请求深度,以避免无限循环或过度爬取。 - **设置请求优先级**:在`Rule`中可以通过`priority`参数设置请求的优先级,确保重要链接优先处理。 - **处理重复请求**:Scrapy默认会过滤掉重复的请求,但你也可以通过修改`DUPEFILTER_CLASS`设置来定制重复请求过滤的行为。 - **使用中间件**:Scrapy提供了丰富的中间件接口,你可以通过编写自定义中间件来扩展爬虫的功能,如增加代理支持、用户代理伪装等。 #### 实战案例 假设你需要从一个新闻网站抓取所有分类下的文章标题和链接。首先,你需要分析网站结构,确定哪些链接指向分类页面,哪些链接指向文章页面。然后,你可以编写一个`CrawlSpider`,定义一个规则来提取分类页面的链接,并设置另一个规则(或直接在`parse_item`中处理)来提取文章页面的数据。 ```python from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class NewsCrawlSpider(CrawlSpider): name = 'news_crawler' allowed_domains = ['news.example.com'] start_urls = ['http://news.example.com/category/tech.html'] rules = ( # 提取分类页面链接 Rule(LinkExtractor(allow=r'/category/[\w-]+/page\d+\.html'), callback='parse_category', follow=True), # 提取文章页面数据(假设文章链接具有特定模式) Rule(LinkExtractor(allow=r'/article/\d+-\w+\.html'), callback='parse_article'), ) def parse_category(self, response): # 可以进一步处理分类页面数据,或只是通过follow=True让Scrapy继续跟进链接 pass def parse_article(self, response): # 提取文章标题和链接 title = response.xpath('//h1/text()').get() link = response.url yield {'title': title, 'link': link} ``` #### 结论 Scrapy的规则化爬虫通过`CrawlSpider`和`Rule`类提供了一种高效、灵活的方式来构建能够自动发现新链接并处理这些链接指向页面数据的爬虫。通过合理配置`LinkExtractor`和`Rule`,你可以轻松地定义复杂的爬取逻辑,实现复杂的网页抓取任务。同时,Scrapy的扩展性和灵活性也允许你通过中间件、Item Pipeline等机制来进一步定制和优化你的爬虫系统。掌握Scrapy的规则化爬虫技术,将极大地提升你在Python网络爬虫开发领域的实战能力。
上一篇:
15.11 Scrapy 对接 Pyppeteer
下一篇:
15.13 Scrapy 实战
该分类下的相关小册推荐:
Python爬虫入门与实战开发(下)
Python合辑12-面向对象
Python编程轻松进阶(五)
Python与办公-玩转PPT
Python甚础Django与爬虫
Python与办公-玩转PDF
Python合辑3-字符串用法深度总结
Python机器学习基础教程(下)
Python合辑9-判断和循环
Python面试指南
剑指Python(万变不离其宗)
Python合辑6-字典专题