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

使用BeautifulSoup循环遍历可变URL提取HREF标签的问题排查

代码存在的核心问题

你的代码有4个逻辑硬伤,和URL是否返回404无直接关系,逐个列明:

  • 缩进错误导致URL生成逻辑完全失效:Python是缩进敏感语言,只有缩进在循环代码块下的语句才会被循环执行。你写的for tag in range(0, 50000)循环里,只做了resp变量的重复赋值,没有把每次生成的URL存入列表。循环结束后resp只会保留最后一次生成的URL(也就是id=49999的链接),你定义的urls列表从头到尾只有1个元素,根本没有遍历5万个链接。
  • 无任何请求异常/状态码处理:requests.get默认不会自动跳过404、连接超时、被反爬拦截的请求,只要请求返回非200状态,后续解析页面的代码直接运行就会报错中断。
  • 解析元素无判空逻辑:遇到404页面时,页面里根本不存在class="profile-box"的div,直接对soup.find()的返回值调用.select()会触发NoneType对象无对应属性的报错,直接终止程序。
  • 最终打印逻辑变量用错:最后遍历profiles列表打印时,你判断的变量是p,打印的却是循环外残留的profile变量;同时tag是URL生成循环结束后的最后一个值,根本对应当前遍历的链接ID,输出结果完全错乱。
修正后可运行代码
import requests
from bs4 import BeautifulSoup
import time

# 加常规浏览器请求头,避免被网站反爬机制直接拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
profiles = []

# 直接在生成URL的循环里做请求和解析,无需单独定义urls列表存储
for tag in range(1, 50000):
    url = f"https://basketball.realgm.com/player/Carmelo-Anthony/Summary/{tag}"
    try:
        # 设置10秒超时,避免异常请求卡死整个程序
        req = requests.get(url, headers=headers, timeout=10)
        # 状态码不是200直接跳过当前链接
        if req.status_code != 200:
            print(f"链接ID:{tag} 返回状态码{req.status_code}, 跳过")
            continue
        soup = BeautifulSoup(req.text, 'html.parser')
        # 先查找profile-box元素,找不到直接跳过当前页
        profile_box = soup.find('div', class_="profile-box")
        if not profile_box:
            print(f"链接ID:{tag} 无球员信息模块, 跳过")
            continue
        # 提取对应a标签的href
        for profile_link in profile_box.select('.half-column-left > p > a'):
            href = profile_link.get('href')
            if href: # 过滤空href的异常情况
                profiles.append(href)
                if href.startswith('https'):
                    # 打印当前tag和对应链接,注意变量匹配
                    print(tag, href)
        # 加0.5秒请求间隔,避免请求太频繁被封IP
        time.sleep(0.5)
    except Exception as e:
        # 捕获所有请求、解析阶段的异常,打印日志后跳过不中断整体任务
        print(f"处理链接ID:{tag} 出错: {str(e)}, 跳过")
        continue

# 如需持久化存储结果,可取消下方注释
# with open("player_profiles.txt", "w", encoding="utf-8") as f:
#     for p in profiles:
#         f.write(p + "\n")
额外说明

你之前测试range(0,7)能跑是纯巧合:id从0到7的链接里只有id=8是404,循环到8的时候刚好触发解析报错,让你误以为是id=8这个特殊链接的问题,本质是代码本身没有容错机制,遇到任何异常页面都会直接终止。
爬取量级到5万时一定要加请求间隔、合法请求头,有条件可以搭配代理池,否则很容易被网站封禁IP导致所有请求失败。

内容的提问来源于stack exchange,提问作者Anthony Madle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:12:27