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

如何优化BeautifulSoup爬虫代码 实现整洁高效的批量数据爬取

代码整洁化&批量爬取优化方案

你原代码的核心问题是重复编写了完全相同的请求、解析逻辑,手动为每个字母页定义独立变量,扩展性极差,只要做逻辑抽取+循环遍历就能大幅精简代码,同时支持批量爬取多院校、全字母页面的需求。

核心优化思路

  • 将重复的页面请求、HTML解析逻辑抽为可复用的公共函数,消除冗余代码
  • 自动生成a-z全字母的页面URL,无需手动逐个定义链接变量
  • 将目标爬取院校整理为列表配置,支持任意数量院校的批量爬取,无需修改核心逻辑
  • 增加基础的请求异常捕获、请求间隔,避免爬取失败或访问频率过高被拦截
  • 用结构化字典存储爬取结果,替代零散的独立变量,方便后续数据处理

优化后可直接复用的代码

import time
import requests
from bs4 import BeautifulSoup

# 基础配置 按需修改即可
BASE_PLAYER_URL = "https://www.basketball-reference.com/players/{}/"
# 把你需要爬取的30所院校全部加到这个列表里即可
TARGET_COLLEGES = [
    "Kentucky",
    "Duke",
    "UCLA",
    "North Carolina",
    "Kansas"
]
# 自动生成a-z所有字母 覆盖所有球员索引页
PAGE_LETTERS = [chr(ord('a') + i) for i in range(26)]
# 请求间隔 单位秒 避免请求过频被封
REQUEST_DELAY = 1.5


def get_college_matches(letter: str, college_name: str):
    """爬取指定字母索引页中,匹配目标院校的所有内容"""
    url = BASE_PLAYER_URL.format(letter)
    try:
        resp = requests.get(url, timeout=10)
        resp.raise_for_status()
        soup = BeautifulSoup(resp.text, "lxml")
        return soup.find_all(string=college_name)
    except Exception as e:
        print(f"爬取{letter}页面、院校{college_name}数据失败: {str(e)}")
        return []


if __name__ == "__main__":
    # 结构化存储结果 格式: {院校名: {字母页: 匹配结果}}
    all_result = {}
    for college in TARGET_COLLEGES:
        all_result[college] = {}
        for letter in PAGE_LETTERS:
            match_res = get_college_matches(letter, college)
            all_result[college][letter] = match_res
            print(f"完成{college}院校{letter}页面爬取,匹配到{len(match_res)}条结果")
            time.sleep(REQUEST_DELAY)

    # 按需输出结果 比如输出Kentucky院校a页的结果
    # print(all_result["Kentucky"]["a"])

额外注意事项

  • 当前代码中find_all(string=xxx)只会返回匹配到的院校文本本身,如果需要关联提取对应球员的姓名、生涯数据等信息,可以进一步定位匹配文本的父级标签,抽取关联字段即可
  • 爬取时请控制请求频率,遵守目标站点的访问规则,不要对站点服务造成压力
  • 如果后续爬取数据量增大,可以考虑增加随机请求头、失败重试逻辑进一步提升稳定性

内容的提问来源于stack exchange,提问作者Morman D Singles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:15:39