如何使用 Scrapy 爬取多级页面中的数据?

2023-04-17 00:00:00 数据 页面 如何使用

Scrapy 是一个用于抓取网站数据和提取结构化数据的 Python 应用程序框架。它可以遍历网站的链接,爬取多级页面中的数据,从而实现大规模数据采集。在本文中,我们将通过一个例子来演示如何使用 Scrapy 爬取多级页面中的数据。
1. 确定需要爬取的数据
假设我们需要从 “pidancode.com” 网站上爬取所有文章标题和摘要。我们希望从主页开始遍历网站所有页面,爬取每个页面中的标题和摘要。
2. 创建 Scrapy 项目
打开命令行终端,使用以下命令在任意位置创建一个新的 Scrapy 项目。

scrapy startproject pidancode

这将在当前目录下创建名为 pidancode 的新文件夹,其中包含一些模板文件和目录。
3. 定义 Item
在 Scrapy 中,Item 表示要爬取的数据结构。因此,在开始爬取网站之前,我们需要定义一个 Item,用于存储每个页面的标题和摘要信息。
打开 pidancode/items.py 文件,将以下代码添加到文件中:

import scrapy
class PidancodeItem(scrapy.Item):
    title = scrapy.Field()
    summary = scrapy.Field()

这个 Item 有两个字段:titlesummary,分别表示文章标题和摘要。
4. 定义 Spider
在 Scrapy 中,Spider 是负责定义如何遍历网站以及如何解析网页的类。我们需要定义一个 Spider,以遍历 “pidancode.com” 网站上的页面,并从每个页面中提取标题和摘要。
打开 pidancode/spiders 目录,在该目录下创建名为 pidancode_spider.py 的新文件,并将以下代码添加到文件中:

import scrapy
from pidancode.items import PidancodeItem
class PidancodeSpider(scrapy.Spider):
    name = "pidancode"
    allowed_domains = ["pidancode.com"]
    start_urls = [
        "http://pidancode.com/"
    ]
    def parse(self, response):
        # 解析页面,提取标题和摘要
        for sel in response.xpath('//div[@class="entry"]'):
            item = PidancodeItem()
            item['title'] = sel.xpath('div[@class="entry-title"]/a/text()').extract_first()
            item['summary'] = sel.xpath('div[@class="entry-summary"]/p/text()').extract_first()
            yield item
        # 判断是否有下一页链接,如果有则继续爬取
        next_page = response.xpath('//div[@class="nav-previous"]/a/@href')
        if next_page:
            url = response.urljoin(next_page.extract_first())
            yield scrapy.Request(url, self.parse)

代码注释:
- 我们首先定义了 Spider 名称(name)、要爬取的域名(allowed_domains)和要爬取的起始 URL(start_urls)。
- 在 parse 方法中,我们遍历每个页面中的 div 元素,然后使用 XPath 提取标题和摘要。
- 我们使用 yield 语句返回一个 PidancodeItem 对象,以存储提取到的数据。
- 在 parse 方法中,我们还检查是否存在下一页链接。如果有,则使用 scrapy.Request 发送请求,并使用 parse 方法处理响应。
5. 运行 Spider
在命令行终端中,进入 pidancode 目录,然后执行以下命令:

scrapy crawl pidancode

这将启动 Spider 并开始遍历网站,爬取页面。数据将以 JSON 格式显示在终端中,如下所示:

{"summary": "\n                    这是一个 Scrapy 示例。\n                ", "title": "\nScrapy 示例\n"}
{"summary": "\n                    这是一个数据结构和算法的示例。\n                ", "title": "\n数据结构和算法\n"}
{"summary": "\n                    这是一个 Python 库和框架的示例。\n                ", "title": "\nPython 库和框架\n"}
...

以上代码演示了如何使用 Scrapy 爬取多级页面中的数据。在实际项目中,您可以根据需要修改 Spider 的代码,例如修改 XPath 表达式提取更多数据、启用分布式爬取等。

相关文章