Пытаюсь запарсить звание с csstats.gg, гет запрос блокирует, поэтому юзаю селениум, но при этом все равно он мне ебет мозгу и не дает вытащить мне данные. Может кто обладает информацией как можно правильно направить запрос? или откуда вообще можно спарсить рейтинг
FTPB, используй playwright , приятная дока, ты так же вместо sleep можешь использовать состояния, для ожидания загрузки страницы
Ты на верном пути, но сайт csstats.gg (как и многие современные сайты) может использовать JavaScript-рендеринг, динамическую подгрузку данных, Cloudflare защиту и прочие трюки, которые ломают простые подходы. Вот что может идти не так и как это исправить: from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium import webdriver import time url = "https://csstats.gg/player/STEAM_ID" # укажи нужный URL options = Options() options.add_argument("--headless=new") options.add_argument("--disable-gpu") options.add_argument("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") driver = webdriver.Chrome(options=options) driver.get(url) time.sleep(5) # увеличь время, если сайт грузится дольше # Попробуй вывести всю страницу — вдруг нужные данные ещё не прогрузились print(driver.page_source) Python from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium import webdriver import time url = "https://csstats.gg/player/STEAM_ID" # укажи нужный URL options = Options() options.add_argument("--headless=new") options.add_argument("--disable-gpu") options.add_argument("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") driver = webdriver.Chrome(options=options) driver.get(url) time.sleep(5) # увеличь время, если сайт грузится дольше # Попробуй вывести всю страницу — вдруг нужные данные ещё не прогрузились print(driver.page_source) Что проверить и сделать: 1. Добавь заголовки (headers) в запрос браузера Selenium не использует обычные HTTP-заголовки, поэтому сайт может блокировать запрос. Попробуй задать user-agent: --- Сообщение объединено с предыдущим 4 июн 2025 в 04:28 2. Убедись, что элемент точно появился Если find_element не находит элемент — возможно, он еще не прогрузился. Используй WebDriverWait: from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) rank_elem = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, ".ranks .over .rank .cs2rating")) ) span = rank_elem.find_element(By.TAG_NAME, "span") value = span.text.strip() print(value) Python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) rank_elem = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, ".ranks .over .rank .cs2rating")) ) span = rank_elem.find_element(By.TAG_NAME, "span") value = span.text.strip() print(value) --- Сообщение объединено с предыдущим 4 июн 2025 в 04:29 Сайт может использовать защиту от ботов (Cloudflare, Anti-bot JS) Если после запуска даже не подгружается HTML (в driver.page_source — заглушка), тебе может помочь: Использовать Selenium Stealth: from selenium_stealth import stealth stealth(driver, languages=["en-US", "en"], vendor="Google Inc.", platform="Win32", webgl_vendor="Intel Inc.", renderer="Intel Iris OpenGL Engine", fix_hairline=True, ) Python from selenium_stealth import stealth stealth(driver, languages=["en-US", "en"], vendor="Google Inc.", platform="Win32", webgl_vendor="Intel Inc.", renderer="Intel Iris OpenGL Engine", fix_hairline=True, )
Решений до жопы, через чистый селениум делать кринж. Выбери один ниже, глянь референсы и со спокойной душой парси через бс4 flaresolverr Ресурсы кушает, т.к на селениуме работает cloudscraper Через requests работает cffi Самый адекватный, ресурсы не жрет и может в асинк
Локет, Первый обновляется, да и вообще там браузер запускается для решения, второй и третий работают через js2py и они будут работать до тех пор, пока cf юзает жс для валидации
pip install tls_client import tls_client ses = tls_client.Session(random_tls_extension_order=True) steam_url = 'https://steamcommunity.com/id/LUCKYBANANA5894/' user_id = None req = ses.get('https://csstats.gg/', headers={ 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-language': 'ru,en-US;q=0.9,en;q=0.8,ru-RU;q=0.7', 'cache-control': 'no-cache', 'pragma': 'no-cache', 'priority': 'u=0, i', 'sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', }) print('get main page', req) token = req.text.split('input type="hidden" name="_token" value="')[1].split('"')[0] if not user_id or not user_id.isnumeric(): req = ses.post('https://csstats.gg/player', headers={ 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-language': 'ru,en-US;q=0.9,en;q=0.8,ru-RU;q=0.7', 'cache-control': 'no-cache', 'content-type': 'application/x-www-form-urlencoded', 'origin': 'https://csstats.gg', 'pragma': 'no-cache', 'priority': 'u=0, i', 'referer': 'https://csstats.gg/', 'sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', }, data={ 'steam_id': steam_url, '_token': token, }, allow_redirects=False) print('get_user_id', req) user_id = req.headers['Location'].split('/')[-1] print('got user_id', user_id) req = ses.get(f'https://csstats.gg/player/{user_id}/stats', headers={ 'accept': '*/*', 'accept-language': 'ru,en-US;q=0.9,en;q=0.8,ru-RU;q=0.7', 'cache-control': 'no-cache', 'pragma': 'no-cache', 'priority': 'u=1, i', 'referer': f'https://csstats.gg/player/{user_id}', 'sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', 'x-requested-with': 'XMLHttpRequest', }) print(req.text) print('get user stats', req) Python import tls_client ses = tls_client.Session(random_tls_extension_order=True) steam_url = 'https://steamcommunity.com/id/LUCKYBANANA5894/' user_id = None req = ses.get('https://csstats.gg/', headers={ 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-language': 'ru,en-US;q=0.9,en;q=0.8,ru-RU;q=0.7', 'cache-control': 'no-cache', 'pragma': 'no-cache', 'priority': 'u=0, i', 'sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', }) print('get main page', req) token = req.text.split('input type="hidden" name="_token" value="')[1].split('"')[0] if not user_id or not user_id.isnumeric(): req = ses.post('https://csstats.gg/player', headers={ 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-language': 'ru,en-US;q=0.9,en;q=0.8,ru-RU;q=0.7', 'cache-control': 'no-cache', 'content-type': 'application/x-www-form-urlencoded', 'origin': 'https://csstats.gg', 'pragma': 'no-cache', 'priority': 'u=0, i', 'referer': 'https://csstats.gg/', 'sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', }, data={ 'steam_id': steam_url, '_token': token, }, allow_redirects=False) print('get_user_id', req) user_id = req.headers['Location'].split('/')[-1] print('got user_id', user_id) req = ses.get(f'https://csstats.gg/player/{user_id}/stats', headers={ 'accept': '*/*', 'accept-language': 'ru,en-US;q=0.9,en;q=0.8,ru-RU;q=0.7', 'cache-control': 'no-cache', 'pragma': 'no-cache', 'priority': 'u=1, i', 'referer': f'https://csstats.gg/player/{user_id}', 'sec-ch-ua': '"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36', 'x-requested-with': 'XMLHttpRequest', }) print(req.text) print('get user stats', req) иногда может выдавать ошибку 403 клауд (нужно подождать минуту и всё норм будет), если много запросов без кука cf_bm, поэтому можешь сохранять куки из сессии когда заканчиваешь парсинг и потом их загружать в сессию import json, os open('cookies.json', 'w').write(json.dumps(ses.cookies.get_dict(), indent=4)) # сохрание куков # загрузка куков в сессию (tls_client.Session) if os.path.exists('cookies.json'): try: cookies = json.loads(open('cookies.json', 'r').read()) except Exception as e: print('error while importing cookies:', str(e)) cookies = {} for k, v in cookies.items(): ses.cookies[k] = v Python import json, os open('cookies.json', 'w').write(json.dumps(ses.cookies.get_dict(), indent=4)) # сохрание куков # загрузка куков в сессию (tls_client.Session) if os.path.exists('cookies.json'): try: cookies = json.loads(open('cookies.json', 'r').read()) except Exception as e: print('error while importing cookies:', str(e)) cookies = {} for k, v in cookies.items(): ses.cookies[k] = v