You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PySpark进行网页抓取并正确读取响应?

用PySpark正确读取网页响应的方法

你的代码核心问题在于spark.read.text()仅支持读取文件路径(本地或分布式存储路径),无法直接传入requests.get()返回的二进制content数据。下面是两种可行的解决思路:

方法1:临时文件中转(适合单网页测试场景)

先将网页内容写入本地临时文件,再让Spark读取该文件:

import requests
from pyspark.sql import SparkSession

# 获取网页内容,添加请求头避免反爬
r = requests.get(
    'https://www.skysports.com/football-scores-fixtures',
    headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
)
# 写入本地临时文件
with open("temp_football_page.html", "w", encoding="utf-8") as f:
    f.write(r.text)

# Spark读取临时文件
spark = SparkSession.builder.getOrCreate()
df = spark.read.text("temp_football_page.html")
# 查看结果
df.show(truncate=False)

方法2:分布式请求(适合批量网页,PySpark原生分布式方式)

直接在Driver端用requests是单节点请求,效率低且易触发反爬。建议用Spark RDD并行化处理,让每个Executor节点单独发起请求:

from pyspark.sql import SparkSession
import requests

def fetch_webpage(url):
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.encoding = "utf-8"
        return (url, response.text)
    except Exception as e:
        return (url, f"请求失败: {str(e)}")

# 初始化Spark环境
spark = SparkSession.builder.getOrCreate()
sc = spark.sparkContext

# 待抓取的URL列表(可扩展为多个URL)
target_urls = ["https://www.skysports.com/football-scores-fixtures"]
# 并行化执行请求并转为DataFrame
page_rdd = sc.parallelize(target_urls).map(fetch_webpage)
df = page_rdd.toDF(["url", "page_content"])

# 查看结果
df.show(truncate=False)

关键注意事项

  • 必须添加User-Agent请求头,避免被网站识别为爬虫封禁IP
  • 批量抓取时建议添加请求延迟(可在fetch_webpage函数中加入time.sleep(1)),减轻目标网站服务器压力
  • 分布式集群环境下,需确保所有Executor节点能正常访问目标网站(网络连通性无限制)

内容的提问来源于stack exchange,提问作者Bahy Mohamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 10:08:13