📜  Scrapy-物品(1)

📅  最后修改于: 2023-12-03 15:05:06.075000             🧑  作者: Mango

Scrapy-物品

Scrapy是一个用于数据抓取的Python框架,它不仅提供了底层的HTTP请求和HTML解析功能,同时也提供了强大的数据处理和管道功能,其中的物品(Item)是整个框架的核心之一。

物品是什么

物品是你的爬虫从网页中抓取信息的最终表示形式。抓取出的数据被收集到item容器中,被定义为Python字典(dict)的子类。

在Scrapy中,每个物品都在不同的Item类中进行定义,这样可以保证每个物品都详细地说明了哪些信息应该被提取。因此,一旦你定义了Item类,你就可以在你的爬虫代码中引用它。

物品如何使用

以下是一个简单的示例,展示如何定义和使用一个Item:

import scrapy

class QuoteItem(scrapy.Item):
    text = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()

在这个示例中,我们定义了一个QuoteItem类,并添加了三个属性:text,author和tags。这些属性都是由scrapy.Field()对象定义的,这些对象说明了我们要收集的信息类型。

在spider文件中,我们可以使用该类来抓取具有相应信息的HTML元素:

import scrapy
from myproject.items import QuoteItem

class MySpider(scrapy.Spider):
    name = 'testspider'

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        for quote in response.css('div.quote'):
            item = QuoteItem()
            item['text'] = quote.css('span.text::text').get()
            item['author'] = quote.css('span small::text').get()
            item['tags'] = quote.css('div.tags a.tag::text').getall()
            yield item

在这个示例中,我们导入了我们刚刚创建的QuoteItem类。在parse方法中,我们使用css()选择器找到我们关注的HTML元素,并将他们的文本信息存储在QuoteItem对象的属性中,然后使用yield关键字将填充了信息的物品传递给Scrapy引擎进行处理。

物品管道处理

物品管道是用于处理Scrapy物品流的组件。它们类似于Django的中间件,并用于对爬取到的物品进行处理,验证和持久化存储等操作。

以下是一个简单的示例,展示如何在Scrapy中使用管道:

import scrapy

class MyPipeline(object):

    def process_item(self, item, spider):
        # 处理item
        return item

在该示例中,我们创建一个名为MyPipeline的管道类,并定义了一个process_item()方法来处理每个传递给管道的物品。在这个例子中,我们可以在process_item()方法中进行一些操作,例如过滤重复的物品或将物品写入数据库。

将管道添加到Scrapy项目中的最方便方法就是在settings.py文件中定义ITEM_PIPELINES列表。如下所示:

ITEM_PIPELINES = {
    'myproject.pipelines.MyPipeline': 300,
}

这里我们将我们创建的管道类(myproject.pipelines.MyPipeline)添加到ITEM_PIPELINES中,其中数字300表示该管道的优先级。

总结

在Scrapy中,物品是抓取和处理网页信息的最终表示形式。在使用物品的同时,我们可以定义自己的Item类来表示所需的信息,并使用管道来处理它们,使得整个爬虫的流程更加清晰明了。