Scrapy 是一个强大的 Python 网络爬虫框架,专门用于抓取网页数据。它不仅能够从网页提取信息,还能处理诸如网站导航、数据存储、网页请求等复杂任务。与其他爬虫库(如 BeautifulSoupRequests)相比,Scrapy 提供了更多的功能和灵活性,适用于大型和复杂的爬虫项目。

目录

  1. Scrapy 概述
  2. 安装 Scrapy
  3. Scrapy 项目结构
  4. 基本用法
  5. 请求和响应处理
  6. 数据提取和管道
  7. 参考资料

1. Scrapy 概述

Scrapy 是一个功能齐全的框架,适用于开发用于数据采集的爬虫。它不仅仅是一个简单的爬虫库,它还包括以下特性:

  • 异步处理:基于 Twisted 异步网络库,Scrapy 可以高效地并发发送请求,处理大量网页数据。
  • 数据清洗:内建支持提取数据并清洗,适合进行数据抓取后处理。
  • 强大的选择器:内建 XPath 和 CSS 选择器,可以方便地提取网页数据。
  • 扩展性:支持自定义中间件、扩展、管道和信号,便于扩展和优化爬虫功能。
  • 支持不同输出格式:支持将抓取到的数据导出为 JSON、CSV、XML 等格式。

Scrapy 适合于中到大型的爬虫项目,并且提供了非常方便的框架来进行调试、扩展和维护。


2. 安装 Scrapy

首先,你需要安装 Scrapy。你可以通过 pip 来安装:

pip install scrapy

由于 Scrapy 依赖 Twisted 库,安装时可能会遇到一些编译问题。可以参考 Scrapy 安装文档 获取更多帮助,尤其是在 Windows 环境下的安装。


3. Scrapy 项目结构

Scrapy 项目具有明确的结构,通常包含以下目录和文件:

myproject/
    scrapy.cfg
    myproject/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            example_spider.py

  • scrapy.cfg:配置文件,指定项目的配置信息。
  • items.py:定义爬虫抓取的数据结构(字段)。
  • middlewares.py:自定义中间件,用于处理请求和响应。
  • pipelines.py:用于处理抓取的数据(如清洗、存储等)。
  • settings.py:项目配置文件,包含如并发请求数、下载延迟等设置。
  • spiders/:存放爬虫代码,爬虫文件通常包含在该目录下。

创建 Scrapy 项目

scrapy startproject myproject

该命令会创建一个新的 Scrapy 项目,并初始化项目目录结构。


4. 基本用法

4.1 编写爬虫

spiders/ 目录下创建一个爬虫文件,例如 example_spider.py

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['https://quotes.toscrape.com/']

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('span small::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }

  • name:指定爬虫的名称,必须唯一。
  • start_urls:指定爬虫的起始 URL 列表。
  • parse:处理响应的回调函数,提取网页数据。

4.2 运行爬虫

在命令行中运行爬虫:

scrapy crawl example

你可以通过命令行选项将数据保存为 JSON、CSV 或 XML 格式:

scrapy crawl example -o quotes.json


5. 请求和响应处理

在 Scrapy 中,请求(Request)和响应(Response)是抓取过程中非常核心的部分。

5.1 发起请求

通过 scrapy.Request 类发起请求,并通过回调函数处理响应:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['https://quotes.toscrape.com/']

    def parse(self, response):
        next_page = response.css('li.next a::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)

  • response.follow():用于处理相对 URL 并发起新的请求。

5.2 提交表单

通过 scrapy.FormRequest 提交表单:

import scrapy

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

    def parse(self, response):
        return scrapy.FormRequest.from_response(
            response,
            formdata={'username': 'myusername', 'password': 'mypassword'},
            callback=self.after_login
        )

    def after_login(self, response):
        # 处理登录后的页面
        pass


6. 数据提取和管道

Scrapy 提供了 itemspipelines 两个功能来进行数据提取和存储。

6.1 定义 Item

items.py 中定义抓取数据的结构:

import scrapy

class QuoteItem(scrapy.Item):
    text = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()

6.2 使用 Pipelines

pipelines.py 中定义数据处理逻辑,如清洗数据、保存到数据库等。

class QuotePipeline:
    def process_item(self, item, spider):
        item['text'] = item['text'].strip()
        return item

settings.py 中启用管道:

ITEM_PIPELINES = {
    'myproject.pipelines.QuotePipeline': 1,
}


7. 参考资料

出站链接

站内链接


Scrapy 是一个非常强大且高效的爬虫框架,特别适用于处理大型爬虫项目。它不仅提供了强大的功能,还能够通过中间件、管道等机制灵活定制爬虫的各个方面。如果你需要开发一个高效、可维护的爬虫,Scrapy 是一个非常适合的工具。