Python парсинг. Страница не отображает нужные элементы

Рейтинг: -1Ответов: 2Опубликовано: 15.02.2023

Хочу спарсить некоторые игры вот здесь https://stopgame.ru/topgames?year_end=2022&p=1 , проблема в том, что html код который я получаю в программе не тот , который наблюдаю на сайте , мне нужно спарсить количество оценок игр помимо всего прочего.

введите сюда описание изображения

Вот этот класс, который мне нужен есть тут, а в переменной

page_html=requests.get(url=URL+str(page), headers=headers)

его почему то нет введите сюда описание изображения

from bs4 import BeautifulSoup import requests

URL = 'https://stopgame.ru/topgames?year_end=2022&p='
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}
for page in  range(1,1+1):
    page_html=requests.get(url=URL+str(page), headers=headers)
    soup=BeautifulSoup(page_html.content, 'lxml')
    ranking=soup.find('button',class_="_rating_67304_39").text.replace('.','')

    print(soup)

Ответы

▲ 1Принят
import requests
from bs4 import BeautifulSoup

session = requests.Session()
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                         '(KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}
session.headers.update(headers)
page = 1
url = f'https://stopgame.ru/topgames?year_end=2022&p={page}'
response = session.get(url)
soup = BeautifulSoup(response.text, "lxml")
token = soup.find(attrs={'name': "csrf-token"})['content']
print(list(soup.find(attrs={'data-key': True}).stripped_strings))
# ['5.0']
headers = {
    'Content-Type': 'multipart/form-data; boundary=---------------------------401666322440753488502896157079',
    'x-csrf-token': token,
}
login = 'bumb'
password = 'vIAzGvV'
data = f'-----------------------------401666322440753488502896157079\r\n' \
       f'Content-Disposition: form-data; name="login"\r\n\r\n{login}\r\n' \
       f'-----------------------------401666322440753488502896157079\r\n' \
       f'Content-Disposition: form-data; name="password"\r\n\r\n{password}\r\n' \
       f'-----------------------------401666322440753488502896157079--\r\n'

response = session.post('https://stopgame.ru/ajax/auth/login', headers=headers, data=data)
print(response.json()['error'] if not response.json()['success'] else "Тук-тук")
# Тук-тук
response = session.get(url)
soup = BeautifulSoup(response.text, "lxml")
print(list(soup.find(attrs={'data-key': True}).stripped_strings))
# ['5.0']
cookies = {'_sg-identity': 'aaee3c3d98ffa628619cb118d2f926df47517898b3061349db86842866fabaa'
                           '9a%3A2%3A%7Bi%3A0%3Bs%3A12%3A%22_sg-identity%22%3Bi%3A1%3Bs%3A52'
                           '%3A%22%5B652577%2C%227a131397573f30fc3f303dccf05108ac%22%2C31536000%5D%22%3B%7D', }
response = session.get(f'{url}&grid_type=list', cookies=cookies)
soup = BeautifulSoup(response.text, "lxml")
print(list(soup.find(attrs={'data-key': True}).stripped_strings))
# ['Cube Escape Collection', 'Платформы', 'Android', '|', 'Mac', '|', 'PC', 'Жанр', 'неизвестно',
#  'Дата выхода', '14 октября 2020', 'Мой статус', '+13', 'Уведомления', '5.0', '7 оценок', 'Моя оценка', 'Очистить']
▲ 1

В Вашем случае проблема заключается в то, что-бы собрать количество оценок с страницы игры вам сперва необходимо получить ссылки на каждую игру, затем пройтись по каждой странице с игрой и уже там вытащить количество оценок. Вот код, который поможет Вам это сделать:

import requests
from bs4 import BeautifulSoup

URL = 'https://stopgame.ru/topgames?year_end=2022&p='
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}
for page in  range(1,1+1):
    page_html=requests.get(url=URL+str(page), headers=headers)
    soup=BeautifulSoup(page_html.content, 'lxml')
    href = soup.find_all('a', class_="_card_67304_1")
    for h in href:
        game_page_url=f'https://stopgame.ru{h.get("href")}'
        game_page_html=requests.get(game_page_url, headers)
        game_soup=BeautifulSoup(game_page_html.content, 'lxml')
        ranking=game_soup.find('span',class_="_users-rating__count_sh7r2_1").text.replace('.','')
        print(ranking)