【爬虫】使用 Scrapy 框架爬取豆瓣电影 Top 250 数据的完整教程

前言

在大数据和网络爬虫领域,Scrapy 是一个功能强大且广泛使用的开源爬虫框架。它能够帮助我们快速地构建爬虫项目,并高效地从各种网站中提取数据。在本篇文章中,我将带大家从零开始使用 Scrapy 框架,构建一个简单的爬虫项目,爬取 豆瓣电影 Top 250 的电影信息。

Scrapy 官方文档:Scrapy Documentation

豆瓣电影 Top 250 :豆瓣电影 Top 250

本文的爬虫项目配置如下:

  • 系统:Windows
  • Python 版本:3.8.6
  • 开发环境:PyCharm

如果你使用的是其他系统或 IDE,也可以按照本文的步骤进行操作,只需根据自己的环境做出相应调整即可。

环境准备

1. 安装 Python

在使用 Scrapy 之前,确保你已经安装了 Python。如果没有,请先安装 Python 3.6+ 版本。你可以访问 Python 官方网站 下载并安装最新版的 Python。

安装完成后,打开命令行窗口,输入以下命令检查是否安装成功:

python --version
2. 安装 Scrapy

确认安装了 Python 后,你可以使用 pip 安装 Scrapy。pip 是 Python 的包管理工具,它能够帮助我们安装各种第三方库。

在命令行窗口输入以下命令:

pip install scrapy

安装完成后,可以通过以下命令检查 Scrapy 是否安装成功:

scrapy version
3. 安装 Anaconda(可选)

如果你更喜欢使用虚拟环境管理工具,可以选择安装 Anaconda,它能够帮助你更方便地管理项目中的 Python 依赖。你可以从 Anaconda 官方网站 下载并安装 Anaconda。

使用 Anaconda 创建一个虚拟环境,并激活环境后再安装 Scrapy:

conda create -n scrapy_env python=3.8
conda activate scrapy_env
pip install scrapy
4. 创建 Scrapy 项目

安装 Scrapy 完成后,我们可以开始创建一个新的 Scrapy 项目。在终端中,进入你希望存放项目的目录,然后运行以下命令:

scrapy startproject DoubanProject

这将创建一个名为 DoubanProject 的 Scrapy 项目,其中包含 Scrapy 默认的文件夹和文件结构:

DoubanProject/
├── DoubanProject/
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
└── spiders/├── __init__.py└── douban.py

爬虫的编写

1. 编写 items.py

items.py 文件中定义我们要爬取的数据字段。豆瓣 Top 250 页面包含电影的排名、名称、简介、评分、评价人数和电影海报链接等信息,因此我们需要定义相应的数据字段。

import scrapyclass DoubanprojectItem(scrapy.Item):rank = scrapy.Field()  # 电影排名movie_name = scrapy.Field()  # 电影名称movie_introduction = scrapy.Field()  # 电影简介picture = scrapy.Field()  # 电影海报链接movie_rating = scrapy.Field()  # 电影评分evaluators = scrapy.Field()  # 评价人数
2. 编写爬虫文件 douban.py

spiders 目录下,我们需要创建一个爬虫文件 douban.py 来定义具体的爬虫逻辑。Scrapy 通过 Spider 类来定义爬虫,它包含了爬虫的名称、允许访问的域名、起始 URL,以及如何解析和处理抓取到的数据。

2.1 定义爬虫文件

首先,在 spiders 目录下创建 douban.py 文件,编写代码如下:

import scrapy
from scrapy import Selector, Request
from ..items import DoubanprojectItem  # 导入之前定义的 item 数据结构
2.2 创建 DoubanSpider

douban.py 文件中定义一个爬虫类 DoubanSpider,继承自 scrapy.Spidername 是爬虫的名字,用于在命令行中启动爬虫,allowed_domains 是允许爬虫访问的域名,start_urls 是爬虫开始爬取的页面 URL 列表。

class DoubanSpider(scrapy.Spider):name = "douban"  # 爬虫的唯一名称allowed_domains = ["movie.douban.com"]  # 允许的域名范围start_urls = ["https://movie.douban.com/top250"]  # 爬虫从这个 URL 开始抓取
2.3 编写 parse 方法

parse 是 Scrapy 中的默认解析方法,爬虫启动后,Scrapy 会自动下载 start_urls 中的页面,并将响应传递给这个方法。在这里,我们会使用 XPath 来提取电影信息。

  1. 首先使用 Selector 对页面进行解析。

  2. 然后使用 XPath 提取页面中所有电影的列表,遍历每部电影并提取需要的字段信息,如电影的排名、名称、简介、评分等。

  3. 最后通过 yield 返回提取到的数据。

    def parse(self, response):sel = Selector(response)  # 使用 Selector 解析 HTML 响应movie_items = sel.xpath('//div[@class="article"]//ol[@class="grid_view"]/li')  # 提取所有电影条目
    
2.4 提取电影信息

接下来,我们需要提取每部电影的具体信息。我们定义了 DoubanprojectItem 来存储每部电影的字段信息,并通过 XPath 提取页面中的对应字段。

        for movie in movie_items:item = DoubanprojectItem()  # 创建 DoubanprojectItem 实例# 提取电影的各个字段item['rank'] = movie.xpath('.//div[@class="pic"]/em/text()').extract_first()  # 电影排名item['movie_name'] = movie.xpath('.//div[@class="hd"]//span[1]/text()').extract_first()  # 电影名称item['movie_introduction'] = movie.xpath('.//div[@class="bd"]//span[@class="inq"]/text()').extract_first(default='无')  # 电影简介item['picture'] = movie.xpath('.//div[@class="pic"]/a/img/@src').extract_first()  # 电影海报链接item['movie_rating'] = movie.xpath('.//div[@class="star"]/span[2]/text()').extract_first()  # 电影评分item['evaluators'] = movie.xpath('.//div[@class="star"]/span[4]/text()').extract_first()  # 评价人数# 返回提取到的 itemyield item
2.5 处理分页

豆瓣电影的 Top 250 列表分成了 10 页,每页显示 25 部电影。在爬取完第一页后,我们需要继续爬取剩下的页面。通过提取页面底部的“下一页”链接,来实现分页抓取。

        # 获取下一页的链接next_link = sel.xpath('//span[@class="next"]/link/@href').extract_first()if next_link:# 如果存在下一页链接,构造请求并递归调用 parse 方法yield Request(url=response.urljoin(next_link), callback=self.parse)
2.6 完整的 douban.py 文件

完整的爬虫文件 douban.py 如下:

import scrapy
from scrapy import Selector, Request
from ..items import DoubanprojectItem  # 导入 item 数据结构class DoubanSpider(scrapy.Spider):name = "douban"  # 爬虫的名称allowed_domains = ["movie.douban.com"]  # 允许的域名start_urls = ["https://movie.douban.com/top250"]  # 爬虫起始页面def parse(self, response):sel = Selector(response)  # 解析页面movie_items = sel.xpath('//div[@class="article"]//ol[@class="grid_view"]/li')  # 获取电影条目列表for movie in movie_items:item = DoubanprojectItem()  # 创建 item 实例# 提取电影信息item['rank'] = movie.xpath('.//div[@class="pic"]/em/text()').extract_first()item['movie_name'] = movie.xpath('.//div[@class="hd"]//span[1]/text()').extract_first()item['movie_introduction'] = movie.xpath('.//div[@class="bd"]//span[@class="inq"]/text()').extract_first(default='无')item['picture'] = movie.xpath('.//div[@class="pic"]/a/img/@src').extract_first()item['movie_rating'] = movie.xpath('.//div[@class="star"]/span[2]/text()').extract_first()item['evaluators'] = movie.xpath('.//div[@class="star"]/span[4]/text()').extract_first()yield item  # 返回 item# 处理分页next_link = sel.xpath('//span[@class="next"]/link/@href').extract_first()if next_link:yield Request(url=response.urljoin(next_link), callback=self.parse)

详细解释:
  • Spider 类定义name 确定了爬虫的名字,allowed_domains 确定了允许的域名,start_urls 列出了爬虫的起始页面。
  • parse 方法:通过 Selector 解析页面,使用 XPath 提取电影的详细信息并存储到 DoubanprojectItem 对象中。
  • 分页处理:通过检查是否有下一页链接,使用 Request 对象进行递归抓取,直到所有页面的数据都被抓取。

3. 编写 pipelines.py

在 Scrapy 中,pipelines.py 文件用于处理爬取到的数据。这里,我们要将抓取到的豆瓣电影数据保存到 Excel 文件中。为了实现这一点,我们会使用 Python 的 openpyxl 库,它是一个专门用于处理 Excel 文件的库。

3.1 安装 openpyxl

首先,确保你已经安装了 openpyxl,如果没有安装,可以通过 pip 进行安装:

pip install openpyxl
3.2 创建 DoubanprojectPipeline

DoubanprojectPipeline 类将处理从爬虫传递过来的数据,并将这些数据写入 Excel 文件。Scrapy 中的 Pipeline 类通常有三个方法:open_spiderprocess_itemclose_spider

  • open_spider:当爬虫启动时调用,一般用于初始化一些资源。
  • process_item:每当爬虫抓取到一个数据项(item)时,都会调用此方法来处理该项数据。
  • close_spider:当爬虫结束时调用,用于保存文件或释放资源。

以下是详细的代码解释:

import openpyxl  # 导入处理 Excel 文件的库
from .items import DoubanprojectItem  # 导入定义好的 Item 数据结构class DoubanprojectPipeline:def __init__(self):"""初始化方法,在爬虫开始时被调用,初始化 Excel 工作簿和表格。"""self.wb = openpyxl.Workbook()  # 创建一个新的 Excel 工作簿self.sheet = self.wb.active  # 获取工作簿的活动表格self.sheet.title = '豆瓣电影Top250'  # 设置表格的标题# 在第一行写入表头,表示每列的意义self.sheet.append(('电影排名', '电影名称', '电影简介', '电影海报', '电影评分', '观影人数'))def open_spider(self, spider):"""当爬虫被启动时调用该方法。:param spider: 当前运行的爬虫对象"""print('开始爬虫...')  # 可以选择在控制台输出提示信息,表示爬虫开始运行def process_item(self, item: DoubanprojectItem, spider):"""处理每个爬取到的数据项(item),将其保存到 Excel 文件中。:param item: 爬取到的电影数据:param spider: 当前运行的爬虫对象:return: 返回处理后的 item"""# 将每部电影的信息以一行的形式写入 Excelself.sheet.append((item['rank'],  # 电影排名item['movie_name'],  # 电影名称item['movie_introduction'],  # 电影简介item['picture'],  # 电影海报链接item['movie_rating'],  # 电影评分item['evaluators']  # 观影人数))# 返回 item 是 Scrapy Pipeline 的标准流程,方便后续可能有其他 pipeline 处理return itemdef close_spider(self, spider):"""当爬虫关闭时调用,保存 Excel 文件。:param spider: 当前运行的爬虫对象"""print("爬虫结束....")  # 输出爬虫结束的提示# 保存 Excel 文件到指定路径self.wb.save('豆瓣电影数据.xlsx')
3.3 详细解释代码
  1. __init__ 方法

    • 该方法在爬虫启动时初始化,创建一个 Excel 工作簿 (self.wb),并获取活动表 (self.sheet)。
    • 使用 self.sheet.title 为表格设置一个标题,在这里我们将其命名为 “豆瓣电影Top250”。
    • 使用 self.sheet.append() 将表头写入 Excel 文件,表头包括 “电影排名”、“电影名称”、“电影简介”、“电影海报”、“电影评分” 和 “观影人数”。
  2. open_spider 方法

    • 在爬虫启动时执行,可以在这里做一些初始化操作,比如在控制台输出一个提示信息“开始爬虫…”。
  3. process_item 方法

    • 每次爬虫抓取到一个新的电影数据项(item)时,Scrapy 会自动调用此方法来处理数据。
    • self.sheet.append() 将数据项中的字段值(如排名、名称、简介等)写入 Excel 文件中的一行。
    • 返回 item 是 Scrapy Pipeline 的标准流程,以便数据继续传递给其他可能的 pipeline。
  4. close_spider 方法

    • 当爬虫结束时,Scrapy 会调用此方法来进行收尾工作。
    • 这里使用 self.wb.save('豆瓣电影数据.xlsx') 将数据保存到 豆瓣电影数据.xlsx 文件中,并在控制台输出“爬虫结束…”提示。
3.4 设置 pipelines

为了让 Scrapy 使用我们的 DoubanprojectPipeline,我们需要在 settings.py 中启用该 Pipeline。

打开 settings.py 文件,并添加以下代码:

# 启用我们定义的 Pipeline
ITEM_PIPELINES = {"DoubanProject.pipelines.DoubanprojectPipeline": 300,
}

300 是该 Pipeline 的优先级,数字越小优先级越高。这里我们设置为 300,表示优先处理该 Pipeline。

通过这个 pipelines.py 文件,爬取到的豆瓣电影数据将会被逐条写入 Excel 文件。当爬虫结束时,完整的 Excel 文件就已经生成好了,里面包含了所有抓取到的电影信息。


4. 配置 settings.py

为了确保爬虫能够顺利地抓取豆瓣的电影数据并避免触发反爬机制,我们需要对 settings.py 文件进行配置。settings.py 文件是 Scrapy 项目的全局配置文件,所有的爬虫行为(如请求频率、请求头信息、爬虫管道等)都在这里进行设置。下面我们详细解释如何配置 settings.py

4.1 配置 BOT_NAME

BOT_NAME 定义了 Scrapy 项目的名称,Scrapy 会根据这个名称来识别项目。你可以将其保持默认或根据你的项目需求进行修改:

BOT_NAME = "DoubanProject"
4.2 配置 SPIDER_MODULESNEWSPIDER_MODULE

SPIDER_MODULESNEWSPIDER_MODULE 定义了爬虫的存放路径和默认新爬虫生成位置。

  • SPIDER_MODULES: 该配置定义了存放所有爬虫的模块。在这里,所有爬虫都存放在 DoubanProject.spiders 目录下。

  • NEWSPIDER_MODULE: 该配置定义了新生成的爬虫的默认存放位置。

    SPIDER_MODULES = [“DoubanProject.spiders”]
    NEWSPIDER_MODULE = “DoubanProject.spiders”

4.3 设置 User-Agent

User-Agent 是 HTTP 请求头中的一个重要字段,它告诉目标服务器你的请求来自哪个浏览器或客户端。很多网站会通过检测 User-Agent 来区分正常用户和爬虫。为了避免被识别为爬虫,我们可以将 User-Agent 字段伪装成常见的浏览器。

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'

在上面的配置中,我们将 User-Agent 伪装成了 Google Chrome 浏览器。这有助于提高爬虫的隐蔽性,避免被目标网站的反爬虫机制识别和封禁。

4.4 禁用 robots.txt 规则

许多网站使用 robots.txt 文件来限制爬虫访问某些页面。为了能够抓取豆瓣的内容,我们需要将 Scrapy 的 ROBOTSTXT_OBEY 设置为 False,忽略 robots.txt 规则。

ROBOTSTXT_OBEY = False

注意:尽管我们在这里禁用了 robots.txt,实际开发时应尽量遵循网站的爬虫规则,避免给网站带来过多负担。

4.5 设置下载延迟 DOWNLOAD_DELAY

为了避免触发网站的反爬虫机制,建议设置一个下载延迟。DOWNLOAD_DELAY 定义了每个请求之间的时间间隔,防止爬虫请求频率过高,给服务器带来过大压力。通常,1-3 秒的延迟是合理的选择。

DOWNLOAD_DELAY = 2  # 设置每个请求之间的时间间隔为 2 秒

你还可以设置 RANDOMIZE_DOWNLOAD_DELAYTrue,让每次请求之间的延迟时间随机变化,这样可以进一步避免被反爬虫机制发现。

RANDOMIZE_DOWNLOAD_DELAY = True
4.6 启用 Cookies

有些网站会使用 Cookies 来跟踪用户的行为和状态。如果不启用 Cookies,有时会导致爬取数据不完整或被限制访问。我们在这里启用 Scrapy 的 COOKIES_ENABLED 设置:

COOKIES_ENABLED = True

这将允许爬虫在请求过程中自动处理 Cookies。

4.7 启用 Item Pipelines

Item Pipelines 负责处理爬虫提取到的数据,并将其保存到不同的输出格式中。在这里,我们已经在 pipelines.py 中编写了一个 Pipeline 来将电影数据保存到 Excel 文件中。接下来需要在 settings.py 中启用这个 Pipeline。

ITEM_PIPELINES = {"DoubanProject.pipelines.DoubanprojectPipeline": 300,
}

数字 300 代表优先级,Scrapy 会根据优先级的数字大小依次执行不同的 Pipelines。数字越小,优先级越高。

4.8 配置其他默认设置

最后,确保 Scrapy 的其他设置与最新版本兼容。这里我们设置了 REQUEST_FINGERPRINTER_IMPLEMENTATIONTWISTED_REACTOR,它们是 Scrapy 的内部配置,用于确保兼容性和性能优化。

# 设置未来兼容性
REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"  # 确保导出文件的编码为 UTF-8

修改后的 settings.py 文件完整代码:
BOT_NAME = "DoubanProject"SPIDER_MODULES = ["DoubanProject.spiders"]
NEWSPIDER_MODULE = "DoubanProject.spiders"# 伪装成正常的浏览器
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'# 不遵守 robots.txt 规则
ROBOTSTXT_OBEY = False# 启用 Cookies
COOKIES_ENABLED = True# 配置下载延迟,避免被封禁
DOWNLOAD_DELAY = 2  # 每次请求间隔2秒
RANDOMIZE_DOWNLOAD_DELAY = True  # 随机化下载延迟# 配置默认请求头,模拟真实用户
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9','Referer': 'https://www.douban.com/',
}# 启用下载中间件
DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
}# 启用 Item Pipelines
ITEM_PIPELINES = {"DoubanProject.pipelines.DoubanprojectPipeline": 300,
}# 启用 AutoThrottle 扩展,控制并发请求速度
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5  # 初始延迟
AUTOTHROTTLE_MAX_DELAY = 60  # 最大延迟
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0  # 每个服务器的并发请求数量
AUTOTHROTTLE_DEBUG = False  # 禁用调试信息显示# HTTP缓存设置(可选)
HTTPCACHE_ENABLED = False# 设置未来兼容性
REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"
终端运行爬虫 douban
scrapy crawl douban

运行后,爬虫将抓取豆瓣电影 Top 250 的数据并保存到 豆瓣电影数据.xlsx 文件中。

导入 MySQL 数据库

在本节中,我们将介绍如何将抓取的豆瓣电影数据保存到 MySQL 数据库中。Scrapy 提供了灵活的管道机制,可以将抓取的数据导入到多种存储平台。通过下面的步骤,我们将爬取的数据存储到 MySQL 数据库中。

1. 在 MySQL 中创建数据库

首先,确保你已经安装并启动了 MySQL 数据库。在 MySQL 中,我们需要创建一个数据库和对应的数据表来存储抓取到的电影信息。

创建数据库:

-- MySQL 8.0 及以上版本
create database douban_movie;-- 如果你使用的是 MySQL 8.0 以下版本,请使用以下命令指定编码为 utf8mb4
create database douban_movie default charset=utf8mb4;

切换到你创建的数据库:

use douban_movie;
2. 在数据库中创建数据表

在刚刚创建的 douban_movie 数据库中,我们需要创建一个表 movie_data 来存储爬取到的电影信息。表结构如下:

CREATE TABLE movie_data(rank varchar(20),                  -- 电影排名movie_name varchar(30),            -- 电影名称movie_introduction varchar(100),   -- 电影简介picture varchar(100),              -- 电影海报链接movie_rating varchar(100),         -- 电影评分evaluators varchar(100)            -- 评价人数
) character set=utf8;
3. 修改 pipelines.py,将数据保存到 MySQL

接下来,我们需要在 pipelines.py 文件中编写代码,将爬取到的数据保存到 MySQL 数据库中。我们会使用 pymysql 库来操作 MySQL。

安装 pymysql

pip install pymysql

然后,在 pipelines.py 文件中添加如下代码:

import pymysql
from .items import DoubanprojectItem  # 导入定义好的 item 数据结构class MysqlPipeline:def __init__(self, host, database, user, password, port):"""初始化 MySQL 数据库连接配置"""self.host = hostself.database = databaseself.user = userself.password = passwordself.port = port@classmethoddef from_crawler(cls, crawler):"""从 Scrapy 项目的 settings.py 文件中读取 MySQL 的连接信息"""return cls(host=crawler.settings.get('MYSQL_HOST'),database=crawler.settings.get('MYSQL_DATABASE'),user=crawler.settings.get('MYSQL_USER'),password=crawler.settings.get('MYSQL_PASSWORD'),port=crawler.settings.get('MYSQL_PORT'))def open_spider(self, spider):"""爬虫启动时打开数据库连接"""print('打开数据库连接....')self.db = pymysql.connect(host=self.host, user=self.user, password=self.password, database=self.database,port=self.port, charset='utf8')self.cursor = self.db.cursor()def close_spider(self, spider):"""爬虫结束时关闭数据库连接"""print('关闭数据库连接...')self.db.close()def process_item(self, item, spider):"""将爬取到的 item 存储到 MySQL 数据库"""data = dict(item)keys = ', '.join(data.keys())  # 获取字段名values = ', '.join(['%s'] * len(data))  # 构建 SQL 中的值部分sql = "insert into movie_data (%s) values (%s)" % (keys, values)self.cursor.execute(sql, tuple(data.values()))  # 执行 SQL 插入语句self.db.commit()  # 提交事务return item  # 继续传递给下一个 pipeline(如果有的话)
4. 配置 settings.py 文件

为了让 Scrapy 能够将数据写入 MySQL,我们需要在 settings.py 文件中进行一些配置。首先,启用 MysqlPipeline,然后配置 MySQL 数据库的连接信息。

settings.py 中添加如下内容:

# 启用 MysqlPipeline 管道,将数据存入 MySQL
ITEM_PIPELINES = {"DoubanProject.pipelines.MysqlPipeline": 301,
}# 配置 MySQL 数据库的连接信息
MYSQL_HOST = 'localhost'           # MySQL 服务器的地址
MYSQL_DATABASE = 'douban_movie'    # 使用的数据库名
MYSQL_PORT = 3306                  # MySQL 端口号,默认是3306
MYSQL_USER = 'root'                # 你的 MySQL 用户名
MYSQL_PASSWORD = 'your password'   # 你的 MySQL 密码
5. 运行爬虫并将数据导入 MySQL

现在你可以通过以下命令运行爬虫:

scrapy crawl douban

等待爬虫运行完毕后,打开你的 MySQL 数据库,使用以下 SQL 查询命令查看爬取到的数据:

SELECT * FROM movie_data;

你也可以使用 MySQL Workbench 或 Navicat 等图形化工具查看数据。


终端运行爬虫 douban

在所有的代码编写和配置完成后,我们就可以运行爬虫来抓取数据并保存到 Excel 文件和 MySQL 数据库中。以下是运行爬虫的步骤:

1. 进入项目目录

首先,确保你的终端已经定位到项目的根目录,也就是包含 scrapy.cfg 文件的目录。可以通过命令行进入项目根目录:

cd path/to/your/DoubanProject

path/to/your/DoubanProject 替换为你实际的项目路径。

2. 运行爬虫

在项目目录下,通过以下命令启动爬虫:

scrapy crawl douban

此时,爬虫将开始访问豆瓣电影的 Top 250 页面,逐页抓取电影信息。抓取到的数据将被同时保存到 Excel 文件 (豆瓣电影数据.xlsx) 中,以及 MySQL 数据库(如果配置了 MySQL 管道)。

3. 查看生成的 Excel 文件

在爬虫运行完成后,Excel 文件将会保存在项目目录下,文件名为 豆瓣电影数据.xlsx

你可以使用 WPS Office、Microsoft Excel 或任何支持 Excel 文件的软件来打开这个文件。

  • 使用 WPS 打开 Excel 文件
    • 在文件资源管理器中,找到 豆瓣电影数据.xlsx 文件。
    • 右键单击文件,选择 “打开方式”,然后选择 WPS 表格
    • 你将看到抓取的豆瓣电影排名、名称、简介、评分、观影人数等数据都已经填充在表格中。

Excel 文件的内容应该类似如下:

电影排名

电影名称

电影简介

电影海报

电影评分

观影人数

1

肖申克的救赎

自由万岁!

图片链接

9.7

5000000+

2

霸王别姬

风华绝代

图片链接

9.6

4000000+

4. 检查数据库中的数据

如果你配置了 MySQL 管道,数据也会被存入 MySQL 数据库。你可以通过以下命令在 MySQL 中检查数据:

USE douban_movie;
SELECT * FROM movie_data;

此时,终端将展示爬虫保存到数据库中的数据内容。

5. 爬虫运行提示信息

当你在终端运行爬虫时,你还会在终端中看到相关的运行日志,这些日志会提示爬虫的当前状态,比如:

  • 正在抓取的页面 URL。
  • 每一页抓取的数量。
  • 数据是否成功保存。
  • 爬虫完成时的提示信息。

注意:使用爬虫工具时,请务必遵守目标网站的 robots.txt 文件以及相关法律法规,避免对网站造成过度负载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/66398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wx030基于springboot+vue+uniapp的养老院系统小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

计算机网络常见协议

目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS(SSL/TLS加密) HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…

静态综合路由实验

实验拓扑 实验要求 1.除R5的环回地址外,整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2.R1-R4每个路由器存在两个环回接口,用于模拟pc网段;地址也在192.168.1.0/24这个网络范围内 3.R1-R4上不能直接编写到达5.5.5.0/24的静态路由…

左神算法基础提升--4

文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况:1.当前节点参与最大距离的求解;2.当前节点不参与最大距离的求解; 1.当前节点参与最…

[计算机网络]一. 计算机网络概论第一部分

作者申明&#xff1a;作者所有文章借助了各个渠道的图片视频以及资料&#xff0c;在此致谢。作者所有文章不用于盈利&#xff0c;只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库&#xff0c;已经包含三方库。 一、运行效果&#xff1a;二、源代码来源及编程语言&#xff1a;三、环境搭建&#xff1a;安装红警2安装VS2022下载代码&#xff0c;源代码其实不太多&#xff0c…

SSM课设-酒店管理系统功能设计

【课设者】SSM课设-酒店管理系统 分为用户端管理员端 技术栈: 后端: Spring Spring MVC MyBatis Mysql JSP 前端: HtmlCssJavaScriptAjax 功能: 用户端主要功能包括&#xff1a; 登录注册 客房预订 客房评论 首页 管理员端主要功能包括&#xff1a; 会员信息管理 客房信息…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

cuda从零开始手搓PB神经网络

cuda实现PB神经网络 基于上一篇的矩阵点乘&#xff0c;实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。实现PB神经网络如下&#xff1a; #ifndef __BP_NETWORK_HPP__ #define __BP_NETWORK_HPP__ #include "matrix.hpp&quo…

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(七)

文章目录 一、题库管理模块实现1、新增题目功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、题目列表功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询题目列表接口实现2.3.2 后端编辑试题接口实现2.4 效果展示二、代码下载一、题库管…

打破编程“鄙视链”:探索行业发展新路径

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 打破…

【统计的思想】假设检验(一)

假设检验是统计学里的重要方法&#xff0c;同时也是一种“在理想与现实之间观察求索”的测试活动。假设检验从概率的角度去考察理想与现实之间的关系&#xff0c;籍此来缓解测试可信性问题。 我们先来看一个例子。民航旅客服务系统&#xff0c;简称PSS系统&#xff0c;有一种业…

SpringBoot2 + Flowable(UI)

文章目录 引言I 技术栈软件架构基于 Vue.js 和 Element UI 的后台管理系统工程结构II 依赖rest,logic,conf 的依赖工作流flowable jar包flowable-ui所需jar包III 配置jdbc 配置 nullCatalogMeansCurrent = true引言 I 技术栈 软件架构 前端基于vue 、element-ui框架分模块设…

Linux探秘坊-------3.开发工具详解(1)

1 初识vim编辑器 创建第一个vim编辑的代码 1.新建文件 2.使用vim打开 3.打开默认是命令模式&#xff0c;写代码需要在屏幕上输出“i”字符 1.写完代码后要按Esc键退出到指令模式2.再按shift:wq即可保存并退出vim &#xff08;因为不支持鼠标&#xff0c;通常 使用键盘上的箭…

基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 市场上关于图像、音频的soc其实非常多&#xff0c;这里面有高、中、低档&#xff0c;开发方式也不相同。之所以会这样&#xff0c;有价格的因素&am…

51单片机——DS18B20温度传感器

由于DS18B20数字温度传感器是单总线接口&#xff0c;所以需要使用51单片机的一个IO口模拟单总线时序与DS18B20通信&#xff0c;将检测的环境温度读取出来 1、DS18B20模块电路 传感器接口的单总线管脚接至单片机P3.7IO口上 2、DS18B20介绍 2.1 DS18B20外观实物图 管脚1为GN…

STL容器-- list的模拟实现(附源码)

STL容器-- list的模拟实现&#xff08;附源码&#xff09; List的实现主要时考察我们对list这一容器的理解&#xff0c;和代码的编写能力&#xff0c;通过上节对list容器的使用&#xff0c;我们对list容器已经有了一些基本的了解&#xff0c;接下来就让我们来实现一些list容器常…

Lynx TiDB 慢日志收集工具

作者&#xff1a; 小龙虾爱大龙虾 原文来源&#xff1a; https://tidb.net/blog/7247e68f 简介 lynx 工具可以定时将 TiDB 集群的慢查询收集并持久化到后端数据库中&#xff0c;然后通过 grafana 查询展示出来&#xff0c;这可以帮助我们更好的分析慢查询日志。 背景 尽管…

Gin 源码概览 - 路由

本文基于gin 1.1 源码解读 https://github.com/gin-gonic/gin/archive/refs/tags/v1.1.zip 1. 注册路由 我们先来看一段gin代码&#xff0c;来看看最终得到的一颗路由树长啥样 func TestGinDocExp(t *testing.T) {engine : gin.Default()engine.GET("/api/user", f…