scrapy 使用Feed exports 输出json lines文件

Scrapy通过设置FEED_URI和FEED_FORMAT可以实现Feed导出,例如将数据导出为JSON Lines格式。在遇到中文编码问题时,可以在JsonItemExporter中设置ensure_ascii=False。支持的存储后端包括本地文件系统、FTP、S3等,可使用%(time)s和%(name)s等参数动态配置存储路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在settings文件中加入下面两行配置就可以开启了

FEED_URI = 'file:///D:/vagrant/python/scrapy/123.jsonl'
FEED_FORMAT = 'jsonlines'

注意FEED_URI的配置(我的是在windows环境),如果在 (只有)存储在本地文件系统时,您可以指定一个绝对路径 /tmp/export.csv 并忽略协议(scheme)。不过这仅仅只能在Unix系统中工作.

通过上面的配置就可以简单的开启并使用了不过会遇到中文的编码问题这个可以在调用 scrapy.contrib.exporter.JsonItemExporter 的时候额外指定 ensure_ascii=False 就可以啦 答案地址在下面 https://segmentfault.com/q/1010000000367894

关于这部分全部的东西给大家放在下面:
导出文件

新版本0.10。

实现爬虫时最常需要的特征之一是能够正确地存储所过滤的数据,并且经常意味着使用被过滤的数据(通常称为“export feed”)生成要由其他系统消耗的“导出文件” 。

Scrapy使用Feed导出功能即时提供此功能,这允许您使用多个序列化格式和存储后端来生成包含已抓取项目的Feed。

序列化格式

为了序列化抓取的数据,Feed导出使用项导出器。这些格式是开箱即用的:

  • JSON
  • JSON lines
  • CSV
  • XML

但您也可以通过FEED_EXPORTERS设置扩展支持的格式 。

JSON

FEED_FORMAT: json
使用出口: JsonItemExporter
如果您对大型Feed使用JSON,请参阅此警告。

JSON lines

FEED_FORMAT: jsonlines
使用出口: JsonLinesItemExporter

CSV

FEED_FORMAT: csv
使用出口: CsvItemExporter
指定要导出的列及其顺序使用 FEED_EXPORT_FIELDS。其他Feed导出程序也可以使用此选项,但它对CSV很重要,因为与许多其他导出格式不同,CSV使用固定标头。

XML

FEED_FORMAT: xml
使用出口: XmlItemExporter

Pickle

FEED_FORMAT: pickle
使用出口: PickleItemExporter

Marshal

FEED_FORMAT: marshal
使用出口: MarshalItemExporter
存储

使用Feed导出时,您可以使用URI(通过FEED_URI设置)定义在哪里存储Feed 。Feed导出支持由URI方案定义的多个存储后端类型。

支持开箱即用的存储后端包括:

本地文件系统
FTP
S3(需要 botocore或 boto)
标准输出
如果所需的外部库不可用,则某些存储后端可能无法使用。例如,S3后端仅在安装了botocore 或boto库时可用(Scrapy仅支持boto到Python 2)。

存储URI参数

存储URI还可以包含在创建订阅源时被替换的参数。这些参数是:

%(time)s - 在创建订阅源时由时间戳替换
%(name)s - 被蜘蛛名替换
任何其他命名参数将替换为同名的spider属性。例如, 在创建订阅源的那一刻,%(site_id)s将被spider.site_id属性替换。

这里有一些例子来说明:

存储在FTP中使用每个蜘蛛一个目录:
ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json
存储在S3使用每个蜘蛛一个目录:
s3://mybucket/scraping/feeds/%(name)s/%(time)s.json
存储后端

本地文件系统

订阅源存储在本地文件系统中。

URI方案: file
示例URI: file:///tmp/export.csv
所需的外部库:none
请注意,(仅)对于本地文件系统存储,如果指定绝对路径,则可以省略该方案/tmp/export.csv。这只适用于Unix系统。

FTP

订阅源存储在FTP服务器中。

URI方案: ftp
示例URI: ftp://user:pass@ftp.example.com/path/to/export.csv
所需的外部库:none
S3

订阅源存储在Amazon S3上。

URI方案: s3
示例URI:
s3://mybucket/path/to/export.csv
s3://aws_key:aws_secret@mybucket/path/to/export.csv
所需的外部库:botocore或boto
AWS凭证可以作为URI中的用户/密码传递,也可以通过以下设置传递:

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
标准输出

Feed被写入Scrapy进程的标准输出。

URI方案: stdout
示例URI: stdout:
所需的外部库:none
设置

这些是用于配置Feed导出的设置:

FEED_URI (强制性)
FEED_FORMAT
FEED_STORAGES
FEED_EXPORTERS
FEED_STORE_EMPTY
FEED_EXPORT_ENCODING
FEED_EXPORT_FIELDS
FEED_URI

默认: None

导出Feed的URI。请参阅支持的URI方案的存储后端。

启用Feed导出时需要此设置。

FEED_FORMAT

要用于Feed的序列化格式。有关可能的值,请参阅 序列化格式。

FEED_EXPORT_ENCODING

默认: None

要用于Feed的编码。

如果取消设置或设置为None(默认),它使用UTF-8除了JSON输出,\uXXXX由于历史原因使用安全的数字编码(序列)。

使用utf-8,如果你想UTF-8 JSON了。

FEED_EXPORT_FIELDS

默认: None

要导出的字段的列表,可选。示例:。FEED_EXPORT_FIELDS = [“foo”, “bar”, “baz”]

使用FEED_EXPORT_FIELDS选项定义要导出的字段及其顺序。

当FEED_EXPORT_FIELDS为空或无(默认)时,Scrapy使用在Item蜘蛛正在产生的dicts 或子类中定义的字段。

如果导出器需要一组固定的字段(CSV导出格式为这种情况 ),并且FEED_EXPORT_FIELDS为空或无,则Scrapy会尝试从导出的​​数据中推断字段名称 - 当前它使用第一个项目中的字段名称。

FEED_STORE_EMPTY

默认: False

是否导出空Feed(即,没有项目的Feed)。

FEED_STORAGES
默认: {}

包含您的项目支持的其他Feed存储后端的字典。键是URI方案,值是存储类的路径。

FEED_STORAGES_BASE

默认:

{
”: ‘scrapy.extensions.feedexport.FileFeedStorage’,
‘file’: ‘scrapy.extensions.feedexport.FileFeedStorage’,
‘stdout’: ‘scrapy.extensions.feedexport.StdoutFeedStorage’,
‘s3’: ‘scrapy.extensions.feedexport.S3FeedStorage’,
‘ftp’: ‘scrapy.extensions.feedexport.FTPFeedStorage’,
}

包含Scrapy支持的内置Feed存储后端的字典。您可以通过分配其中None的URI方案 来禁用这些后端FEED_STORAGES。例如,要禁用内置FTP存储后端(无替换),请将其放置在settings.py:

FEED_STORAGES = {
‘ftp’: None,
}

FEED_EXPORTERS

默认: {}

包含您的项目支持的其他导出器的字典。键是序列化格式,值是Item exporter类的
FEED_EXPORTERS_BASE={
‘json’: ‘scrapy.exporters.JsonItemExporter’,
‘jsonlines’: ‘scrapy.exporters.JsonLinesItemExporter’,
‘jl’: ‘scrapy.exporters.JsonLinesItemExporter’,
‘csv’: ‘scrapy.exporters.CsvItemExporter’,
‘xml’: ‘scrapy.exporters.XmlItemExporter’,
‘marshal’: ‘scrapy.exporters.MarshalItemExporter’,
‘pickle’: ‘scrapy.exporters.PickleItemExporter’,
}
rapy支持的内置feed导出器的dict。您可以通过分配其中None的序列化格式来禁用任何这些导出器FEED_EXPORTERS。例如,要禁用内置的CSV导出器(无替换),请将其放置在settings.py:

FEED_EXPORTERS = {
    'csv': None,
}
<think>好的,我需要回答用户关于Scrapy数据存储方法及支持的数据格式的问题。首先,我得回忆一下Scrapy的基本结构,特别是关于Item Pipeline的部分,因为数据存储主要在这里处理。 用户提到了几个引用,我需要结合这些内容来组织回答。引用[1]和[2]提到使用Item存放数据并通过管道保存到txt和Excel,这应该是关键点。记得要提到如何定义Item类,然后在pipelines里处理数据。另外,引用[4]提到了禁止cookie的配置,虽然和数据存储不直接相关,但可能在优化存储效率时有帮助。 接下来,数据存储的常见格式包括JSON、CSV、XML、数据库等。需要列出Scrapy支持的内置存储方式,比如Feed Exports,可以导出JSON、CSV、XML等格式。同时,用户可能还需要自定义存储方式,比如使用数据库,这里需要提到使用Pipeline中的open_spider和close_spider方法,以及如何连接数据库。 还要注意用户可能对具体实现步骤感兴趣,比如如何配置ITEM_PIPELINES,编写Pipeline类,以及安装必要的库如openpyxl或pymysql。需要分步骤说明,确保结构清晰,每个步骤有示例代码,比如保存到TXT、Excel、MySQL的代码片段。 最后,生成相关问题时,要考虑用户可能进一步想了解的内容,比如性能优化、增量存储、数据清洗等。确保问题覆盖常见的后续疑问。 检查是否需要符合系统级指令,比如数学公式的格式,但这个问题可能不涉及数学内容,所以可能不需要。但要注意中文回答,语法正确,引用标识的位置。确保所有提到的引用都正确对应,比如引用[1]到[4]在回答中的引用位置是否准确。 总结回答结构:先总述数据存储流程,再分点介绍不同存储方法和格式,结合代码示例,最后给出相关问题。</think>在Scrapy中,数据存储主要通过`Item Pipeline`实现,支持多种格式的持久化存储。以下是具体方法和支持的数据格式: --- ### 一、数据存储核心流程 1. **定义Item类** 在`items.py`中定义数据结构,用于封装爬取的数据字段: ```python class ArticleItem(scrapy.Item): title = scrapy.Field() content = scrapy.Field() url = scrapy.Field() ``` 2. **通过Pipeline处理存储** 在`pipelines.py`中编写处理类,并激活`ITEM_PIPELINES`配置(需在`settings.py`中设置)[^1][^2]: ```python class TxtPipeline: def process_item(self, item, spider): with open("data.txt", "a") as f: f.write(f"{item['title']}\t{item['url']}\n") return item ``` 3. **配置优先级** 在`settings.py`中设置管道执行顺序: ```python ITEM_PIPELINES = { 'project.pipelines.TxtPipeline': 300, # 数值越小优先级越高 } ``` --- ### 二、支持的数据格式及实现方法 #### 1. 文本文件(TXT/CSV/JSON/XML) - **内置Feed Exports** 通过命令行直接导出数据,支持`JSON`、`JSON Lines`、`CSV`、`XML`等格式: ```bash scrapy crawl spider_name -o data.csv scrapy crawl spider_name -o data.json ``` - **自定义存储(如追加到TXT)** 在Pipeline中手动实现: ```python class TxtPipeline: def open_spider(self, spider): self.file = open('data.txt', 'a') def process_item(self, item, spider): self.file.write(f"{item['title']}\n") return item def close_spider(self, spider): self.file.close() ``` #### 2. Excel文件 需安装`openpyxl`库,通过Pipeline实现[^2]: ```python import openpyxl class ExcelPipeline: def __init__(self): self.wb = openpyxl.Workbook() self.ws = self.wb.active self.ws.append(["标题", "链接"]) def process_item(self, item, spider): self.ws.append([item['title'], item['url']]) return item def close_spider(self, spider): self.wb.save("data.xlsx") ``` #### 3. 数据库(MySQL/MongoDB) - **MySQL示例** 使用`pymysql`库连接数据库: ```python import pymysql class MySQLPipeline: def open_spider(self, spider): self.conn = pymysql.connect(host='localhost', user='root', password='123456', database='scrapy') self.cursor = self.conn.cursor() def process_item(self, item, spider): sql = "INSERT INTO articles (title, url) VALUES (%s, %s)" self.cursor.execute(sql, (item['title'], item['url'])) self.conn.commit() return item def close_spider(self, spider): self.cursor.close() self.conn.close() ``` - **MongoDB示例** 使用`pymongo`库: ```python import pymongo class MongoPipeline: def open_spider(self, spider): self.client = pymongo.MongoClient("mongodb://localhost:27017/") self.db = self.client["scrapy_db"] def process_item(self, item, spider): self.db["articles"].insert_one(dict(item)) return item ``` --- ### 三、性能优化建议 - 启用`CONCURRENT_ITEMS`提高管道并行处理能力 - 禁用不需要的Cookie(在`settings.py`中设置`COOKIES_ENABLED = False`)以降低资源消耗[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值