查看全课大纲(第 23 / 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.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  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使用步骤(2)

约 10 分钟

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

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

上一节我们创建了Scrapy工程,本节将进入核心环节——编写并运行第一个爬虫(Spider)。我们将以空气质量指数(AQI)网站为例,演示如何生成Spider模板、修改关键属性,并初步解析网页响应,为后续数据提取打下基础。

💡 核心导读

  • Spider的生成与结构:使用 scrapy genspider 命令生成爬虫模板,理解其基本组成(name、allowed_domains、start_urls)。
  • Spider的运行与调试:通过 scrapy crawl 命令执行爬虫,并初步查看响应对象(response)的类型、状态码和内容。
  • 响应对象的初步探索:了解Scrapy返回的response对象,其结构与常用属性(如status、body)与之前学习的requests库响应对象类似。
  • 工程目录与文件管理:明确Spider文件在Scrapy工程中的位置,以及使用PyCharm等IDE进行编辑的注意事项。

生成第一个Spider

在Scrapy中,Spider是定义如何抓取网站、提取数据的核心类。我们可以使用Scrapy提供的命令行工具快速生成一个Spider模板。

首先,确保你位于上一节创建的工程目录(例如 tutorial2)下,然后运行生成命令:

cd tutorial2
scrapy genspider aqi_spider www.pm25.in

命令说明:

  • scrapy genspider 是生成Spider的命令。
  • aqi_spider 是你为这个爬虫起的名称,后续运行爬虫时会用到。
  • www.pm25.in 是你要爬取的目标网站的域名(起始URL)。

执行成功后,控制台会提示类似“Created spider ‘aqi_spider’ using template ‘basic’ in module”的信息。这意味着在工程的 spiders 目录下,生成了一个名为 aqi_spider.py 的文件。

解读与修改Spider模板

打开生成的 aqi_spider.py 文件,你会看到如下模板代码:

# 这是一个标准的Scrapy Spider模板结构
# 注意:本代码块仅用于展示模板结构,因环境限制(scrapy不在白名单内)无法实际运行。
# 读者在本地安装scrapy后,可参照此结构编写自己的爬虫。

# 文件:tutorial2/spiders/aqi_spider.py
# import scrapy
# 
# class AqiSpiderSpider(scrapy.Spider):
#     name = "aqi_spider"
#     allowed_domains = ["www.pm25.in"]
#     start_urls = ["http://www.pm25.in/"]
# 
#     def parse(self, response):
#         pass

模板结构解析:

  1. 导入模块:import scrapy,导入Scrapy框架。
  2. 定义Spider类:类名默认由你提供的名称加上“Spider”构成(如 AqiSpiderSpider)。这个类继承自 scrapy.Spider。
  3. 关键属性:
    • name:爬虫的唯一标识符,运行爬虫时使用此名称。
    • allowed_domains:允许爬取的域名列表,防止爬虫爬取到其他无关站点。
    • start_urls:爬虫启动时首批请求的URL列表。
  4. parse 方法:这是Spider的核心方法。当Scrapy下载完 start_urls 中的页面后,会自动调用此方法,并将下载得到的响应对象(response)传递进来。我们在此方法中编写解析网页、提取数据的逻辑。

根据视频讲解,我们通常会对模板做两处小修改:

  1. 将类名简化(例如改为 AqiSpider),使其更简洁。
  2. 检查 start_urls 中的协议。原模板可能生成 http://,而现代网站多使用 https://,需要根据实际情况调整。

修改后的类定义大致如下(同样为展示代码):

# 修改后的爬虫类定义(展示用)
# import scrapy
# 
# class AqiSpider(scrapy.Spider):
#     name = "aqi_spider"  # 运行爬虫时使用的名字,必须保持不变
#     allowed_domains = ["www.pm25.in"]
#     start_urls = ["https://www.pm25.in/"]  # 修正为HTTPS协议
# 
#     def parse(self, response):
#         # 网页解析逻辑将在这里编写
#         pass

运行Spider并查看响应

在编写复杂的解析逻辑之前,我们先让爬虫跑起来,看看它能拿到什么。我们在 parse 方法中添加一些简单的调试代码,用于查看 response 对象的基本信息。

由于本课程环境限制(Scrapy不在许可库列表中),我们无法直接运行Scrapy爬虫。但我们可以用Python标准库在内存中模拟一次”请求-响应”,来演示如何解析和查看一个网页响应的信息,其核心思想与Scrapy的 response 对象是相通的。(为保证讲义输出可复现,这里不发起真实网络请求。)

# 用标准库在「内存中」模拟一次 HTTP 请求-响应(不发起真实网络请求,保证输出可复现)
# 真实爬虫中这一步是 urllib.request.urlopen(url),此处用构造的响应字节演示响应对象的构成
import io
from http.client import parse_headers

print("=" * 40)

# 1. 模拟服务器返回的原始响应字节(状态行 + 头部 + 空行 + 正文)
raw_response = (
    b'HTTP/1.1 200 OK\r\n'
    b'Content-Type: text/html; charset=utf-8\r\n'
    b'\r\n'
    b'<html>\n  <head>\n  </head>\n  <body>\n    <h1>Hello, Scrapy</h1>\n  </body>\n</html>'
)

# 2. 拆分「状态行+头部」与「正文」(二者以空行分隔)
head, _, body = raw_response.partition(b'\r\n\r\n')
status_line, _, header_bytes = head.partition(b'\r\n')

# 3. 解析状态行:「HTTP版本 状态码 原因短语」三段
version, status, reason = status_line.decode('ascii').split(' ', 2)

# 4. 解析响应头(类比真实响应对象的 headers)
headers = parse_headers(io.BytesIO(header_bytes))

# 5. 查看响应的关键属性(类比 Scrapy 的 response)
print(f"HTTP版本: {version}")
print(f"状态码: {status}")
print(f"状态信息: {reason}")
print(f"响应头 Content-Type: {headers.get('Content-Type')}")
print("=" * 40)

# 6. 读取响应体(网页内容的前200个字符)
html_content = body.decode('utf-8')
print("响应体(HTML内容)前200字符:")
print(html_content[:200])
print("=" * 40)
========================================
HTTP版本: HTTP/1.1
状态码: 200
状态信息: OK
响应头 Content-Type: text/html; charset=utf-8
========================================
响应体(HTML内容)前200字符:
<html>
  <head>
  </head>
  <body>
    <h1>Hello, Scrapy</h1>
  </body>
</html>
========================================

代码解读与Scrapy类比:

  • 真实的 urllib.request.urlopen 返回的 response 对象,类似于Scrapy Spider中 parse 方法接收到的 response 参数;这里我们用内存中构造的响应字节来还原它的构成。
  • 状态码字段(如200表示成功)对应Scrapy中 response.status。(注意:Scrapy 的 Response 对象没有 reason 属性——“原因短语”是 urllib/requests 的响应对象才有的概念,在 Scrapy 中判断请求结果看 response.status 即可。)
  • 响应头(headers)对应 response.headers;正文解码后得到的HTML字符串,在Scrapy中可通过 response.body 获取字节内容,或直接使用 response.text 获取解码后的文本。
  • 这个简单的示例演示了”请求-响应”的基本流程。在Scrapy中,框架会自动处理请求调度、并发、去重等复杂任务,我们只需在 parse 方法中专注于对 response 进行解析。

Scrapy爬虫执行流程回顾

虽然我们无法在当前环境运行Scrapy,但结合视频讲解,其完整执行流程如下:

  1. 命令启动:在项目根目录执行 scrapy crawl aqi_spider。
  2. 框架工作:Scrapy引擎根据 start_urls 创建初始请求,下载网页。
  3. 回调解析:下载完成后,引擎将响应传递给 AqiSpider 类的 parse 方法。
  4. 数据提取:在 parse 方法中,我们使用选择器(如XPath或CSS)从 response 中提取目标数据,并可能生成新的请求(用于翻页或爬取详情页)。
  5. 结果处理:提取的数据(Item)被发送到Item Pipeline进行后续清洗、验证和存储。

📝 动手练一练

  1. 概念辨析:Scrapy Spider中的 parse 方法是必须的吗?它的主要参数 response 包含了哪些关键信息?
  2. 动手模拟:把上面模拟响应中的状态行从 HTTP/1.1 200 OK 改为 HTTP/1.1 404 Not Found,重新运行。观察状态码和状态信息发生了什么变化?这模拟了爬虫过程中可能遇到的哪种常见情况?
👉 点击查看参考答案
  1. parse 方法:对于从 start_urls 发起的请求,其默认的回调函数就是 parse 方法,因此通常是必须的。response 对象关键信息包括:

    • response.url: 当前响应对应的URL。
    • response.status: HTTP状态码(如200、404、500)。
    • response.headers: 响应头信息。
    • response.body: 响应的原始字节内容。
    • response.text: 解码后的文本内容(通常为HTML)。
    • response.css() / response.xpath(): 用于从HTML中提取数据的选择器方法。
  2. 模拟请求:把状态行改为 HTTP/1.1 404 Not Found 后,输出将类似于:

    ========================================
    HTTP版本: HTTP/1.1
    状态码: 404
    状态信息: Not Found
    ========================================

    这模拟了爬虫在抓取过程中遇到的“页面不存在”(404 Not Found)情况。在实际爬虫开发中,我们需要在代码中处理各种非200状态码,以确保程序的健壮性。

本章小结

本节我们深入到了Scrapy爬虫开发的核心——Spider。我们学习了如何使用命令行工具生成Spider模板,理解了其基本结构(name, allowed_domains, start_urls, parse方法),并通过Python标准库模拟了网络请求与响应的过程,以此类比Scrapy中 response 对象的作用。虽然受环境限制未能直接运行Scrapy,但我们已经掌握了其核心概念和执行流程。

📋 行动清单

  • 在本地已配置Scrapy的环境中,尝试运行 scrapy genspider 命令,生成一个属于你自己的爬虫模板。
  • 打开生成的 .py 文件,对照讲义,熟悉Spider类的结构和各个属性的含义。
  • 使用 urllib 或 requests 库(如果已安装)编写一个简单的脚本,请求一个网页并打印其状态码和部分内容,巩固“请求-响应”模型的理解。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:Scrapy使用步骤(2)
    PDF · 182KB
    下载
  • 全套课件打包(第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 数据库
    下载