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

