Загрузка...

Парсим Cs2

Тема в разделе Python создана пользователем FTPB 4 июн 2025 в 03:36. 241 просмотр

Загрузка...
  1. FTPB
    FTPB Автор темы 4 июн 2025 в 03:36 31 18 июл 2019
    Пытаюсь запарсить звание с csstats.gg, гет запрос блокирует, поэтому юзаю селениум, но при этом все равно он мне ебет мозгу и не дает вытащить мне данные. Может кто обладает информацией как можно правильно направить запрос?

    или откуда вообще можно спарсить рейтинг
     
    4 июн 2025 в 03:36 Изменено
    1. Посмотреть предыдущие комментарии (3)
    2. gcc_machine
      FTPB, используй playwright , приятная дока, ты так же вместо sleep можешь использовать состояния, для ожидания загрузки страницы
    3. gcc_machine
      FTPB, и используй лучше анти-детект patch playwright (что-то такое в Гугл)
  2. ОТЕЦ
    ОТЕЦ 4 июн 2025 в 04:28 Never stop dreaming.
    Ты на верном пути, но сайт csstats.gg (как и многие современные сайты) может использовать JavaScript-рендеринг, динамическую подгрузку данных, Cloudflare защиту и прочие трюки, которые ломают простые подходы. Вот что может идти не так и как это исправить:


    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:


    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:





    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,
    )
     
  3. AS7RID
    AS7RID 4 июн 2025 в 07:19 в статус ставить - https://t.me/Kanalchik_alexa 12 886 11 июн 2019
    Решений до жопы, через чистый селениум делать кринж. Выбери один ниже, глянь референсы и со спокойной душой парси через бс4
    flaresolverr Ресурсы кушает, т.к на селениуме работает:Rotvgovne:
    cloudscraper Через requests работает :Rotvgovne:
    cffi Самый адекватный, ресурсы не жрет и может в асинк
     
    4 июн 2025 в 07:19 Изменено
    1. Локет
      AS7RID, у тя работают они вообще, они же не обновлялись по паре лет
    2. AS7RID
      Локет, Первый обновляется, да и вообще там браузер запускается для решения, второй и третий работают через js2py и они будут работать до тех пор, пока cf юзает жс для валидации :emm:
  4. Локет
    там клауд стоит[IMG]
     
  5. hiklyy
    ⁡pip install tls_client


    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, поэтому можешь сохранять куки из сессии когда заканчиваешь парсинг и потом их загружать в сессию

    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
     
    4 июн 2025 в 14:16 Изменено
    1. hiklyy
      hiklyy, а ну я ещё тупанул, если user_id есть, то первый запрос можно не выполнять
Top