📅  最后修改于: 2023-12-03 15:05:06.075000             🧑  作者: Mango
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类来表示所需的信息,并使用管道来处理它们,使得整个爬虫的流程更加清晰明了。