
本文讲解如何在 PySpark 环境中正确抓取网页并加载 HTML 响应为 DataFrame,重点解决 requests 响应内容无法直接传入 spark.read.text() 的常见错误,并提供可运行的转换方案。
本文讲解如何在 pyspark 环境中正确抓取网页并加载 html 响应为 dataframe,重点解决 `requests` 响应内容无法直接传入 `spark.read.text()` 的常见错误,并提供可运行的转换方案。
在 PySpark 中进行网页抓取时,一个典型误区是试图将 requests.Response.content(二进制字节流)或 r.text(字符串)直接传给 spark.read.text()——该方法仅接受本地/远程文件路径(如 "hdfs://..." 或 "./page.html")或 RDD,不支持原始字符串或字节对象。
正确的做法是:先用 requests 获取页面内容,再通过 SparkContext 将其构造成分布式 RDD,最后转为 DataFrame。以下是推荐实现:
import requests
from pyspark.sql import SparkSession
# 初始化 SparkSession
spark = SparkSession.builder \
.appName("WebScrapingWithPySpark") \
.getOrCreate()
# 发起 HTTP 请求获取 HTML 文本
response = requests.get('https://www.skysports.com/football-scores-fixtures')
response.raise_for_status() # 确保请求成功
# 将 HTML 字符串封装为单元素列表,并并行化为 RDD
html_rdd = spark.sparkContext.parallelize([response.text])
# 创建 DataFrame:指定 schema 为单列字符串类型
df = spark.createDataFrame(html_rdd, "string").toDF("html_content")
# 查看结果(注意:实际网页较大,建议 truncate=False 仅用于调试)
df.show(truncate=False)✅ 关键要点说明:
-
spark.sparkContext.parallelize([...])是将本地数据(如字符串、列表)注入 Spark 分布式环境的标准方式; - 使用
createDataFrame(rdd, schema)比read.text()更灵活,适用于动态生成的内容; - 若需进一步解析 HTML(如提取赛程表格),可在后续使用
pandas_udf或mapInPandas(Spark 3.3+)结合BeautifulSoup/lxml处理,切勿在 driver 端直接解析整个 HTML 字符串后再分发——这会丧失分布式优势。
⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- 此方案适用于小规模抓取(如单页分析)。若需大规模爬虫(如百万级 URL),应改用专用爬虫框架(Scrapy + Spark 输出)或在 executor 端分布式发起请求(配合
foreachPartition+requests); - 目标网站可能有反爬机制(如 User-Agent 限制、JavaScript 渲染),此时需添加 headers 或切换至
selenium/playwright驱动; - 生产环境中务必添加异常处理、请求延迟、重试机制及 robots.txt 合规检查。
综上,PySpark 本身不是爬虫工具,而是强大的分布式数据处理引擎。与其“用 PySpark 抓网页”,不如“用 requests 抓取 → PySpark 处理”,二者各司其职,方能兼顾效率与可维护性。



















