📜  使用 Scrapy 收集数据(1)

📅  最后修改于: 2023-12-03 14:49:46.435000             🧑  作者: Mango

使用 Scrapy 收集数据

Scrapy 是一个用 Python 编写的开源网络爬虫框架,可用于抓取网站并从中提取结构化的数据。本文将介绍如何使用 Scrapy 进行数据收集。

安装 Scrapy

在运行 Scrapy 之前,您需要确保已经安装了 Python3 和 Scrapy 。您可以通过以下命令安装 Scrapy:

pip3 install scrapy
创建 Scrapy 项目

使用 Scrapy 可以方便快速地创建爬虫项目。在这里我们使用 scrapy startproject 命令创建一个新项目:

scrapy startproject myproject

运行该命令后,它会创建一个包含 Scrapy 项目的目录结构,如下所示:

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

这些文件的作用如下:

  • scrapy.cfg - 项目的配置文件。
  • myproject/ - Python 模块,你将在这里编写下面的代码。
  • myproject/items.py - 存放你的项目中的 Item 类。
  • myproject/middlewares.py - 存放你的项目的中间件。
  • myproject/pipelines.py - 存放你的项目的管道。
  • myproject/settings.py - 存放你的项目的设置。
  • myproject/spiders/ - 存放你的项目的爬虫。
编写爬虫

编写爬虫的第一步是选择要抓取的网站。在本例中,我们将使用 Quotes to Scrape 网站。我们要试图从该站点中收集书籍的名言警句。

首先,我们需要创建一个 Spider 类,并定义要爬取的 URL 和如何解析其响应的方法。在本例中,我们将使用 Python 的 XPath 解析库来提取数据。下面是一个简单的示例:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.xpath('//div[@class="quote"]'):
            yield {
                'text': quote.xpath('./span[@class="text"]/text()').extract_first(),
                'author': quote.xpath('./span/small/text()').extract_first(),
                'tags': quote.xpath('./div[@class="tags"]/a[@class="tag"]/text()').extract(),
            }

在上面的代码中,我们定义了一个名为 QuotesSpider 的 Spider 类。name 属性用于标识该 Spider。start_urls 属性定义了需要抓取的初始 URL 列表,我们将从第一页开始抓取。

parse 方法中,我们遍历每个引用并使用 XPath 表达式从中提取数据。最后我们将提取到的数据封装为 Python 字典,并使用 yield 关键字返回。这是 Scrapy 异步方式运行的重要机制。

运行爬虫

我们已经编写了爬虫,现在可以使用 Scrapy 从命令行运行它了。进入项目目录并执行以下命令:

scrapy crawl quotes

其中,quotes 是我们在 Spider 类中定义的 name 属性。

爬虫将抓取 http://quotes.toscrape.com/page/1/ 开始的所有页面并将提取到的数据打印到控制台。

如果要将提取的数据保存到文件中,可以使用以下命令:

scrapy crawl quotes -o quotes.json

这将将提取的数据保存到名为 quotes.json 的文件中。

以上是使用 Scrapy 进行数据收集的简单示例。Scrapy 还有许多其他功能,例如管道、中间件等,可以帮助您更好地管理爬取的数据。详细文档请参阅 Scrapy 文档