📜  如何将 Scrapy 项目转换为 JSON?

📅  最后修改于: 2022-05-13 01:55:39.869000             🧑  作者: Mango

如何将 Scrapy 项目转换为 JSON?

先决条件:

  • 刮的
  • JSON

Scrapy是一个网页抓取工具,用于收集网页数据,也可以用来修改和存储我们想要的任何形式的数据。每当数据被scrapy蜘蛛抓取时,我们都会将该原始数据转换为scarpy项,然后我们将该项传递给管道进行进一步处理。在管道中,这些项目将被转换为 JSON 数据,我们可以将其打印或保存在另一个文件中。因此,我们可以从网络抓取的数据中检索 JSON 数据。

初始化目录和设置项目

让我们首先创建一个scrapy项目。为此,请确保系统中安装了Python和 PIP。然后一一运行下面给出的命令来创建一个类似于我们将在本文中使用的项目的scrapy项目。

  • 让我们首先在名为 GFGScrapy 的文件夹中创建一个虚拟环境,并在那里激活该虚拟环境。
# To create a folder named GFGScrapy
mkdir GFGScrapy
cd GFGScrapy

# making virtual env there
virtualenv
cd scripts  

# activating it
activate
cd..

因此,在运行所有这些命令后,我们将得到如下所示的输出:



  • 现在是时候创建一个scrapy项目了。为此确保系统中是否安装了scrapy。如果未安装,请使用下面给定的命令安装它。

句法:

pip install scrapy

现在要创建一个scrapy项目,使用下面给定的命令并创建一个蜘蛛。

使用 pip 安装程序创建了一个 scrapy 项目后,项目目录的输出看起来就像图像中给出的那样。 (如果你想了解更多关于一个scrapy项目并熟悉它,请参考这个)。



目录结构由以下路径组成(示例)

C:///

在上图中,项目名称scrapytutorial ,里面有很多文件,如图所示。

我们感兴趣的文件是spider_to_crawl.py文件(我们用来描述蜘蛛的方法)和pipelines.py文件,我们将在其中描述将处理我们将使用抓取的数据完成的进一步数据处理的组件.简单来说,这个文件用来描述进一步操作数据的方法。第三个最重要的文件是settings.py文件,我们将在其中有序注册我们的组件(在管道中创建,.py 文件)。下一个最重要的文件是items.py文件。该文件用于描述数据从spider_to_crawl流向pipelines.py文件的表单或字典结构。在这里,我们将提供一些将出现在每个项目中的键。

让我们看看蜘蛛文件夹中的spider_to_crawl.py文件。这是我们编写蜘蛛必须抓取的 URL 的文件,也是一个名为 parse() 的方法,用于描述应该对蜘蛛抓取的数据做什么。

这个文件是由上面使用的“ scrapy genspider ”命令自动生成的。该文件以蜘蛛的名字命名。下面给出的是生成的默认文件。

图片

请注意,我们对上述默认文件进行了一些更改,即注释掉了 allowed_domains 行,并且我们还对 str_urls 进行了一些更改(删除了“ http:// ”)。

将scrapy转换为JSON

管道是我们可以转换、修改或存储抓取数据项的方法。因此,让我们首先谈谈它的一些组件。

默认 Pipelines.py 文件的外观如下所示:



为了对项目执行不同的操作,我们必须声明一个单独的组件(文件中的类),它由各种方法组成,用于执行操作。默认的管道文件有一个以项目名称命名的类。我们还可以创建自己的类来编写它们必须执行的操作。

pipelines.py 文件的每个组件都由一个名为process_item() 的默认方法组成

句法:

该方法接收三个变量,一个是对自身对象的引用,一个是蜘蛛发送的抓取数据项,第三个是蜘蛛本身。此方法用于修改或存储蜘蛛抓取的数据项。只能在这个方法中提到如何修改接收到的物品包的方式。

这是始终在 pipelines.py 文件类中调用的默认方法。

除此之外,我们还可以创建自己的方法,用于修改或对数据项进行其他更改。因此,由于我们必须将抓取的数据转换为 JSON 格式,因此我们需要有一个组件(类)来完成我们各自的工作。但在此之前,我们必须执行两件主要的事情。

1)首先,我们必须在我们的settings.py文件中注册管道组件的名称。语法如下。

句法:

这里的优先级编号是scrapy调用组件的顺序。

因此,对于上述项目,将应用以下给定的格式。

2)我们必须执行的另一件事是声明我们必须用来将数据传递到管道的项目的格式。为此,我们将使用我们的items.py文件。

下面给出的代码在我们的items.py文件中创建了一个带有一个名为“ Quote”的关键变量的项目。然后我们必须在我们的spider_to_crawl.py文件中导入这个文件(如示例所示)。

Python3
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
  
import scrapy
  
  
class ScrapytutorialItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    Quote = scrapy.Field()  # only one field that it of Quote.


Python3
from itemadapter import ItemAdapter
import json  # Json package of python module.
  
  
class ScrapytutorialPipeline:
    def process_item(self, item, spider):  # default method
        # calling dumps to create json data.
        line = json.dumps(dict(item)) + "\n"
        # converting item to dict above, since dumps only intakes dict.
        self.file.write(line)                    # writing content in output file.
        return item
  
    def open_spider(self, spider):
        self.file = open('result.json', 'w')
  
    def close_spider(self, spider):
        self.file.close()


Python3
import scrapy
from ..items import ScrapytutorialItem    
  
class SpiderToCrawlSpider(scrapy.Spider):
    name = 'spider_to_crawl'
  
    start_urls = ['https://quotes.toscrape.com/']
  
    def parse(self, response):
          
        # creating items dictionary
        items = ScrapytutorialItem()    
        Quotes_all = response.xpath('//div/div/div/span[1]')
  
        # These paths are based on the selectors
          
        for quote in Quotes_all: #extracting data
            items['Quote'] = quote.css('::text').extract()
            yield items


上面的代码只创建了一个key的Item,我们可以创建多个key的item。

现在我们已经看到了如何在 pipelines.py 文件中实现组件以及如何完成设置和声明项目。现在我们准备好将抓取的数据项转换为 JSON 格式的示例。为了将数据转换为 JSON 格式,我们将使用Python的 JSON 库及其转储属性。这个想法是我们将在 pipelines.py 文件中获取抓取的数据,然后我们将打开一个文件并将所有 JSON 数据写入其中。所以方法命名为:

  • 当蜘蛛开始爬行时,将调用open_spider()打开文件( result.json )。
  • 当蜘蛛关闭并且抓取结束时,将调用close_spider()来关闭文件。
  • process_item()将始终被调用(因为它是默认值)并且主要负责将数据转换为 JSON 格式并将数据打印到文件中。我们将使用Python Web 框架的概念,即它们如何将后端检索到的数据转换为 JSON 和其他格式。

因此,我们的pipelines.py 中的代码如下所示:

蟒蛇3

from itemadapter import ItemAdapter
import json  # Json package of python module.
  
  
class ScrapytutorialPipeline:
    def process_item(self, item, spider):  # default method
        # calling dumps to create json data.
        line = json.dumps(dict(item)) + "\n"
        # converting item to dict above, since dumps only intakes dict.
        self.file.write(line)                    # writing content in output file.
        return item
  
    def open_spider(self, spider):
        self.file = open('result.json', 'w')
  
    def close_spider(self, spider):
        self.file.close()

我们的spider_to_crawl.py看起来像

蟒蛇3

import scrapy
from ..items import ScrapytutorialItem    
  
class SpiderToCrawlSpider(scrapy.Spider):
    name = 'spider_to_crawl'
  
    start_urls = ['https://quotes.toscrape.com/']
  
    def parse(self, response):
          
        # creating items dictionary
        items = ScrapytutorialItem()    
        Quotes_all = response.xpath('//div/div/div/span[1]')
  
        # These paths are based on the selectors
          
        for quote in Quotes_all: #extracting data
            items['Quote'] = quote.css('::text').extract()
            yield items

我们的settings.py文件看起来像:

我们的items.py文件看起来像



使用命令“ scrapy crawl spider_to_crawl ”后,将执行以下步骤。

  • 由于创建了 result.json 文件,蜘蛛被抓取。现在蜘蛛抓取网页并收集Quotes_all变量中的数据。然后从变量中提取每个数据,并将其传递给文件中声明的项目作为键的值,即Quote。最后在产量中我们调用 pipelines.py 文件进行进一步处理。
  • 我们在pipelines.py文件中从蜘蛛接收项目变量,然后使用转储方法将其转换为 JSON,然后将输出写入打开的文件中。
  • 文件已关闭,我们可以看到输出。

  • 已创建 JSON 文件

输出: