使用Python Requests下载NBA球员图片时报错,求助排查问题
解决NBA球员头像下载时的代码错误
嘿,我帮你排查了下代码里的问题,主要有几个关键错误导致第17行报错,咱们一步步解决:
问题分析
- 文件打开模式错误:你用
'w'(文本模式)打开文件来写图片,但图片是二进制数据,文本模式会把二进制内容当成字符串处理,必然会报错。 - URL拼接逻辑错误:NBA官网的图片
src本身已经是带https://的完整链接,你硬加http://会变成http://https://xxx这种无效URL,请求自然失败。 - 浏览器退出方式不正确:
driver.__exit__()不是关闭浏览器的正确方法,应该用官方推荐的driver.quit()。
修正后的完整代码
from selenium import webdriver from bs4 import BeautifulSoup import requests import os # 初始化Chrome浏览器 driver = webdriver.Chrome(executable_path=r'E:/Summer/FirstThings/Web scraping (bucky + pdf)/webscraping/tutorials-master/chromedriver.exe') url = 'https://www.nba.com/players/jaylen/adams/1629121' driver.get(url) # 解析页面源码 soup = BeautifulSoup(driver.page_source, 'lxml') div = soup.find('section', class_='nba-player-header__item nba-player-header__headshot') img = div.find('img') # 处理图片URL,避免重复添加协议头 img_src = img['src'] # 检查URL是否已有合法协议头,没有的话再补全 if not img_src.startswith(('http://', 'https://')): img_src = f'https://{img_src.lstrip("/")}' # 用二进制模式写入图片,同时用with语句自动管理文件 with open('jaylen_adams.jpg', 'wb') as f: # 可选:添加请求头模拟浏览器,避免被反爬拦截 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' } f.write(requests.get(img_src, headers=headers).content) # 正确关闭浏览器进程 driver.quit()
关键修改说明
- 改用
wb模式写入文件:二进制写入模式专门用来处理图片、视频这类非文本数据,彻底解决编码报错问题。 - URL合法性校验:先判断链接是否已有HTTP/HTTPS协议头,避免拼接出无效URL,适配更多场景。
- 使用
with语句管理文件:不用手动调用f.close(),Python会自动帮你关闭文件,避免资源泄漏。 - 添加请求头(可选):模拟真实浏览器请求,降低被网站反爬机制拦截的概率。
driver.quit()关闭浏览器:彻底终止浏览器进程,释放系统资源,这是Selenium的标准退出方式。
内容的提问来源于stack exchange,提问作者haroon khan




