VPS服务器上Selenium无法定位元素的问题求助
Selenium脚本本地正常,VPS部署后出现NoSuchElementException的解决方法
问题描述
本地运行Selenium解析脚本完全正常,但部署到VPS服务器时抛出NoSuchElementException,无法定位.no-skins和.market_item元素。以下是相关代码及报错信息:
脚本代码
def csgo_registration(): options = webdriver.ChromeOptions() # options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument('--disable-dev-shm-usage') options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument(f"user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) " f"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) driver.get("https://lis-skins.ru/market/csgo/") load_cookies(driver, "cookies.txt") time.sleep(3) driver.refresh() time.sleep(3) return driver def csgo_checker(driver, link, wait): driver.get(link) time.sleep(3) try: print(5) print(5) print(5) no_skins_elem = driver.find_element(by=By.CLASS_NAME, value="no-skins") print("Nothing here") return None except NoSuchElementException: desired_skin_elem = driver.find_element(by=By.CLASS_NAME, value="market_item") link_to_buy = desired_skin_elem.find_element(by=By.TAG_NAME, value="a").get_attribute("href") good_naming = desired_skin_elem.find_element(by=By.CLASS_NAME, value="name-inner").text good_price = desired_skin_elem.find_element(by=By.CLASS_NAME, value="price").text.split("cls")[0][:-1] good_float = desired_skin_elem.find_elements(by=By.CLASS_NAME, value="info-item")[-1].text print(good_price) driver.get(link_to_buy) time.sleep(3) buy_now_btn = wait.until(ec.element_to_be_clickable((By.CLASS_NAME, "buy-now-button"))) buy_now_btn.click() time.sleep(2) try: buy_now_popup_btn = wait.until(ec.element_to_be_clickable((By.CLASS_NAME, "buy-now-popup-bottom-button"))) buy_now_popup_btn.click() message = f"Куплено успешно!\nНазвание: {good_naming}\nЦена: {good_price}₽\nФлот: {good_float}" return [message, link_to_buy] except TimeoutException: message = "Недостаточно средств!" return [message, link_to_buy]
VPS报错信息
ERROR:asyncio:Task exception was never retrieved future: <Task finished name='Task-9' coro=<Dispatcher._process_polling_updates() done, defined at /usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/dispatcher.py:407> exception=NoSuchElementException()> Traceback (most recent call last): File "main.py", line 75, in csgo_checker no_skins_elem = driver.find_element(by=By.CLASS_NAME, value="no-skins") File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 740, in find_element return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 346, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".no-skins"} (Session info: headless chrome=114.0.5735.198); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception Stacktrace: #0 0x560f46c9d4e3 <unknown> #1 0x560f469ccc76 <unknown> #2 0x560f46a08c96 <unknown> #3 0x560f46a08dc1 <unknown> #4 0x560f46a427f4 <unknown> #5 0x560f46a2803d <unknown> #6 0x560f46a4030e <unknown> #7 0x560f46a27de3 <unknown> #8 0x560f469fd2dd <unknown> #9 0x560f469fe34e <unknown> #10 0x560f46c5d3e4 <unknown> #11 0x560f46c613d7 <unknown> #12 0x560f46c6bb20 <unknown> #13 0x560f46c62023 <unknown> #14 0x560f46c301aa <unknown> #15 0x560f46c866b8 <unknown> #16 0x560f46c86847 <unknown> #17 0x560f46c96243 <unknown> #18 0x7f3d468bb609 start_thread During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/dispatcher.py", line 415, in _process_polling_updates for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)): File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/dispatcher.py", line 235, in process_updates return await asyncio.gather(*tasks) File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/handler.py", line 117, in notify response = await handler_obj.handler(*args, **partial_data) File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/dispatcher.py", line 256, in process_update return await self.message_handlers.notify(update.message) File "/usr/local/lib/python3.8/dist-packages/aiogram/dispatcher/handler.py", line 117, in notify response = await handler_obj.handler(*args, **partial_data) File "main.py", line 132, in send_welcome answer = csgo_checker(driver, link, wait) File "main.py", line 80, in csgo_checker desired_skin_elem = driver.find_element(by=By.CLASS_NAME, value="market_item") File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 740, in find_element return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 346, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".market_item"} (Session info: headless chrome=114.0.5735.198); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception Stacktrace: #0 0x560f46c9d4e3 <unknown> #1 0x560f469ccc76 <unknown> #2 0x560f46a08c96 <unknown> #3 0x560f46a08dc1 <unknown> #4 0x560f46a427f4 <unknown> #5 0x560f46a2803d <unknown> #6 0x560f46a4030e <unknown> #7 0x560f46a27de3 <unknown> #8 0x560f469fd2dd <unknown> #9 0x560f469fe34e <unknown> #10 0x560f46c5d3e4 <unknown> #11 0x560f46c613d7 <unknown> #12 0x560f46c6bb20 <unknown> #13 0x560f46c62023 <unknown> #14 0x560f46c301aa <unknown> #15 0x560f46c866b8 <unknown> #16 0x560f46c86847 <unknown> #17 0x560f46c96243 <unknown> #18 0x7f3d468bb609 start_thread
解决方法
1. 修复无头模式配置
从报错信息看,VPS实际是用无头模式运行的,但代码中注释了--headless参数。无头模式下必须配置窗口尺寸,否则页面渲染会异常:
options.add_argument("--headless=new") # 使用新版无头模式,更接近正常浏览器行为 options.add_argument("--window-size=1920,1080") # 设置标准桌面窗口尺寸
2. 替换固定等待为显式等待
time.sleep()是固定时长等待,VPS的网络或性能波动会导致页面未加载完成就查找元素。全部替换为显式等待:
# 替换driver.get(link)后的time.sleep(3) wait.until(ec.presence_of_element_located((By.TAG_NAME, "body"))) # 查找元素时用显式等待替代直接find_element try: no_skins_elem = wait.until(ec.presence_of_element_located((By.CLASS_NAME, "no-skins"))) print("Nothing here") return None except TimeoutException: desired_skin_elem = wait.until(ec.presence_of_element_located((By.CLASS_NAME, "market_item")))
3. 验证Cookie有效性
本地生成的cookies.txt可能包含与本地IP、会话绑定的信息,传到VPS后会失效。建议在VPS上重新登录网站,生成新的cookies文件替换原文件。
4. 排查反爬拦截
VPS的IP可能被网站标记为爬虫,导致页面返回异常内容(如验证码页、空白页)。可以在获取页面后截图排查:
driver.save_screenshot("vps_page.png") # 运行后查看截图,确认页面是否正常加载
如果遭遇反爬,添加更多模拟浏览器的参数:
options.add_argument("--disable-extensions") options.add_argument("--disable-gpu") options.add_argument("--start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False)
5. 确保Chrome与驱动版本匹配
虽然使用了ChromeDriverManager,但VPS上的Chrome版本可能与本地不一致,导致兼容性问题。可以手动指定驱动版本:
driver = webdriver.Chrome(service=Service(ChromeDriverManager(version="114.0.5735.90").install()), options=options)
内容的提问来源于stack exchange,提问作者Lam Thuyi
相关产品推荐
相关产品推荐

