Python 爬虫进阶:使用 Scrapy 库进行数据提取和处理
在之前的基础教程中,我们介绍了如何使用 Scrapy 创建和运行一个简单的爬虫。在这篇文章中,我们将深入了解 Scrapy 的强大功能,学习如何高效地提取和处理数据。
Scrapy 爬虫框架的数据提取与处理机制。通过 Selectors 基于 XPath 或 CSS 表达式选取 HTML 元素,结合 Item 类定义结构化数据结构。数据处理依赖 Item Pipeline,按顺序执行清洗、验证和持久化操作。示例展示了如何配置 Pipeline 将数据写入 JSON 文件,并在 settings.py 中启用管道组件。该流程实现了从网页抓取到数据存储的完整闭环。

在之前的基础教程中,我们介绍了如何使用 Scrapy 创建和运行一个简单的爬虫。在这篇文章中,我们将深入了解 Scrapy 的强大功能,学习如何高效地提取和处理数据。
在使用 Scrapy 之前,请确保已安装 Python 环境(建议 3.6+)。通过 pip 安装 Scrapy 框架:
pip install scrapy
创建一个新的 Scrapy 项目:
scrapy startproject myproject
cd myproject
这将生成一个包含 myproject/settings.py、myproject/spiders/ 等目录的标准项目结构。
在 Scrapy 中,提取数据主要通过 Selectors 来完成。Selectors 基于 XPath 或 CSS 表达式的查询语言来选取 HTML 文档中的元素。你可以在你的爬虫中使用 response 对象的 xpath 或 css 方法来创建一个 Selector 对象。
例如,我们可以修改我们的 QuotesSpider 爬虫,使用 Selectors 来提取每个引用的文本和作者:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
# 使用 get() 获取第一个匹配项,getall() 获取所有匹配项列表
text = quote.css('span.text::text').get()
author = quote.css('span small::text').get()
print(f'Text: {text}, Author: {author}')
此外,Scrapy 还提供了 Item 类,可以定义你想要收集的数据结构。Item 类非常适合收集结构化数据,如我们从 quotes.toscrape.com 中获取的引用:
import scrapy
class QuoteItem(scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()
然后我们可以修改 QuotesSpider 爬虫,使其生成和收集 QuoteItem 对象:
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
]
def parse(self, response):
for quote in response.css('div.quote'):
item = QuoteItem()
item['text'] = quote.css('span.text::text').get()
item['author'] = quote.css('span small::text').get()
yield item
Scrapy 使用数据管道(pipelines)来处理爬虫从网页中抓取的 Item。当爬虫生成一个 Item,它将被发送到 Item Pipeline 进行处理。
Item Pipeline 是一些按照执行顺序排列的类,每个类都是一个数据处理单元。每个 Item Pipeline 组件都是一个 Python 类,必须实现一个 process_item 方法。这个方法必须返回一个 Item 对象,或者抛出 DropItem 异常,被丢弃的 item 将不会被之后的 pipeline 组件所处理。
例如,我们可以添加一个 Pipeline,将收集的引用保存到 JSON 文件中:
import json
class JsonWriterPipeline(object):
def open_spider(self, spider):
self.file = open('quotes.jl', 'w', encoding='utf-8')
def close_spider(self, spider):
self.file.close()
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
你需要在项目的设置文件(settings.py)中启用你的 Pipeline:
ITEM_PIPELINES = {
'tutorial.pipelines.JsonWriterPipeline': 1,
}
数字表示优先级,数字越小优先级越高。
在实际开发中,通常还需要对数据进行验证。例如,检查字段是否为空:
class ValidationPipeline:
def process_item(self, item, spider):
if not item.get('text'):
raise Exception("Missing text field")
return item
完成配置后,可以通过命令行运行爬虫:
scrapy crawl quotes
Scrapy 支持直接导出多种格式,无需编写额外的 Pipeline 代码即可将结果输出为 JSON、CSV 或 XML:
scrapy crawl quotes -o output.json
scrapy crawl quotes -o output.csv
这种方式更加便捷,适合快速测试和临时数据导出。
本文详细介绍了 Scrapy 框架中的数据提取与处理流程。通过 Selectors 灵活定位页面元素,利用 Item 规范数据结构,并通过 Pipeline 实现数据的清洗、验证和持久化。掌握这些核心机制,能够帮助开发者构建稳定、高效的网络爬虫系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online