1.3 Scrapy 项目结构


文档摘要

1.3 Scrapy 项目结构 Scrapy 项目结构详解 Scrapy 是一个强大的 Python 爬虫框架,它提供了一套清晰的项目结构,使得开发者能够高效地组织和管理爬虫代码。理解 Scrapy 项目结构对于编写可维护、可扩展的爬虫至关重要。 Scrapy 项目结构概览 当我们使用 命令创建一个新的 Scrapy 项目时,Scrapy 会自动生成一个包含以下目录和文件的基本结构: 使用 Mermaid 绘制的项目结构图如下: 下面我们将逐一介绍这些文件和目录的作用。 核心文件详解 2.1 文件是 Scrapy 项目的部署配置文件。它定义了项目的配置信息,例如 Scrapy 服务的部署位置、使用的 Python 解释器等。通常情况下,我们不需要手动修改这个文件,除非需要进行高级的部署配置。

1.3 Scrapy 项目结构

Scrapy 项目结构详解

Scrapy 是一个强大的 Python 爬虫框架,它提供了一套清晰的项目结构,使得开发者能够高效地组织和管理爬虫代码。理解 Scrapy 项目结构对于编写可维护、可扩展的爬虫至关重要。

1. Scrapy 项目结构概览

当我们使用 scrapy startproject <project_name> 命令创建一个新的 Scrapy 项目时,Scrapy 会自动生成一个包含以下目录和文件的基本结构:

<project_name>/ scrapy.cfg # 部署配置文件 <project_name>/ __init__.py # 项目初始化文件 items.py # 定义数据结构 (Item) middlewares.py # 定义中间件 (Middleware) pipelines.py # 定义数据管道 (Pipeline) settings.py # 项目配置文件 spiders/ # 存放爬虫代码的目录 __init__.py # spiders 目录初始化文件 ... # 爬虫文件

使用 Mermaid 绘制的项目结构图如下:

下面我们将逐一介绍这些文件和目录的作用。

2. 核心文件详解

2.1 scrapy.cfg

scrapy.cfg 文件是 Scrapy 项目的部署配置文件。它定义了项目的配置信息,例如 Scrapy 服务的部署位置、使用的 Python 解释器等。通常情况下,我们不需要手动修改这个文件,除非需要进行高级的部署配置。

一个典型的 scrapy.cfg 文件内容如下:

[settings] default = myproject.settings [deploy] # url = http://localhost:6800/ project = myproject
  • [settings] 部分指定了项目使用的 settings 模块。

  • [deploy] 部分用于配置 Scrapy 服务的部署信息,例如 Scrapyd 服务的 URL 和项目名称。

2.2 items.py

items.py 文件用于定义爬取的数据结构,也就是 Item。Item 类似于 Python 的字典,但提供了额外的保护机制,例如防止未定义的字段被赋值。通过定义 Item,我们可以清晰地描述爬取的数据,并方便地在不同的组件之间传递数据。

代码实践:

假设我们要爬取书籍的信息,可以定义一个 BookItem

# items.py import scrapy class BookItem(scrapy.Item): title = scrapy.Field() author = scrapy.Field() price = scrapy.Field() description = scrapy.Field() # define the fields for your item here like: # name = scrapy.Field() pass

在这个例子中,BookItem 定义了四个字段:titleauthorpricedescription。每个字段都使用 scrapy.Field() 定义。

内容详解:

  • scrapy.Field() 实际上是一个元数据容器,可以用于存储关于字段的额外信息,例如类型、验证规则等。

  • 在 Spider 中,我们可以创建 BookItem 的实例,并为这些字段赋值,然后将 Item 传递给 Pipeline 进行处理。

2.3 middlewares.py

middlewares.py 文件用于定义 Spider 中间件(Spider Middleware)和下载器中间件(Downloader Middleware)。中间件是 Scrapy 的核心组件之一,它允许我们在请求被发送到网站之前和响应被传递给 Spider 之后,对请求和响应进行处理。

代码实践:

下面是一个简单的下载器中间件示例,用于添加 User-Agent 到请求头:

# middlewares.py class CustomUserAgentMiddleware: def process_request(self, request, spider): request.headers['User-Agent'] = 'My Custom User-Agent'

内容详解:

  • process_request(self, request, spider) 方法在请求被发送之前调用。我们可以在这里修改请求的 headers、URL 等。

  • process_response(self, request, response, spider) 方法在响应被传递给 Spider 之前调用。我们可以在这里修改响应的内容、状态码等。

  • process_exception(self, request, exception, spider) 方法在请求发生异常时调用。我们可以在这里处理异常,例如重试请求。

要启用中间件,需要在 settings.py 文件中配置 DOWNLOADER_MIDDLEWARES

# settings.py DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomUserAgentMiddleware': 543, }

数字 543 表示中间件的优先级,数字越小优先级越高。

2.4 pipelines.py

pipelines.py 文件用于定义数据管道(Pipeline)。Pipeline 负责处理 Spider 爬取到的数据,例如清洗数据、验证数据、存储数据到数据库或文件等。

代码实践:

下面是一个简单的 Pipeline 示例,用于将爬取到的书籍信息保存到 JSON 文件中:

# pipelines.py import json class JsonWriterPipeline: def __init__(self): self.file = open('books.json', 'w') def process_item(self, item, spider): line = json.dumps(dict(item)) + "\n" self.file.write(line) return item def close_spider(self, spider): self.file.close()

内容详解:

  • process_item(self, item, spider) 方法是 Pipeline 的核心方法,它接收一个 Item 和 Spider 实例,并对 Item 进行处理。

  • open_spider(self, spider) 方法在 Spider 启动时调用。我们可以在这里进行一些初始化操作,例如连接数据库。

  • close_spider(self, spider) 方法在 Spider 关闭时调用。我们可以在这里进行一些清理操作,例如关闭数据库连接。

要启用 Pipeline,需要在 settings.py 文件中配置 ITEM_PIPELINES

# settings.py ITEM_PIPELINES = { 'myproject.pipelines.JsonWriterPipeline': 300, }

数字 300 表示 Pipeline 的优先级,数字越小优先级越高。

2.5 settings.py

settings.py 文件是 Scrapy 项目的配置文件。它包含了各种配置选项,例如爬虫的并发数、下载延迟、User-Agent、Pipeline、Middleware 等。通过修改 settings.py 文件,我们可以定制 Scrapy 的行为。

代码实践:

# settings.py BOT_NAME = 'myproject' SPIDER_MODULES = ['myproject.spiders'] NEWSPIDER_MODULE = 'myproject.spiders' # Obey robots.txt rules ROBOTSTXT_OBEY = True # Configure maximum concurrent requests performed by Scrapy downloader CONCURRENT_REQUESTS = 32 # Configure a delay for requests for the same website (default: 0) DOWNLOAD_DELAY = 3 # Enable or disable downloader middlewares DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomUserAgentMiddleware': 543, } # Enable or disable item pipelines ITEM_PIPELINES = { 'myproject.pipelines.JsonWriterPipeline': 300, }

内容详解:

  • BOT_NAME:爬虫的名称。

  • SPIDER_MODULES:Spider 模块的列表。

  • NEWSPIDER_MODULE:用于创建新 Spider 的模块。

  • ROBOTSTXT_OBEY:是否遵守 robots.txt 规则。

  • CONCURRENT_REQUESTS:Scrapy 下载器的最大并发请求数。

  • DOWNLOAD_DELAY:下载延迟,单位为秒。

  • DOWNLOADER_MIDDLEWARES:启用的下载器中间件。

  • ITEM_PIPELINES:启用的数据管道。

2.6 spiders/ 目录

spiders/ 目录用于存放爬虫代码。每个爬虫都是一个 Python 类,它定义了如何从网站上爬取数据。

代码实践:

下面是一个简单的 Spider 示例,用于爬取书籍信息:

# spiders/book_spider.py import scrapy from myproject.items import BookItem class BookSpider(scrapy.Spider): name = "bookspider" allowed_domains = ["books.toscrape.com"] start_urls = ['http://books.toscrape.com/'] def parse(self, response): books = response.css('article.product_pod') for book in books: item = BookItem() item['title'] = book.css('h3 > a::text').get() item['price'] = book.css('p.price_color::text').get() yield item

内容详解:

  • name:爬虫的名称,用于在命令行中启动爬虫。

  • allowed_domains:允许爬取的域名列表。

  • start_urls:起始 URL 列表。

  • parse(self, response) 方法是 Spider 的核心方法,它接收一个 Response 对象,并解析响应的内容。在这个方法中,我们可以使用 CSS 选择器或 XPath 表达式提取数据,并创建 Item 实例。

  • yield item:将 Item 传递给 Pipeline 进行处理。

3. 总结

理解 Scrapy 项目结构是编写高效、可维护的爬虫的关键。通过合理地组织代码,我们可以充分利用 Scrapy 提供的各种功能,例如中间件、Pipeline 等,从而实现复杂的爬取任务。希望本文能够帮助你更好地理解 Scrapy 项目结构,并在实际项目中应用。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U