Scrapy学习过程之四:Feed Export

本文介绍了Scrapy的数据导出流程,包括Serialization formats如JSON、CSV等,Storages如Local Filesystem、FTP、S3,并详细讲解了FEED_URI、FEED_FORMAT等设置参数,以及如何自定义存储后端和序列化方式。

参考:https://docs.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports

整体架构图:

Scrapy architecture

SPIDER提取出的数据是dict,从上图可以看出,会将这些数据发送给ENGINE,然后ENGINE再将数据交给ITEM PIPELINES。

Serialization formats

Scrapy提供了几种内置的方法,能将dict转换成常见的数据格式,开箱即用。

  • JSON
  • JSON Line
  • CSV
  • XML

以上是Scrapy内置的序列化dict的方法,开发者也可以通过设置FEED_EXPORTERS进行自定义扩展,稍后展开,这个东西就是设置一个开发者自己实现的一个EXPORTER。

Storages

格式转换有了,接下来就是把转换好的数据存放在什么地方的问题。Scrapy通过设置一个URI指定,参数是FEED_URL,稍后展开。

Scrapy支持的内置存储后端类型:

  • Local Filesystem
  • FTP
  • S3
  • Standard Output

有些存储后端需要另外安装依赖包,如S3需要安装botocore与boto。

Storage URI parameters

设置存储后端的URI可以包含可替换点位符,当真正写数

PS D:\Experience\Myproject> scrapy crawl demo 2025-08-15 17:50:58 [scrapy.utils.log] INFO: Scrapy 2.13.3 started (bot: Myproject) 2025-08-15 17:50:58 [scrapy.utils.log] INFO: Versions: {'lxml': '6.0.0', 'libxml2': '2.11.9', 'cssselect': '1.3.0', 'parsel': '1.10.0', 'w3lib': '2.3.1', 'Twisted': '25.5.0', 'Python': '3.11.7 (tags/v3.11.7:fa7a6f2, Dec 4 2023, 19:24:49) [MSC v.1937 ' '64 bit (AMD64)]', 'pyOpenSSL': '25.1.0 (OpenSSL 3.5.1 1 Jul 2025)', 'cryptography': '45.0.5', 'Platform': 'Windows-10-10.0.26100-SP0'} 2025-08-15 17:50:58 [scrapy.addons] INFO: Enabled addons: [] 2025-08-15 17:50:58 [asyncio] DEBUG: Using selector: SelectSelector 2025-08-15 17:50:58 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor 2025-08-15 17:50:58 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.windows_events._WindowsSelectorEventLoop 2025-08-15 17:50:58 [scrapy.extensions.telnet] INFO: Telnet Password: 03f3c389c88275d3 2025-08-15 17:50:58 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats'] 2025-08-15 17:50:58 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'Myproject', 'CONCURRENT_REQUESTS_PER_DOMAIN': 1, 'DOWNLOAD_DELAY': 1, 'FEED_EXPORT_ENCODING': 'utf-8', 'NEWSPIDER_MODULE': 'Myproject.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['Myproject.spiders']} 2025-08-15 17:50:58 [asyncio] DEBUG: Using proactor: IocpProactor 2025-08-15 17:50:58 [scrapy-playwright] INFO: Started loop on separate thread: <ProactorEventLoop running=True closed=False debug=False> 2025-08-15 17:50:59 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.offsite.OffsiteMiddleware', 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'Myproject.middlewares.MyprojectDownloaderMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2025-08-15 17:50:59 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.start.StartSpiderMiddleware', 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2025-08-15 17:50:59 [scrapy.middleware] INFO: Enabled item pipelines: [] 2025-08-15 17:52:18 [scrapy.core.engine] INFO: Spider opened 2025-08-15 17:52:18 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2025-08-15 17:52:18 [demo] INFO: Spider opened: demo 2025-08-15 17:52:18 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023 2025-08-15 17:52:18 [scrapy-playwright] INFO: Starting download handler 2025-08-15 17:52:18 [scrapy-playwright] INFO: Starting download handler 2025-08-15 17:52:59 [scrapy.crawler] INFO: Received SIGINT, shutting down gracefully. Send again to force 2025-08-15 17:52:59 [scrapy.core.engine] INFO: Closing spider (shutdown) 2025-08-15 17:52:59 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None) 2025-08-15 17:53:00 [scrapy-playwright] INFO: Launching browser chromium 2025-08-15 17:53:00 [scrapy-playwright] INFO: Browser chromium launched 2025-08-15 17:53:00 [scrapy-playwright] DEBUG: Browser context started: 'default' (persistent=False, remote=False) 2025-08-15 17:53:00 [scrapy-playwright] DEBUG: [Context=default] New page created, page count is 1 (1 for all contexts) 2025-08-15 17:53:00 [scrapy-playwright] DEBUG: [Context=default] Request: <GET http://quotes.toscrape.com/> (resource type: document) 2025-08-15 17:53:03 [scrapy-playwright] DEBUG: [Context=default] Response: <200 http://quotes.toscrape.com/> 2025-08-15 17:53:03 [scrapy-playwright] DEBUG: [Context=default] Request: <GET http://quotes.toscrape.com/static/bootstrap.min.css> (resource type: stylesheet, referrer: http://quotes.toscrape.com/) 2025-08-15 17:53:03 [scrapy-playwright] DEBUG: [Context=default] Request: <GET http://quotes.toscrape.com/static/main.css> (resource type: stylesheet, referrer: http://quotes.toscrape.com/) 2025-08-15 17:53:04 [scrapy-playwright] DEBUG: [Context=default] Response: <200 http://quotes.toscrape.com/static/main.css> 2025-08-15 17:53:04 [scrapy-playwright] DEBUG: [Context=default] Response: <200 http://quotes.toscrape.com/static/bootstrap.min.css> 2025-08-15 17:53:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com> (referer: None) ['playwright'] 2025-08-15 17:53:04 [demo] INFO: Parsing page: http://quotes.toscrape.com/ 2025-08-15 17:53:04 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 450, 'downloader/request_count': 2, 'downloader/request_method_count/GET': 2, 'downloader/response_bytes': 11489, 'downloader/response_count': 2, 'downloader/response_status_count/200': 1, 'downloader/response_status_count/404': 1, 'elapsed_time_seconds': 45.949575, 'finish_reason': 'shutdown', 'finish_time': datetime.datetime(2025, 8, 15, 9, 53, 4, 931829, tzinfo=datetime.timezone.utc), 'items_per_minute': 0.0, 'log_count/DEBUG': 14, 'log_count/INFO': 18, 'playwright/browser_count': 1, 'playwright/context_count': 1, 'playwright/context_count/max_concurrent': 1, 'playwright/context_count/persistent/False': 1, 'playwright/context_count/remote/False': 1, 'playwright/page_count': 1, 'playwright/page_count/max_concurrent': 1, 'playwright/request_count': 3, 'playwright/request_count/method/GET': 3, 'playwright/request_count/navigation': 1, 'playwright/request_count/resource_type/document': 1, 'playwright/request_count/resource_type/stylesheet': 2, 'playwright/response_count': 3, 'playwright/response_count/method/GET': 3, 'playwright/response_count/resource_type/document': 1, 'playwright/response_count/resource_type/stylesheet': 2, 'response_received_count': 2, 'responses_per_minute': 2.6666666666666665, 'robotstxt/request_count': 1, 'robotstxt/response_count': 1, 'robotstxt/response_status_count/404': 1, 'scheduler/dequeued': 1, 'scheduler/dequeued/memory': 1, 'scheduler/enqueued': 1, 'scheduler/enqueued/memory': 1, 'start_time': datetime.datetime(2025, 8, 15, 9, 52, 18, 982254, tzinfo=datetime.timezone.utc)} 2025-08-15 17:53:04 [scrapy.core.engine] INFO: Spider closed (shutdown) 2025-08-15 17:53:04 [scrapy-playwright] INFO: Closing download handler 2025-08-15 17:53:04 [scrapy-playwright] DEBUG: Browser context closed: 'default' (persistent=False, remote=False) 2025-08-15 17:53:04 [scrapy-playwright] INFO: Closing browser 2025-08-15 17:53:04 [scrapy-playwright] DEBUG: Browser disconnected 2025-08-15 17:53:05 [scrapy-playwright] INFO: Closing download handler PS D:\Experience\Myproject>
最新发布
08-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值