强大的开源网络爬虫框架Scrapy的基本介绍(入门级)

Scrapy 是一个强大的开源网络爬虫框架,用于从网站上抓取数据。它基于 Twisted 异步网络框架,可以高效地处理并发请求和数据处理。

以下是 Scrapy 框架的一些重要特点和功能

  1. **灵活的架构**:
  • Scrapy 提供了灵活的架构,可以轻松地定义和定制爬虫逻辑、数据提取规则和数据处理流程。
  1. **高性能**:
  • Scrapy 使用 Twisted 异步网络框架,能够高效地处理并发请求和数据处理,从而实现高性能的网页抓取。
  1. **强大的选择器**:
  • Scrapy 提供了强大的选择器工具,可以使用 CSS 或 XPath 语法来定位网页元素并提取数据。
  1. **丰富的中间件支持**:
  • Scrapy 支持中间件机制,可以通过编写中间件来扩展和修改框架的功能,例如添加自定义的请求头、处理请求和响应等。
  1. **多种数据存储支持**:
  • Scrapy 支持多种数据存储方式,包括保存到文件、存储到数据库、导出到 CSV 或 JSON 等格式。
  1. **自动限速功能**:
  • Scrapy 提供了自动限速功能,可以控制请求的发送速率,避免对目标网站造成过大的压力。
  1. **交互式 Shell 环境**:
  • Scrapy 提供了交互式 Shell 环境,可以快速测试和调试选择器和提取规则,方便开发者进行网页数据的提取和处理。
  1. **可扩展性**:
  • Scrapy 框架具有很高的可扩展性,可以根据具体需求编写自定义的 Spider、中间件、管道等组件,并集成到框架中进行使用。
  1. **完善的文档和社区支持**:
  • Scrapy 拥有完善的官方文档和活跃的社区支持,开发者可以在文档中找到详细的使用说明和示例代码,并在社区中获取帮助和交流经验。

总之,Scrapy 框架是一个功能强大、灵活易用的网络爬虫框架,适用于各种规模和复杂度的网页抓取和数据处理任务。通过合理地使用 Scrapy,开发者可以快速、高效地构建稳定可靠的网络爬虫应用。

以下是 Scrapy 的一些主要概念和方法:

  1. **项目 (Project)**: Scrapy 项目是一个包含 spider、item、pipeline、middleware 和设置的 Python 包。项目是使用 Scrapy 进行 web 爬取的基本单位。

  2. **Spider**: Spider 是定义如何爬取某个网站的类,包括如何进行页面遍历、如何从网页中提取数据等。每个 Spider 类定义了一个特定的爬虫行为。

  3. **Request 和 Response**: Request 是 Scrapy 用于爬取网页的类,而 Response 是网页返回的内容。Spider 通过产生 Request 对象并返回给 Scrapy 引擎来指示要爬取的网页。引擎再将网页内容封装成 Response 对象并返回给 Spider。

  4. **Item**: Item 是保存爬取数据的容器。在 Scrapy 项目中,你需要定义自己的 Item 类型,并在 Spider 中返回这些 Item。

  5. **Pipeline**: Pipeline 是处理 Item 的组件。当 Spider 返回一个 Item 时,它会被送到 Item Pipeline 中进行处理。处理可能包括清理、验证和持久化(如存储到数据库)数据。

  6. **Middleware**: Middleware 是处理 Request 和 Response 的组件。它们提供了一个方便的机制,可以插入自定义的功能到 Scrapy 的请求/响应处理流程中,例如处理请求头、代理设置等。

  7. **Selector**: Selector 是基于 lxml 库,用于从 HTML 或 XML 文档中提取数据的类。Scrapy 提供了两种选择器:CSS 和 XPath。

  8. **Setting**: 在 Scrapy 项目的 settings.py 文件中,你可以对 Scrapy 项目进行配置。例如,你可以设置并发请求的数量、延迟下载等。

以下是 Scrapy 的一些重要方法:

  • `scrapy.Request(url, callback)`: 创建一个新的请求。`url` 参数是你要请求的 URL,`callback` 参数是一个函数,当请求完成并返回响应时,Scrapy 将调用这个函数。

  • `response.css(selector)`: 使用 CSS 选择器从响应中提取数据。`selector` 参数是你的 CSS 选择器。

  • `response.xpath(selector)`: 使用 XPath 选择器从响应中提取数据。`selector` 参数是你的 XPath 选择器。

  • `selector.get()`: 返回选择器选择的第一个结果。

  • `selector.get_all()`: 返回选择器选择的所有结果。

  • `item[field]`: 获取或设置 item 的字段。`field` 参数是你的字段名称。

  • `yield item`: 在 Spider 中,你可以使用 `yield` 语句返回 item。Scrapy 将把这个 item 送到 item pipeline 中进行处理。

  • `scrapy crawl spidername`: 这是一个命令行指令,用于启动一个 spider。`spidername` 参数是你的 spider 的名称。

这就是 Scrapy 的一些重要概念和方法。你可以在 Scrapy 的官方文档中找到更详细的信息。

Scrapy 框架的使用流程通常是:

  1. 定义 Spider 类,实现抓取规则和数据提取逻辑。

  2. 定义 Item 类,描述要抓取的数据结构。

  3. 配置 Pipeline 类,处理和存储抓取到的数据。

  4. 可选地配置 Middleware 类,扩展或修改 Scrapy 的功能。

  5. 使用 CrawlerProcess 启动爬虫任务,Scrapy 将自动执行抓取任务并处理数据。


例如,如果你想创建一个名为 "myproject" 的项目,你应该运行以下命令:

复制代码
scrapy startproject myproject

这将创建一个名为 "myproject" 的目录,其中包含以下文件和目录:

  • myproject/
    • scrapy.cfg: 项目的配置文件。
    • myproject/
      • __init__.py: 一个空的 Python 文件,用于告诉 Python 这个目录应被视为一个 Python 包。
      • items.py: 项目的 item 文件,定义了爬取的数据结构。
      • middlewares.py: 项目的中间件文件。
      • pipelines.py: 项目的管道文件,用于处理爬取到的 item。
      • settings.py: 项目的设置文件,定义了如何配置项目。
      • spiders/
        • __init__.py: 另一个空的 Python 文件,用于告诉 Python 这个目录应被视为一个 Python 包。

这些文件是 Scrapy 项目的基本结构,你可以在这个基础上添加更多的 spiders,修改设置,定义 items,以及添加中间件和管道。

python 复制代码
import scrapy


class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://example.com']

    def parse(self, response):
        # 解析页面,提取数据
        title = response.css('title::text').get()
        paragraphs = response.css('p::text').getall()

        # 输出标题和段落到控制台
        self.logger.info("Title: %s", title)
        self.logger.info("Paragraphs:")
        for paragraph in paragraphs:
            self.logger.info("- %s", paragraph)

        # 将数据传递给管道进行存储
        yield {
            'title': title,
            'paragraphs': paragraphs
        }

# process_item 方法接收两个参数:item 和 spider。
# 其中,item 是一个字典,包含了抓取到的数据;spider 则是抓取数据的 Spider 对象。
class MyPipeline:
    def process_item(self, item, spider):
        # 处理数据,存储到文件或数据库中
        with open('output.txt', 'a') as f:
            f.write(f"Title: {item['title']}\n")
            f.write("Paragraphs:\n")
            for paragraph in item['paragraphs']:
                f.write(f"- {paragraph}\n")
            f.write('\n')
        return item


# 启动爬虫
from scrapy.crawler import CrawlerProcess

process = CrawlerProcess(settings={
    'ITEM_PIPELINES': {'__main__.MyPipeline': 1},
})
process.crawl(MySpider)
process.start()

# 这段代码创建了一个 Scrapy CrawlerProcess 对象,用于启动和管理爬虫任务。
# 在创建 CrawlerProcess 对象时,传入了一个 settings 参数,其中指定了要使用的 Item Pipeline。
# 然后,使用 process.crawl(MySpider) 启动了一个名为 MySpider 的 Spider 对象,即爬虫任务。
# MySpider 是之前定义的一个 Scrapy Spider 类。
# 最后,调用 process.start() 方法开始执行爬虫任务,Scrapy 将会按照 Spider 中定义的规则抓取网页并处理数据。在抓取和处理完成后,程序将退出。

Scrapy 程序的日志输出信息解释:

  1. `INFO: Scrapy 2.11.1 started (bot: scrapybot)`:Scrapy 框架开始运行,显示框架版本号。

  2. `INFO: Enabled addons: []`:显示已启用的 Scrapy 插件为空。

  3. `WARNING: ... ScrapyDeprecationWarning: '2.6' is a deprecated value for the 'REQUEST_FINGERPRINTER_IMPLEMENTATION' setting.`:显示一个 Scrapy 的设置即将被弃用的警告信息。

  4. `DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor`:显示 Scrapy 使用的反应器(reactor)类型。

  5. `INFO: Telnet Password: be39fc00d9595468`:显示启用的 Telnet 控制台的密码。

  6. `INFO: Overridden settings: {}`:显示覆盖的 Scrapy 设置为空。

  7. `INFO: Enabled downloader middlewares: ...`:显示已启用的下载器中间件列表。

  8. `INFO: Enabled spider middlewares: ...`:显示已启用的 Spider 中间件列表。

  9. `INFO: Enabled item pipelines: ['main.MyPipeline']`:显示已启用的 Item Pipeline 列表。

  10. `INFO: Spider opened`:Spider 开始运行。

  11. `INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)`:显示已抓取的页面数和提取的数据项数。

  12. `INFO: Telnet console listening on 127.0.0.1:6023`:显示 Telnet 控制台已在指定地址和端口上监听。

  13. `DEBUG: Crawled (200) <GET http://example.com> (referer: None)`:显示一个 HTTP 请求已被成功抓取。

  14. `DEBUG: ...`:显示 Spider 或 Pipeline 中的自定义调试信息。

  15. `INFO: Closing spider (finished)`:Spider 结束运行。

  16. `INFO: Dumping Scrapy stats: ...`:显示 Scrapy 运行统计信息,如请求次数、响应次数、抓取的数据项数等。

  17. `INFO: Spider closed (finished)`:Spider 已关闭。

这些日志信息提供了关于 Scrapy 程序运行状态和执行过程的详细信息,有助于调试和监控程序的运行情况。

相关推荐
范文杰2 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪2 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪3 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy3 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom4 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom4 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom4 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom4 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom4 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试
LaoZhangAI5 小时前
2025最全GPT-4o图像生成API指南:官方接口配置+15个实用提示词【保姆级教程】
前端