🌈个人主页:易辰君-CSDN博客
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html
目录
[一、了解 Scrapy Shell](#一、了解 Scrapy Shell)
[二、配置文件 settings.py](#二、配置文件 settings.py)
前言
Scrapy 是一个功能强大的 Python 爬虫框架,在其中,管道(Pipeline) 是处理抓取到的数据的核心部分。管道的作用是对爬虫抓取到的 Item 进行后续处理,例如清洗、验证、存储等操作。本节将从多个方面详细介绍 Scrapy 管道的使用,包括管道的基本功能、配置方法、数据存储的实现、管道的多样化处理逻辑以及注意事项。
一、了解 Scrapy Shell
在正式进入管道的使用之前,我们需要先了解 Scrapy 提供的一个非常实用的交互式工具------Scrapy Shell。它允许开发者快速测试 XPath、CSS 选择器规则和查看响应对象的属性,为管道的数据清洗和存储提供了数据结构的确认依据。
使用方法
在终端中运行以下命令进入 Scrapy Shell:
bash
scrapy shell https://movie.douban.com/top250
进入交互式终端后,你可以通过以下常用命令测试和调试:
python
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 存储管道
python
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 存储管道
python
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
文件中配置管道:
python
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 管道的使用,是构建高效爬虫项目的重要技能之一。