Scrapy 是一个功能强大的 Python 爬虫框架,在其中,管道(Pipeline) 是处理抓取到的数据的核心部分。管道的作用是对爬虫抓取到的 Item 进行后续处理,例如清洗、验证、存储等操作。本节将从多个方面详细介绍 Scrapy 管道的使用,包括管道的基本功能、配置方法、数据存储的实现、管道的多样化处理逻辑以及注意事项。
在正式进入管道的使用之前,我们需要先了解 Scrapy 提供的一个非常实用的交互式工具——Scrapy Shell。它允许开发者快速测试 XPath、CSS 选择器规则和查看响应对象的属性,为管道的数据清洗和存储提供了数据结构的确认依据。
使用方法
在终端中运行以下命令进入 Scrapy Shell:
scrapy shell https://movie.douban.com/top250
进入交互式终端后,你可以通过以下常用命令测试和调试:
response.xpath('//div[@class="title"]/text()').getall()
response.url
:查看当前响应的 URL。
response.request.url
:查看当前请求对应的 URL。
response.headers
:查看响应头。
response.body
:查看响应体(HTML 数据,默认是二进制格式)。
response.request.headers
:查看请求头。
Scrapy Shell 是调试抓取规则和验证数据结构的关键工具,为管道中的数据清洗提供了基础。
settings.py
在 Scrapy 项目中,settings.py
文件起到了全局配置的作用。管道的配置、爬虫行为控制(如并发数、延迟设置)都在这个文件中完成。
USER_AGENT
、DOWNLOAD_DELAY
。
settings
模块即可访问这些配置。
USER_AGENT
:设置用户代理字符串,模拟浏览器访问。
ROBOTSTXT_OBEY
:是否遵守 robots.txt
协议,默认为 True
。
CONCURRENT_REQUESTS
:设置并发请求数,默认是 16。
DOWNLOAD_DELAY
:下载延迟,控制抓取频率。
COOKIES_ENABLED
:是否启用 Cookie 支持,默认为开启。
DEFAULT_REQUEST_HEADERS
:设置默认请求头。
ITEM_PIPELINES
:用于启用和配置管道。
LOG_LEVEL
和 LOG_FILE
:控制日志输出的级别和保存路径。
这些配置直接影响 Scrapy 的运行行为和性能。
管道是 Scrapy 数据处理流程中的重要部分,主要用于抓取数据的清洗、存储和验证。
open_spider(self, spider)
在爬虫启动时运行一次,通常用于初始化资源,例如连接数据库、打开文件等。
process_item(self, item, spider)
管道的核心方法,每抓取到一个 Item
,Scrapy 会将其传递到此方法中进行处理。处理完成后,需返回处理后的 Item
。
close_spider(self, spider)
在爬虫结束时运行一次,用于释放资源,例如关闭数据库连接或文件句柄。
以下是一个示例管道,分别将数据存储到 MySQL 和 MongoDB 数据库。
1.MySQL 存储管道
import pymysql
class MyspiderMySQLPipeline:
def open_spider(self, spider):
if spider.name == 'douban':
self.db = pymysql.connect(
host="localhost",
user="root",
password="root",
db="spiders9"
)
self.cursor = self.db.cursor()
sql = '''
CREATE TABLE IF NOT EXISTS douban (
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
quote VARCHAR(255) NOT NULL,
rating VARCHAR(255) NOT NULL,
title VARCHAR(255) NOT NULL
)
'''
self.cursor.execute(sql)
def process_item(self, item, spider):
sql = '''
INSERT INTO douban (id, quote, rating, title)
VALUES (%s, %s, %s, %s)
'''
try:
self.cursor.execute(sql, (0, item['quote'], item['rating'], item['title']))
self.db.commit()
except Exception as e:
self.db.rollback()
return item
def close_spider(self, spider):
self.db.close()
2.MongoDB 存储管道
import pymongo
class MyspiderMongoDBPipeline:
def open_spider(self, spider):
if spider.name == 'douban':
self.client = pymongo.MongoClient(host='127.0.0.1', port=27017)
self.collection = self.client.spiders9.douban
def process_item(self, item, spider):
self.collection.insert_one(dict(item))
return item
def close_spider(self, spider):
self.client.close()
在 settings.py
文件中配置管道:
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderMySQLPipeline': 300,
'myspider.pipelines.MyspiderMongoDBPipeline': 400,
}
权重值越小的管道越早执行,例如上述配置中,MySQLPipeline
会先处理数据,然后 MongoDBPipeline
再处理。
process_item
方法对抓取到的数据进行清洗,例如去除 HTML 标签、格式化日期等。
settings.py
中通过 ITEM_PIPELINES
启用管道,否则即使管道代码正确,Scrapy 也不会调用它们。
item
每个管道的 process_item
方法必须返回 item
,否则后续管道无法接收到数据。
open_spider
和 close_spider
方法在爬虫启动和关闭时初始化和释放资源。
管道是 Scrapy 爬虫项目中处理数据的核心组件。通过管道,可以对抓取的数据进行清洗、验证、存储等操作。在实际开发中,合理配置和使用管道,不仅可以提高数据处理效率,还能保证数据质量。掌握 Scrapy 管道的使用,是构建高效爬虫项目的重要技能之一。