如何使用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
相关产品推荐
相关产品推荐

