← 返回《Python 数据分析实战》
📑 查看全课大纲(第 25 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.D绘图 -- mplot3d
  82. 82.D曲线可视化
  83. 83.D散点图可视化
  84. 84.D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

Scrapy使用步骤(4)

约 10 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

Scrapy 使用步骤(4):命令行执行调度、全局配置优化与多格式导出精讲

小象实战讲义 · Python数据分析实战

在完成了工程创建(Step 1)、Item 模型定义(Step 2)、Spider 爬虫主体编写(Step 3)以及 Item Pipeline 管道编排(Step 4)之后,我们便来到了 Scrapy 工业开发流水线的最后一步——爬虫的启动运行、命令行参数调优与全局设置优化(Step 5)。在真实生产环境中,如何高效触发爬虫任务?如何通过命令行快速将结果导出为 JSON/CSV?如何调优并发数、设置下载延时以避免被目标网站封禁?如何解决导出 JSON 中文变成 \u4eac\u534e Unicode 字符的问题?本节我们将系统攻克 Scrapy 的运行控制与配置优化全景。

💡 核心导读

  • Scrapy 核心启动命令全解
    • scrapy crawl <spider_name>:标准启动指令;
    • scrapy list:列出当前工程中所有可用的爬虫。
  • Feed Exports 命令行极速多格式导出
    • 导出为 JSON 数组:-o results.json
    • 导出为 CSV 表格:-o results.csv
    • 导出为 JSON Lines 流式文件:-o results.jl
  • settings.py 关键核心配置与生产调优
    • ROBOTSTXT_OBEY:Robots 协议遵从开关;
    • CONCURRENT_REQUESTS:全局异步并发请求数调优;
    • DOWNLOAD_DELAY:下载延时与防封策略;
    • DEFAULT_REQUEST_HEADERS:全局通用 User-Agent 伪装;
    • FEED_EXPORT_ENCODING = 'utf-8':彻底消除 JSON 中文 Unicode 转义乱码。
  • 命令行动态参数注入(-s / -a)与终端统计报表(Stats)解读

1. Scrapy 命令行触发与 Feed Exports 导出参数

除了编写自定义的 Pipeline 写入文件之外,Scrapy 还内置了非常强大的 Feed Exports(数据源导出器),无需编写任何额外的 Pipeline 代码,仅凭命令行参数就能自动将所有由 Spider yield 的 Item 导出为多种格式:

┌─────────────────────────────────────────────────────────────┐
│                 Scrapy 常用命令行指令速查表                  │
├────────────────────────────────┬────────────────────────────┤
│ 命令格式                       │ 功能说明                   │
├────────────────────────────────┼────────────────────────────┤
│ scrapy list                    │ 列出当前工程内的所有 Spider│
│ scrapy crawl aqi_spider        │ 启动名为 aqi_spider 的爬虫 │
│ scrapy crawl aqi_spider -o a.json | 自动将产出 Item 保存为 JSON │
│ scrapy crawl aqi_spider -o a.csv  | 自动将产出 Item 保存为 CSV  │
│ scrapy crawl aqi_spider -O a.csv  | 大写 -O 表示覆盖已有文件   │
│ scrapy crawl aqi_spider -s LOG_LEVEL=WARNING | 仅打印警告与错误日志│
└────────────────────────────────┴────────────────────────────┘

2. settings.py 全局配置中枢深度解析

settings.py 是控制整个 Scrapy 引擎行为的参数大脑。以下是工业级爬虫必须掌握的几项核心配置项:

# 示例 1:settings.py 核心生产配置清单

# 1. 爬虫项目名称
BOT_NAME = "aqi_proj"
SPIDER_MODULES = ["aqi_proj.spiders"]
NEWSPIDER_MODULE = "aqi_proj.spiders"

# 2. Robots 协议遵守开关 (学习或特定需求下可设置为 False)
ROBOTSTXT_OBEY = False

# 3. 最大并发请求数 (默认 16,根据服务器带宽与反爬策略合理调整)
CONCURRENT_REQUESTS = 16

# 4. 下载延时 (秒),每次请求之间随机休眠,保护目标服务器并防止被封 IP
DOWNLOAD_DELAY = 1.0
# 开启随机延时扰动 (0.5 * DOWNLOAD_DELAY 到 1.5 * DOWNLOAD_DELAY)
RANDOMIZE_DOWNLOAD_DELAY = True

# 5. 默认请求头伪装 (伪装主流 Chrome 浏览器)
DEFAULT_REQUEST_HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
}

# 6. 激活 Item Pipeline 管道并设置优先级权重
ITEM_PIPELINES = {
    "aqi_proj.pipelines.AqiCleanPipeline": 300,
    "aqi_proj.pipelines.CsvExportPipeline": 500,
}

# 7. 解决导出的 JSON 中文显示为 \uXXXX 字符的痛点配置
FEED_EXPORT_ENCODING = "utf-8"

# 8. 日志级别 (CRITICAL, ERROR, WARNING, INFO, DEBUG)
LOG_LEVEL = "INFO"

3. Python 代码实战:在 Python 脚本中通过 CrawlerProcess 编程式启动 Scrapy

在实际开发中,我们除了可以在命令行中敲 scrapy crawl 之外,还可以通过编写 Python 脚本,使用 Scrapy 内置的 CrawlerProcess 类以代码方式直接启动爬虫,便于与自动化脚本或定时任务(Cron)集成:

# 示例 2:使用 CrawlerProcess 在 Python 脚本中编程式运行爬虫

import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
import json
import os

# 1. 定义测试用 Spider
class StandaloneAqiSpider(scrapy.Spider):
    name = "standalone_aqi"
    
    # 模拟直接爬取
    def start_requests(self):
        # 模拟 3 个城市测试数据
        sample_urls = [
            "https://httpbin.org/anything?city=beijing&aqi=35&level=优",
            "https://httpbin.org/anything?city=shanghai&aqi=62&level=良",
            "https://httpbin.org/anything?city=guangzhou&aqi=48&level=优"
        ]
        for url in sample_urls:
            yield scrapy.Request(url, callback=self.parse)
            
    def parse(self, response):
        data = response.json().get("args", {})
        item = {
            "city_name": data.get("city"),
            "aqi": int(data.get("aqi", 0)),
            "quality_level": data.get("level")
        }
        self.logger.info(f"✅ [Spider] 成功解析到城市数据: {item}")
        yield item

print("=== 1. 使用 CrawlerProcess 编程式配置并启动 Scrapy ===")

# 2. 编程式加载并自定义设置
custom_settings = {
    "LOG_LEVEL": "WARNING",              # 过滤嘈杂的 Debug 日志
    "FEED_FORMAT": "json",               # 自动导出为 JSON
    "FEED_URI": "standalone_output.json",# 输出文件路径
    "FEED_EXPORT_ENCODING": "utf-8"      # 确保中文不转义
}

process = CrawlerProcess(settings=custom_settings)
process.crawl(StandaloneAqiSpider)

print("🚀 爬虫进程启动中...")
process.start() # 启动 Twisted 事件循环,该方法会阻塞直到全部爬取任务结束
print("🏁 爬虫进程已正常退出!")

# 3. 回读验证生成的 JSON 文件
if os.path.exists("standalone_output.json"):
    with open("standalone_output.json", "r", encoding="utf-8") as f:
        res_json = json.load(f)
    print("\n=== 2. 导出成果回读验证 (中文正常显示) ===")
    print(json.dumps(res_json, ensure_ascii=False, indent=2))
    os.remove("standalone_output.json")

4. Scrapy 终端统计报表(Stats)解读指南

当 Scrapy 爬取结束时,控制台最后会打印出一大段统计字典(statscollectors)。读懂这些指标对于评估爬虫健康度至关重要:

  • downloader/request_count:下载器发出的总请求次数;
  • downloader/response_count:成功接收到的总响应次数;
  • downloader/response_status_count/200:返回 200 正常状态码的请求数;
  • item_scraped_count最关键指标,表示整个爬取过程中成功提取并流经 Pipeline 的有效 Item 总数量;
  • item_dropped_count:被 Pipeline 的 DropItem 丢弃的不合格记录数;
  • elapsed_time_seconds:整个任务消耗的总耗时(秒)。

📝 动手练一练

  1. 场景分析题:当你使用 scrapy crawl my_spider -o data.json 导出数据并在文本编辑器中打开时,发现里面的中文字符全部变成了类似 "\u5317\u4eac" 的形式。请问应该在 settings.py 中添加哪一行关键配置来彻底解决这个问题?

    👉 点击查看参考答案

    参考答案: 在 settings.py 中添加以下配置项:

    FEED_EXPORT_ENCODING = 'utf-8'

    Scrapy 早期默认导出编码为 ASCII,设置该项为 utf-8 后,所有 Unicode 中文字符将直接以原始中文形式保存。

  2. 命令行实操题:如果某个网站反爬机制非常严格,你希望在运行爬虫时临时将每次请求的下载延时(DOWNLOAD_DELAY)调大到 3 秒,并将日志级别临时设为 INFO,如何在不修改 settings.py 源码的前提下通过命令行快速实现?

    👉 点击查看参考答案

    参考答案: 使用命令行 -s--set)参数动态覆盖配置项:

    scrapy crawl aqi_spider -s DOWNLOAD_DELAY=3 -s LOG_LEVEL=INFO

本章小结

在本节中,我们全面打通了 Scrapy 工业级开发的最后一环:

  • 熟练运用 scrapy crawl 指令以及 -o / -O 多格式 Feed Exports 快速导出数据;
  • 深入掌握了 settings.py 中关于并发、延迟防封、请求头伪装与编码的核心配置技巧;
  • 掌握了使用 CrawlerProcess 在 Python 脚本中编程式调度运行爬虫的方法;
  • 具备了阅读 Scrapy 终端统计报表(Stats)并评估爬取效率与质量的能力。

📋 行动清单

  • 理解 Scrapy 从创建到执行的完整 5 步流水线;
  • 做好准备,进入下一小节的第 3 章综合大实战——《实战:获取国内城市空气质量指数数据》!

—— 小象教研组

配套学习资源与课件
  • 本节课件:Scrapy使用步骤(4)(PDF · 218KB)
    下载
  • 全套课件打包(第1-5章)(ZIP · 12.8MB)
    下载
  • 全套课件打包(第6-8章)(ZIP · 15MB)
    下载
  • 实战数据集:AppleStore 应用商城分析(ZIP · 329KB)
    下载
  • 实战数据集:女性服装电商分析(ZIP · 2.8MB)
    下载
  • Python 数据分析环境搭建指南(PDF · 2MB)
    下载
  • Scrapy 安装教程(PDF · 12.7MB)
    下载
  • 附加实战项目:AppleStore 应用商城数据分析(ZIP · 0.3MB · ipynb + CSV 数据)
    下载
  • 附加实战项目:银行电话营销数据分析(ZIP · 0.4MB · ipynb + CSV 数据)
    下载
  • 附加实战项目:女性服装电商评论数据分析(ZIP · 2.7MB · ipynb + CSV 数据)
    下载
  • 附加实战项目:美国化学学会杂志数据分析(ZIP · 34.2MB · ipynb + SQLite 数据库)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问