📑 查看全课大纲(第 25 / 101 节)
- 1.数据分析基本概念
- 2.学习数据分析的一般路线
- 3.数据分析的流程
- 4.数据类型
- 5.环境部署(1)
- 6.环境部署(2)
- 7.课程介绍
- 8.TXT文件操作
- 9.JSON文件操作
- 10.CSV文件操作
- 11.Excel文件操作
- 12.数据库及SQL常用语法
- 13.数据库基本操作
- 14.数据库多表连接
- 15.实战:欧洲职业足球数据库分析
- 16.爬虫简介
- 17.URL管理模块
- 18.网页下载模块
- 19.网页解析模块(1)
- 20.网页解析模块(2)
- 21.Scrapy简介
- 22.Scrapy使用步骤(1)
- 23.Scrapy使用步骤(2)
- 24.Scrapy使用步骤(3)
- 25.Scrapy使用步骤(4)
- 26.实战:获取国内城市空气质量指数数据
- 27.NumPy和SciPy介绍
- 28.多维数组
- 29.多维数组操作
- 30.NumPy的常用方法
- 31.向量化介绍
- 32.向量化及通用函数
- 33.实战:2016美国大选分析
- 34.数据结构-Series
- 35.数据结构-DataFrame
- 36.数据结构-Index
- 37.Series的索引操作
- 38.DataFrame的索引操作
- 39.索引操作总结
- 40.运算与对齐
- 41.函数应用操作(1) -- map
- 42.函数应用操作 (2) -- apply applymap
- 43.文件读写操作
- 44.排序操作
- 45.数据清洗--处理缺失数据
- 46.数据清洗--处理重复数据
- 47.数据清洗--替换数据
- 48.常用统计方法(1) -- describe quantile
- 49.常用统计方法(2) -- sum mean median count
- 50.常用统计方法(3) -- max min idxmax idxmin
- 51.常用统计方法(4) -- mad var std cumsum
- 52.实战:全球食品数据分析
- 53.层级索引
- 54.分组与聚合介绍
- 55.分组操作(1) -- GroupBy对象及常用聚合操作
- 56.分组操作(2) -- 自定义分组及聚合操作
- 57.透视表介绍
- 58.透视表操作
- 59.数据规整(1) -- 数据合并concat
- 60.数据规整(2) -- 数据连接merge
- 61.数据重构(3) -- 数据重构stack unstack
- 62.实战:互联网电影资料库分析
- 63.探索性数据分析EDA介绍
- 64.EDA的目的
- 65.EDA常用工具
- 66.Matplotlib绘图基本介绍
- 67.Matplotlib画布
- 68.散点图和柱状图的绘制
- 69.直方图的绘制
- 70.矩阵绘图
- 71.子图的使用
- 72.Matplotlib颜色、标记、线型
- 73.Matplotlib坐标刻度、标签、图例、标题
- 74.Seaborn介绍
- 75.数据集分布可视化(1) -- 单变量分布、双变量分布
- 76.数据集分布可视化(2) -- 变量关系可视化
- 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
- 78.交互式数据可视化工具Bokeh介绍
- 79.Bokeh绘制散点图、柱状图、盒子图、弦图
- 80.Bokeh绘制常用图形元素
- 81.D绘图 -- mplot3d
- 82.D曲线可视化
- 83.D散点图可视化
- 84.D柱状图可视化
- 85.Pandas绘图
- 86.实战:Lending Club借贷数据探索性分析及可视化
- 87.机器学习介绍及应用场景
- 88.机器学习建模介绍 (1) -- 分类
- 89.机器学习建模介绍 (2) -- 回归
- 90.机器学习建模介绍 (3) -- 聚类
- 91.机器学习分类
- 92.机器学习工具scikit-learn
- 93.使用scikit-learn的流程
- 94.数据集准备及划分
- 95.模型选择
- 96.数据预处理及特征工程
- 97.过拟合与欠拟合
- 98.模型调参介绍
- 99.模型调参方法
- 100.模型测试及评价
- 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。
- 导出为 JSON 数组:
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:整个任务消耗的总耗时(秒)。
📝 动手练一练
场景分析题:当你使用
scrapy crawl my_spider -o data.json导出数据并在文本编辑器中打开时,发现里面的中文字符全部变成了类似"\u5317\u4eac"的形式。请问应该在settings.py中添加哪一行关键配置来彻底解决这个问题?👉 点击查看参考答案
参考答案: 在
settings.py中添加以下配置项:FEED_EXPORT_ENCODING = 'utf-8'Scrapy 早期默认导出编码为 ASCII,设置该项为
utf-8后,所有 Unicode 中文字符将直接以原始中文形式保存。命令行实操题:如果某个网站反爬机制非常严格,你希望在运行爬虫时临时将每次请求的下载延时(
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 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问