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

