Scrapy框架由多个互相协作的组件构成。本节将详细介绍其中的几个主要组件:Item, Spider, Pipeline。

1. Item

在Scrapy中,爬取的数据被封装在Item对象中。你可以将Item视为一个简单的Python字典。Item用于定义爬取数据的数据结构。

例如,如果你想爬取一个博客网站,你可能需要保存每篇博客的标题,发布日期和内容。你可以定义一个BlogPostItem如下:

import scrapy

class BlogPostItem(scrapy.Item):
    title = scrapy.Field()
    date = scrapy.Field()
    content = scrapy.Field()

然后,在你的Spider中,你可以创建一个新的BlogPostItem,并设置其字段:

def parse(self, response):
    item = BlogPostItem()
    item['title'] = response.css('h1::text').get()
    item['date'] = response.css('.date::text').get()
    item['content'] = response.css('.content::text').get()
    return item

2. Spider

Spider是定义如何爬取网站(即如何进行页面请求,如何解析响应)的地方。每个Spider必须定义一个唯一的名字,定义爬取的行为,以及如何从网页内容中抽取Item。

import scrapy
from myproject.items import BlogPostItem

class BlogSpider(scrapy.Spider):
    name = "blog"
    start_urls = [
        'http://myblog.com',
    ]

    def parse(self, response):
        for post in response.css('.post'):
            item = BlogPostItem()
            item['title'] = post.css('h1::text').get()
            item['date'] = post.css('.date::text').get()
            item['content'] = post.css('.content::text').get()
            yield item

3. Pipeline

Item Pipeline负责处理被Spider抽取出来的Item。常见的处理数据的方法包括清洗HTML数据,验证爬取的数据(检查Item包含某些字段),查重(并丢弃)以及存储到数据库。

以下是一个简单的Pipeline示例,将所有爬取到的Items存入一个JSON文件:

import json

class JsonWriterPipeline(object):

    def open_spider(self, spider):
        self.file = open('items.jl', 'w')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item

要启用Item Pipeline,你必须将其添加到你项目的ITEM_PIPELINES配置中,如:

ITEM_PIPELINES = {'myproject.pipelines.JsonWriterPipeline': 1}

其中,字典的键是类的路径,值是数字,数字定义了运行的顺序:项目中的Item Pipeline将按照这个顺序运行,数字小的优先。

以上是Scrapy的主要组件:Item,Spider以及Pipeline的简介。希望这些信息能帮助你更好地理解Scrapy框架的工作原理,以便你可以更有效地使用它来完成你的爬虫项目。
推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

file


移动安全星球
1 声望2 粉丝