强大的开源网络爬虫框架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 程序运行状态和执行过程的详细信息,有助于调试和监控程序的运行情况。

相关推荐
沉默璇年1 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder1 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
2401_882727571 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架
SoaringHeart2 小时前
Flutter进阶:基于 MLKit 的 OCR 文字识别
前端·flutter
会发光的猪。2 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客2 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
猫爪笔记2 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
前端李易安3 小时前
Webpack 热更新(HMR)详解:原理与实现
前端·webpack·node.js
红绿鲤鱼3 小时前
React-自定义Hook与逻辑共享
前端·react.js·前端框架
Domain-zhuo3 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式