强大的开源网络爬虫框架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 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60613 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了3 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅3 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅3 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅4 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment4 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅4 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊4 小时前
jwt介绍
前端
爱敲代码的小鱼4 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax