Scrapy笔记:持久化,Feed exports的使用

首先要明确的是,其实所有的FeedExporter都是类,里面封装了一般进行io操作的方法。因此,要怎么输出呢?其实从技术实现来说,在生成item的每一步调用其进行储存都是可以的,只不过为了更加符合scrapy的架构,一般都是在Pipeline中使用FeedExporter的。

每一个Exporter的使用都是类似的:

在settings.py中写入相应的配置,

在pipeline中调用exporter:

  exporter.start_exporter()

  exporter.export_item()

  exporter.finish_exporter()

其它工作都已经由scrapy封装好了,所以就不需要再进行额外设定了。

由于item的输出一般是连续输出的,因此可以将export开始和结束的方法放到spider_opened和spider_closed中启动。

以将item输出到json文件为例,下面是相关的配置和写法:

在settings.py中的配置:

1 FEED_FORMAT = 'json' # 输出格式
2 FEED_EXPORTERS_BASE = { 
3     'json': 'scrapy.exporters.JsonItemExporter',
4     'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
5 }

在pipeline中的设定:

 1 class MyCustomPipeline(object):
 2     def __init__(self):
 3         self.files = {}
 4     
 5     @classmethod
 6     def from_crawler(cls, crawler): # 生成pipeline实例的方法
 7          pipeline = cls()
 8          crawler.signals.connect(pipeline.spider_opened, signals.spider_opened) # 将spider_opened连接到信号上,当spider打开时执行spider_opened方法
 9          crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
10          return pipeline
11     def spider_opened(self, spider): #
12         file = open('%s_ip.json' % spider.name, 'w+b') # 生成文件描述符
13         self.files[spider] = file # 保存描述符的引用
14         self.exporter = JsonLinesItemExporter(file) # 实例化一个Exporter类
15         self.exporter.start_exporting() # 开始输出
16  
17     def spider_closed(self,spider):
18         self.exporter.finish_exporting() # 结束输出
19         #print('*'*50)
20         file = self.files.pop(spider)
21         #print(file.name)
22         file.close()
23         
24     def process_item(self, item, spider):
25         self.exporter.export_item(item) # 正式输出
26         return item

 

 

那么怎样输出到mysql数据库中呢?

  实际上scrapy自带的FeedExporter中并没有输出到关系型数据库的输出器,因此只能在pipelines中自己定义函数进行处理。由于scrapy是基于twisted异步框架开发的,使用传统的MySQLdb等mysql连接库会出现阻塞。为此,twisted提供了异步数据库实现方法,也就是使用连接池的方式进行交互。

from twisted.enterprise import adbapi
self.dbpool  = adbapi.ConnectPool(xxxx) # 生成连接池对象
yield self.dbpool.runInteraction(interaction_function, arg) # 返回异步处理数据库交互的方法

具体使用:

假设已经在配置文件settings.py中设定了

1 MYSQL_PIPELINE_URI = 'mysql://root:root@localhost/proxyip' #MySQL的uri

pipelines.py文件中的设置:

 1 class MySQLPipeline(object):
 2 
 3     def __init__(self, mysql_url):
 4         '''创建连接池'''
 5         # 储存以便将来引用
 6         self.mysql_url = mysql_url
 7         # 报告连接错误
 8         self.report_connection_error = True
 9         # 解析mysql的uri,并初始化dbpool
10         conn_kwargs = MySQLPipeline.parse_mysql_url(mysql_url)
11         self.dbpool = adbapi.ConnectionPool('MySQLdb',
12                                             charset='utf8',
13                                             use_unicode=True,
14                                             connect_timeout=5,
15                                             **conn_kwargs)
16     
17     @classmethod
18     def from_crawler(cls, crawler):
19         '''检索crawler,获取settings'''
20         # Get url from settings
21         mysql_url = crawler.settings.get('MYSQL_PIPELINE_URI', None)
22         # 如果没有配置uri,触发错误
23         if not mysql_url:
24             raise NotConfigured
25         # 生成MySQLPipeline实例
26         return cls(mysql_url)
27     
28     def close_spider(self, spider):
29         '''spider关闭时关闭连接池'''
30         self.dbpool.close()
31     @defer.inlineCallbacks
32     def process_item(self, item, spider):
33         '''处理item,将其传入mysql数据库'''
34         logger = spider.logger
35         try:
36             yield self.dbpool.runInteraction(MySQLPipeline._do_replace, item)
37         except MySQLdb.OperationalError:
38             if self.report_connection_error:
39                 print('Can not connect to MySQL:%s'%self.mysql_url)
40                 self.report_connection_error = False
41         
42         else:
43             print(traceback.format_exc())
44         # 返回item给下一阶段
45         defer.returnValue(item)
46         
47     @staticmethod
48     def _do_replace(tx, item):
49         '''实现具体的替换操作'''
50         sql = '''INSERT INTO ips(ip, port, protocol, speed, auth_time, is_transparent) VALUES(%s, %s, %s, %s, %s, %s)'''
51         args = (
52             item['ip'],
53             item['port'],
54             item['protocol'],
55             item['speed'],
56             item['auth_time'],
57             item['is_transparent'],
58             )
59         tx.execute(sql, args)
60         
61         
62     @staticmethod
63     def parse_mysql_url(mysql_url):
64         '''通过url获取数据库连接的参数,提供给adbapi的连接池'''
65         
66         params = dj_database_url.parse(mysql_url)
67         conn_kwargs = {}
68         conn_kwargs['host'] = params['HOST']
69         conn_kwargs['user'] = params['USER']
70         conn_kwargs['passwd'] = params['PASSWORD']
71         conn_kwargs['db'] = params['NAME']
72         conn_kwargs['port'] = params['PORT']
73         # 删除空值
74         conn_kwargs = dict((k,v) for k,v in conn_kwargs.iteritems() if v)
75         
76         return conn_kwargs

 

 

转载于:https://www.cnblogs.com/zhangjpn/p/6838384.html

Scrapy爬虫框架 Feed exports 数据文件输出 在本教程中我们详细探讨了 Scrapy 2.6 版本中 Feed exports 数据文件输出的各个关键环节。通过这些内容,你已经了解了如何灵活地选择和配置不同的序列化格式、存储方式,以及如何通过数据过滤和提交处理来确保数据的质量和可用性。掌握这些技能后,你将能够根据具体的项目需求,自如地调整和优化数据输出流程,确保数据的完整性、准确性和实用性。无论是简单的本地存储,还是复杂的云端解决方案,Scrapy 都为你提供了足够的工具和灵活性,让你在数据抓取项目中游刃有余。 阅读详情

相关推荐

Scrapy框架 Feed exports 数据文件输出应用案例

在网络数据采集领域,Scrapy 是一个非常流行和强大的爬虫框架。无论是抓取网页数据,还是将数据以各种格式保存,Scrapy 都提供了强大的支持。在抓取完数据后,如何高效地将数据导出为所需的格式(如 JSON、CSV、XML 等)是每个开发者都需要掌握的重要技能之一。Scrapy 的 Feed Exports 功能为此提供了简单且灵活的解决方案。

Mr数据杨 416

Scrapy框架之Feed exports输出路径及文件格式配置:

项目名scrapy_first/settings.py配置 文件导出的路径当前目录下的export_data文件下 FEED_URI = "export_data/%(name)s_%(time)s.json" 输出文件的格式类型(JSON、CSV、XML) FEED_FORMAT = "json" 输出文本编码格式(json默认格式不是utf-8) FEED_EXPORT_ENCODI...

weixin_43343144的博客 1355

实验四 基于IDEA+SpringBoot+Maven+Thymeleaf的系统实现实验目的

通过这次实验,我学习了如何成功进行IDEA+SpringBoot+maven的系统实现,搭建好IDEA+SpringBoot+maven的系统环境,成功地安装并配置了maven的运行环境,学会了创建springboot的三种方式,并且能将之前的实验结合起来运用。pom.xml中引入thymeleaf依赖,在classpath:/templates/下新建HTML页面(可采用实验一创建的页面),新建controller进行测试,访问页面后返回success成功数据。同时掌握和thymeleaf的基本语法。

m0_73502929的博客 1379

Scrapy学习过程之四:Feed Export

参考:https://docs.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports 整体架构图: SPIDER提取出的数据是dict,从上图可以看出,会将这些数据发送给ENGINE,然后ENGINE再将数据交给ITEM PIPELINES。 Serialization formats Scrapy提供了几种...

山不转的博客 1181

基于OpenAI Agents构建多智能体工作流:从原理到实战

多智能体系统(Multi-Agent System)是人工智能领域的重要分支,它通过多个智能体(Agent)的协作与交互,解决单一智能体难以处理的复杂任务。其核心原理在于将任务分解、分配与协调,每个智能体具备特定能力,通过通信机制实现信息共享与决策协同。在工程实践中,多智能体框架的价值在于提升任务处理效率、增强系统鲁棒性,并支持模块化开发。典型的应用场景包括自动化工作流编排、复杂问题求解以及人机协同交互。本文以OpenAI Agents SDK为例,深入探讨如何利用其提供的智能体(Agent)、会话(Ses

weixin_28725959的博客 603

从零到一:RagFlow源码架构深度解析与二次开发实战指南

本文深入解析RagFlow源码架构,提供从环境搭建到二次开发的全流程实战指南。作为企业级AI搜索框架,RagFlow通过模块化设计和多模态处理能力,支持自定义智能体开发与文搜文档功能,帮助开发者高效构建智能搜索系统。

w1x2y3的博客 267

scrapy基础知识

scrapy基础scrapy的工程建立pipelines 的使用 scrapy的工程建立 win10 cmd 相应命令行: cd c:/jj 到c盘jj文件 清除cmd的所有文字 cls 1.创建一个scarpy的项目: scarpy startproject name —name 是工程名字 2.生成一个爬虫 在文件里面有sprider文件建立一个爬虫 scarpy genspider name “xxxxx” -----name 是文件名字, xxx是限制 3.完善爬虫 4.运行爬虫 在建立工

淼淼不暴躁! 952

攻防世界-Reverse-Game

攻防世界,game,逆向

wuh2333的博客 775

Scrapy1.5基本概念(八)——Feed exports

本文为译文,原文见地址:https://docs.scrapy.org/en/latest/topics/feed-exports.html Feed exports 于版本0.10中新增。 在实现Scrapy时,最常用特性之一是能够正确地存储爬取到的数据,这通常意味着生成一个“导出文件”,其中包含了爬取到的数据(通常被称为“到处提要(export feed)”),以供其他系统使用。 Scra...

ReganDu的博客 768

Unity零基础到入门 ☀️| 轻松学会 Unity界面布局和简单实例——入门级!(^_−)☆

入门级Unity知识,一起加油呀!

努力前行,总会成为自己心中的那道光 1万+

js逆向实战:爬取淘宝男装商品

本文介绍了一个淘宝商品数据爬取程序的技术实现方案。该程序通过分析淘宝H5页面接口,实现了商品名称、价格、销量等关键信息的抓取,并支持图片下载功能。核心内容包括:1. 使用Request库发送HTTP请求获取数据;2. 通过逆向分析淘宝的签名算法(MD5加密)生成合法请求;3. 解析JSON数据并提取商品信息;4. 处理分页参数实现多页数据爬取;5. 将数据保存为CSV文件并下载商品图片。程序还实现了反爬虫绕过、错误处理、文件管理等辅助功能,完整展示了从数据采集到存储的全过程。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1573

第七章 使用Exporter导出数据

使用Exporter导出数据 在Scrapy中,负责导出数据的组件被称为Exporter,Scrapy内部实现了多个Exporter,每个Exporter实现一种数据格式的导出,支持的格式如下: JSON(JsonItemExporter) JSON lines(JsonLinesItemExporter) CSV(CsvItemExporter) XML(XmlItemExporter)

白菜猪肉炖粉条 1625

14、方法论 - 自顶向下与自底向上的结合

本文探讨了如何将自顶向下的规范驱动方法与自底向上的组件构建方法相结合,以形成更加全面的编程理论。通过引入代数法则,简化逻辑关系、提高代码可读性并支持形式化验证,结合实际案例(如智能家居控制系统)展示了如何在设计和实现阶段确保系统的正确性和可靠性。文章还讨论了工具支持的重要性,并提出了未来发展的方向。

lstm7chronicler的博客 173

爬虫教程( 2 ) --- scrapy 教程、可视化管理工具、反爬框架、ai 爬虫

scrapy 教程、可视化管理工具、反爬框架、ai 爬虫

freeking101的博客 5255

2025目标检测新方向:弱监督目标检测的最新论文研究与应用

2025目标检测新方向:弱监督目标检测的最新论文研究与应用 ,人工智能,计算机视觉,大模型,AI,本文聚焦2025年弱监督目标检测新方向,阐述其基础概念,包括弱监督学习定义、标注形式及面临的定位不准等挑战。介绍最新论文研究的多种算法,如基于点标注的算法等,还涉及相关模型、应用领域,以及评价指标、数据集、实现工具框架,分析未来趋势与补充挑战及解决方案,为该领域研究提供全面参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Scrapy+Playwright实战:高效爬取Kelly Blue Book二手车数据

网络爬虫是自动化获取互联网公开数据的关键技术,其核心原理是模拟浏览器行为向目标服务器发送请求并解析响应。在Python生态中,Scrapy框架因其异步架构、清晰的管道设计和强大的中间件扩展能力,成为构建健壮、可维护爬虫的首选。对于现代大量依赖JavaScript动态渲染内容的网站,传统HTTP请求难以获取完整数据,此时需要引入无头浏览器技术。Playwright作为新一代浏览器自动化工具,能精准模拟用户交互,完美解决动态内容加载问题。将Scrapy的调度管理优势与Playwright的渲染能力结合,形成了当

weixin_30607659的博客 357

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Python网络爬虫权威指南:从环境搭建到Scrapy框架实战

网络爬虫作为数据获取的核心技术,其工作原理基于HTTP/HTTPS协议,通过模拟客户端请求与服务器进行通信,实现网页数据的自动化采集。这项技术的核心价值在于能够高效、结构化地获取互联网公开信息,为数据分析、市场研究、内容聚合等应用场景提供数据基础。在工程实践中,开发者需要掌握请求库、解析库和爬虫框架的使用,并应对反爬机制等挑战。本文以《Python网络爬虫权威指南(第2版)》为蓝本,系统梳理了从环境搭建、基础库使用到Scrapy框架的完整学习路径,特别针对requests库和BeautifulSoup库的实

weixin_30388677的博客 342

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

网络爬虫技术全解析:从原理分类到Python实战应用

网络爬虫作为自动化数据采集的核心技术,其工作原理基于HTTP协议模拟浏览器行为,实现对网页内容的抓取与解析。这项技术的核心价值在于将非结构化的网络信息转化为可分析的结构化数据,广泛应用于搜索引擎索引构建、市场行情监控、学术研究数据收集等场景。在工程实践中,开发者需要掌握聚焦爬虫与增量式爬虫等不同类型爬虫的实现策略,并熟练运用XPath解析与反爬对抗技术来构建稳定高效的数据采集系统。本文以Python技术栈为例,深入探讨了爬虫的分类体系与Scrapy框架的实战应用,为数据获取任务提供了系统的解决方案。

cuibinmo3519的博客 421

scrapling 官网教程

选择使用方法查找元素访问元素的数据Navigation 导航抓取网站内容HTTP 请求动态加载的网站动态加载,并且有防护的网站。

freeking101的博客 1112

JsonItemExporter和JsonLinesItemExporter保存数据

JsonItemExporter方式保存数据 1 # -*- coding: utf-8 -*- 2 from scrapy.exporters import JsonItemExporter 3 4 5 class DemoPipeline(object): 6 def __init__(self): 7 self.fp = open(...

weixin_34100227的博客 545

Scrapy——Item Exporters

什么是Item Exporters? 当你抓取了你想要的数据,你就会想要将他们持久化或导出它们,并应用在其他程序。这是整个抓取过程的目的。为此,Scrapy 提供了Item Exporters来创建不同的输出格式。 如何工作? 为了使用Item Exporter,你必须对Item Exporter及其参数实例化。每个Item Exporter需要考虑不同的参数。在实例化exporter之后,你必须...

mashaokang1314的博客 957

Scrapy pipelines中的JsonItemExporter和JsonLinesItemExporter的区别(1ni)

先导入 from scrapy.exporters import JsonItemExporter, JsonLinesItemExporter 大致概括下: (要用二进制的方式来写) 首先我们从名字里大致可以看出来了,两者区别 Lines 也就是行的意思 也就是说 前者是一起写进json文件里,后者是我们每次parse函数yield的item,经过处理就直接写入json里面, 那么...

1ni 2676

使用Scrapy构建高效网络爬虫:从入门到数据导出全流程

编辑items.pyurl = Field() # 书籍链接title = Field() # 书名price = Field() # 价格Items定义:结构化存储数据字段Spider逻辑:精准提取目标信息:灵活配置输出格式与路径增加异常处理(如重试机制)对接数据库(MySQL/MongoDB)部署至ScrapingHub云平台立即动手尝试,开启您的数据采集之旅!

neweastsun的专栏 1847

Scrapy爬虫入门教程十 Feed exports(导出文件)

Scrapy爬虫入门教程十 Feed exports(导出文件)

inke的博客 9564

Scrapy: Feed exports

啥也没看懂欸,,,

AI路漫漫 731

Scrapy设置之Feeds

Scrapy提供了Feed Exports来保存抓取到的Item,Feed Exports有几种序列化格式和几种存储方式。存储方式:本地文件系统、FTP、S3、标准输出。由FEED_URI选项指定。FEED_URI里面可以有命令参数,例如,ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json其中,time由

4308
上一篇: Scrapy笔记:使用代理ip
下一篇: 常用资源网站链接
dinght2000
博客等级 码龄11年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值