如何将 Scrapy 项目转换为 JSON?

pythonjsonprogramming

Web 抓取是从网站提取数据的过程。它涉及解析 HTML 或 XML 代码并从中提取相关信息。Scrapy 是一种流行的基于 Python 的 Web 抓取框架,可让您轻松构建 Web 抓取程序以从网站中提取结构化数据。Scrapy 提供了一个强大而高效的框架来构建可以从网站提取数据并以各种格式存储的 Web 爬虫。

Scrapy 的主要功能之一是它能够使用自定义 Item 类解析和存储数据。这些 Item 类定义了将从网站中提取的数据的结构。每个项目类都包含一组与将要提取的数据相对应的字段。提取数据后,将其填充到 Item 类的实例中。

提取数据并填充 Item 实例后,您可能需要将数据导出为各种格式以进行进一步分析或存储。 JSON 是一种流行的数据格式,既易于阅读,又易于编程。它是一种轻量级的基于文本的格式,广泛用于 Web 上的数据交换。大多数编程语言都支持 JSON,并且广泛用于 Web 应用程序和 API。

将 Scrapy Item 实例转换为 JSON 格式是构建 Web 抓取工具时的常见要求。Scrapy 提供了将 Item 实例转换为 JSON 格式的内置方法,但也有外部库可用,它们提供了在 Python 中处理 JSON 数据的附加功能。在本文中,我们将探讨如何使用内置 Scrapy 方法和外部库将 Scrapy Item 实例转换为 JSON 格式。我们还将讨论在 Python 中使用 JSON 数据时应避免的一些最佳实践和常见陷阱。

我们可以使用不同的方法将 scrapy 项目转换为 JSON。

方法 1:使用 Scrapy 的内置 JSON 导出器

Scrapy 提供了一个内置的 JSON 导出器,可用于将 Scrapy Item 实例转换为 JSON 格式。您可以使用 scrapy.exporters.JsonItemExporter 类将您的项目导出到 JSON 文件。

请考虑下面显示的代码。

示例

import scrapy
from scrapy.exporters import JsonItemExporter

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com']

    def parse(self, response):
        item = {
            'title': response.css('title::text').get(),
            'description': response.css('meta[name="description"]::attr(content)').get()
        }
        yield item

    def closed(self, reason):
        items = list(self.crawler.stats.get_value('item_scraped_count').values())[0]
        filename = 'data.json'
        with open(filename, 'wb') as file:
            exporter = JsonItemExporter(file)
            exporter.start_exporting()
            for item in self.crawler.stats.get_value('items'):
                exporter.export_item(item)
            exporter.finish_exporting()
        self.log(f'Saved file {filename}, containing {items} items')

解释

  • 我们导入必要的模块:scrapy 用于构建蜘蛛,JsonItemExporter 用于将项目导出为 JSON。

  • 我们定义一个名为 MySpider 的新蜘蛛,它使用 CSS 选择器从网站中提取标题和描述,并将它们存储在名为 item 的字典中。

  • 我们将 item 字典提供给 Scrapy,Scrapy 会自动将其填充到 scrapy.Item 类的实例中。

  • 一旦蜘蛛完成对网站的抓取,就会调用 closed 方法。在此方法中,我们检索蜘蛛抓取的项目,并使用 JsonItemExporter 将它们保存到 JSON 文件中。

  • 当您运行蜘蛛时,它将从网站中提取标题和描述,并将结果保存到名为 data.json 的 JSON 文件中。

输出

[{  "title": "Example Domain",   "description": "Example Domain. This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission."}]

方法 2:在内置 JSON 中使用 Python

示例

import scrapy
import json

class MySpider(scrapy.Spider):
	name = 'myspider'
	start_urls = ['http://www.example.com']

	def parse(self, response):
    	item = {
        	'title': response.css('title::text').get(),
        	'description': response.css('meta[name="description"]::attr(content)').get()
    	}
    	yield item

	def closed(self, reason):
    	items = list(self.crawler.stats.get_value('item_scraped_count').values())[0]
    	filename = 'data.json'
    	with open(filename, 'w') as file:
        	json.dump(self.crawler.stats.get_value('items'), file, indent=4)
    	self.log(f'Saved file {filename}, containing {items} items')

输出

[{  "title": "Example Domain",   "description": "Example Domain. This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission."}]

结论

总之,Scrapy 是一个强大的网页爬取和抓取框架,可让您以结构化的方式从网站提取数据。

在本文中,我们探讨了两种将 Scrapy Item 实例转换为 JSON 的不同方法。第一种方法涉及使用 Scrapy 提供的 JsonItemExporter 类。


相关文章