Selenium ChromeDriver无头模式报NoneType无属性错误且运行慢如何解决
解决方案
问题原因
- 你使用的是旧版Chrome无头模式,UA、浏览器特征和正常模式差异极大,很容易被Costco的反爬策略识别,返回拦截页面而非正常商品内容,导致你要找的a标签不存在,触发
AttributeError。 - 硬等待
time.sleep(0.2)不可靠,且旧无头模式本身性能差,导致运行速度慢。
修复步骤
- 替换旧无头模式为Chrome新版无头模式,性能和正常模式几乎一致,特征也更接近普通浏览器
- 添加反识别参数,隐藏Selenium自动化特征,避免被反爬拦截
- 替换硬等待为显式等待,确保元素加载完成后再解析,同时避免不必要的等待时间提升速度
- 对获取的标签添加非空判断,避免异常报错
- 可选添加禁用图片、不必要插件的参数,进一步提升加载速度
修改后完整代码
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By chrome_options = Options() # 替换为新版无头模式,性能和特征接近普通浏览器 chrome_options.add_argument("--headless=new") chrome_options.add_argument("--window-size=1920,1080") chrome_options.add_argument("--start-maximized") # 反爬相关参数 chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option("useAutomationExtension", False) # 提升速度的可选参数 chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--blink-settings=imagesEnabled=false") # 不需要加载图片可以保留,不需要就删掉这行 # 替换UA,避免默认无头UA被识别 chrome_options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36") driver = webdriver.Chrome(executable_path='/Users/sarathc/Desktop/costco/chromedriver', options=chrome_options) # 隐藏webdriver标识 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" }) def listResponse(url): driver.get(url) # 显式等待目标类别的div加载完成,最多等10秒,加载完成立刻继续 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.category-node.ng-star-inserted")) ) soup = BeautifulSoup(driver.page_source,"html.parser") return soup soup = listResponse("https://www.costco.com.au/Smart-TVs-Audio-Cameras/c/cos_21") cat = soup.find_all("div", {"class": ["category-node ng-star-inserted"]}) for sk in cat: a_tag = sk.find("a") # 非空判断避免报错 if a_tag: print(a_tag.get("href")) # 用完记得关闭driver释放资源 driver.quit()
内容的提问来源于stack exchange,提问作者user16643863
相关产品推荐
相关产品推荐

