程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Python 基础

    • Python基础
  • Python 进阶

    • 装饰器与生成器
    • 异常处理
    • 标准库精讲
    • 模块与包
    • pip包管理工具
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
前端 (opens new window)
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Python 基础

    • Python基础
  • Python 进阶

    • 装饰器与生成器
    • 异常处理
    • 标准库精讲
    • 模块与包
    • pip包管理工具
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
前端 (opens new window)
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Python 基础

  • Python 进阶

  • Python爬虫

  • Scrapy 爬虫框架

    • Scrapy 框架核心:深入理解其工作流程
    • Scrapy 入门实战:从零到一构建你的第一个爬虫
      • 一、环境准备与安装
        • 1.1 标准安装
        • 1.2 安装疑难解答 (当标准安装失败时)
      • 二、Scrapy 项目实现流程
      • 三、动手实践:创建一个段子抓取项目
        • 3.1 创建 Scrapy 项目
        • 3.2 创建爬虫 (Spider)
        • 3.3 编写爬虫逻辑 (完善 Spider)
        • 3.4 启动爬虫
      • 四、项目配置与优化 (settings.py)
        • 4.1 伪装 User-Agent
        • 4.2 遵守或忽略 robots.txt
        • 4.3 控制日志级别
        • 4.4 解决特定版本的依赖冲突
      • 五、进阶学习
    • Scrapy核心对象:Response超详细指南
    • Scrapy 核心配置与调试技巧
    • Scrapy Items与Pipeline数据管道
    • Scrapy 图片与文件下载
    • Scrapy 模拟登录与Cookie处理
    • Scrapy CrawlSpider全站爬取
    • Scrapy 中间件:请求与响应的强大控制器
    • Scrapy-Redis:从单机到分布式集群
  • Python
  • Scrapy 爬虫框架
scholar
2025-07-22
目录

Scrapy 入门实战:从零到一构建你的第一个爬虫

# Scrapy 入门实战:从零到一构建你的第一个爬虫

在理解了 Scrapy 的核心工作流程之后,是时候亲自动手,体验一下这个强大框架的魅力了。本教程将带你走过一个完整的 Scrapy 项目创建、编写、运行和配置的全过程。

# 一、环境准备与安装

# 1.1 标准安装

Scrapy 的安装通常很简单,只需要一条 pip 命令。为了提高下载速度,建议使用国内的镜像源。

# 使用清华大学镜像源安装 Scrapy
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy
1
2

安装完成后,可以在终端输入 scrapy version 来验证是否安装成功。如果能正确显示版本号,说明你的环境已经准备就绪。

# 1.2 安装疑难解答 (当标准安装失败时)

在某些 Windows 环境下,由于缺少 C++ 编译环境或特定库的兼容性问题,直接安装 Scrapy 可能会失败,其中最常见的报错来源是 Twisted 库。

如果标准安装失败,请不要灰心,可以按照以下步骤手动安装依赖:

  1. 安装 wheel:这是一个用于处理 Python .whl 格式安装包的工具。

    pip install wheel
    
    1
  2. 下载并安装 Twisted 的预编译包: 访问 UCI 的 Python 库非官方二进制包网站 (opens new window),这是一个非常有用的资源站。 image-20240124115349643 根据你的 Python 版本(如 cp39 代表 Python 3.9)和操作系统(win_amd64 代表 64 位 Windows)下载对应的 Twisted .whl 文件。 下载后,在终端中进入文件所在目录,使用 pip 安装它:

    # 文件名请替换为你自己下载的实际文件名
    pip install Twisted‑21.7.0‑py3‑none‑any.whl
    
    1
    2
  3. 安装 pywin32: 这是一个 Windows 平台下的 Python 扩展。

    pip install pywin32
    
    1
  4. 最后,再次安装 Scrapy:

    pip install scrapy
    
    1

    通过以上步骤,基本可以解决绝大多数在 Windows 上的安装难题。

# 二、Scrapy 项目实现流程

一个标准的 Scrapy 项目开发流程可以归纳为以下四步,我们后续的教程也将围绕这四步展开:

  1. 创建项目: 使用 scrapy startproject <项目名> 创建一个标准化的项目骨架。
  2. 定义数据: 在 items.py 文件中,明确你想要抓取的数据字段。
  3. 编写爬虫: 在 spiders 目录下创建爬虫文件,编写数据提取和 URL 跟进的逻辑。
  4. 处理数据: 在 pipelines.py 文件中,编写数据清洗、验证和持久化存储的逻辑。

# 三、动手实践:创建一个段子抓取项目

# 3.1 创建 Scrapy 项目

首先,在你的工作目录下打开终端,执行以下命令:

# 创建一个名为 "mysider" 的 Scrapy 项目
scrapy startproject myspider
1
2

Scrapy 会自动生成一个名为 myspider 的文件夹,其内部结构如下,每个文件都有其明确的职责:

image-20240124115759710

# 3.2 创建爬虫 (Spider)

进入项目的主目录(包含 scrapy.cfg 的那层),然后使用 genspider 命令生成一个爬虫。

# 首先进入项目目录
cd myspider

# 使用 genspider 命令
# 语法: scrapy genspider <爬虫名字> <允许爬取的域名>
scrapy genspider itcast duanzixing.com
1
2
3
4
5
6

这个命令会在 spiders 目录下创建一个 itcast.py 文件,这是我们接下来要编写主要逻辑的地方。

image-20240124115940166

# 3.3 编写爬虫逻辑 (完善 Spider)

打开 /myspider/spiders/itcast.py 文件,你会看到一个基本的模板。现在,我们来填充它,让它能真正地提取数据。

import scrapy

# 自定义一个 Spider 类,必须继承自 scrapy.Spider
class DuanziSpider(scrapy.Spider):
    # name: 爬虫的唯一标识名,用于在命令行中启动爬虫。
    name = 'itcast'
    
    # allowed_domains: (可选) 允许爬虫抓取的域名范围。
    # 如果后续请求的 URL 超出此范围,将被自动过滤掉。
    allowed_domains = ['duanzixing.com']
    
    # start_urls: 爬虫启动时要抓取的第一个 URL 列表。
    start_urls = ['http://duanzixing.com/']

    # parse 方法是 Scrapy 默认的回调函数。
    # 当 start_urls 中的请求成功返回响应后,此方法会被自动调用。
    # response 参数就是下载器返回的、包含了整个网页内容的响应对象。
    def parse(self, response, **kwargs):
        # response.xpath() 使用 XPath 选择器来定位元素。
        # 这里我们选取所有 class="excerpt" 的 article 标签。
        article_list = response.xpath('//article[@class="excerpt"]')
        
        # 遍历找到的每一个 article 标签
        for article in article_list:
            # .xpath() 的结果是一个 SelectorList 对象。
            # 要获取其中的文本,我们需要继续使用 .xpath('./text()')
            # 这里的 '.' 表示从当前 article 节点下开始查找。
            
            # 使用 .extract_first() 提取第一个匹配的文本内容。
            # 相比 .extract()[0],它更安全,因为即使没找到也不会报错,而是返回 None。
            title = article.xpath('./header/h2/a/text()').extract_first()
            
            # 提取 p 标签下的段子内容
            con = article.xpath('./p[@class="note"]/text()').extract_first()
            
            # 使用 yield 将提取到的数据封装成一个字典,并返回给 Scrapy 引擎。
            # Scrapy 引擎接收到后,会将其传递给 Item Pipeline 进行处理。
            yield {
                'title': title,
                'content': con
            }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# 3.4 启动爬虫

在终端中,确保你仍然在项目的主目录下,执行 crawl 命令:

# 语法: scrapy crawl <爬虫名字>
scrapy crawl itcast
1
2

此时,你会在终端看到大量的日志信息,以及我们通过 yield 返回的数据字典。

image-20250726184901390

# 四、项目配置与优化 (settings.py)

Scrapy 的强大之处在于其高度可配置性。所有的配置项都在 settings.py 文件中。

# 4.1 伪装 User-Agent

为了模拟真实的浏览器,避免被网站轻易识别为爬虫,设置 User-Agent 是最基本的操作。取消 settings.py 中 USER_AGENT 一行的注释,并换成一个常见的浏览器 User-Agent。

# settings.py
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
1
2

# 4.2 遵守或忽略 robots.txt

robots.txt 是网站所有者制定的君子协议,规定了允许哪些爬虫访问哪些页面。Scrapy 默认会遵守这个协议 (ROBOTSTXT_OBEY = True)。在学习阶段或确定不会对目标网站造成负担时,可以将其设置为 False。

# settings.py
ROBOTSTXT_OBEY = False
1
2

# 4.3 控制日志级别

默认情况下,Scrapy 会输出大量的 INFO 级别日志。为了让输出更清爽,只关注核心信息或错误,可以设置日志级别。

# settings.py
# 找到或添加这个配置项
LOG_LEVEL = 'ERROR'  # 只显示错误信息
1
2
3

日志级别从高到低依次为:CRITICAL > ERROR > WARNING > INFO > DEBUG。

# 4.4 解决特定版本的依赖冲突

在某些 Python 或 Scrapy 版本组合下,可能会遇到 OpenSSL 相关的错误,例如 AttributeError: module 'OpenSSL.SSL' has no attribute 'SSLv3_METHOD'。 这通常是 cryptography 和 pyOpenSSL 库版本不兼容导致的。如果遇到,可以尝试降级这两个库来解决:

# 1. 卸载现有版本
pip uninstall cryptography pyOpenSSL

# 2. 安装指定的兼容版本
pip install cryptography==36.0.2 pyOpenSSL==22.0.0
1
2
3
4
5

这是特定时期的解决方案,随着库的更新,未来可能不再需要或需要其他版本组合。

# 五、进阶学习

恭喜你!你已经成功构建并运行了你的第一个 Scrapy 爬虫。

当你准备好深入学习时,我们强烈建议你详细了解 Scrapy 中最核心的 Response 对象,它是你进行数据提取的全部依据。

  • Scrapy 核心对象:Response 超详细指南:深入探索 response.url, response.text, response.body, response.xpath(), response.css() 以及强大的 response.follow() 方法。
编辑此页 (opens new window)
上次更新: 2025/07/27, 04:30:11
Scrapy 框架核心:深入理解其工作流程
Scrapy核心对象:Response超详细指南

← Scrapy 框架核心:深入理解其工作流程 Scrapy核心对象:Response超详细指南→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式