Fallervood
@Fallervood

Не могу спарсить элементы страницы с непонятными классами почему?

Хочу освоиться в парсинге. Уже писал что-то и даже получалось. Спустя время решил к этому вернуться. Начал писать новый парсер и изучать все почти с нуля. Для примера захотел спарсить информацию о матчах на букмекерском сайте parimatch. Но при попытке взять элементы с информацией, он их не может найти или возвращает пустой объект. Почему?
P.S. Почитал много чего на формумах, попробовал использовать селениум, та же история.
import requests
from bs4 import BeautifulSoup


URL = 'https://www.parimatch.ru/'
HEADERS = {
    'accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63'
}


# Получение html
def get_html(url, params=''):
    html = requests.get(url).text
    return html  # Возврат полученной страницы


# Поиск нужного контента
def get_content(html):
    soup = BeautifulSoup(html, "html.parser")
    items = soup.find_all('div', {'class': 'QHMOkrbtqvSkGzF6oZD2a'})
    print(items)


if __name__ == '__main__':
    html = get_html(URL)
    get_content(html)


Вывод:
[]
Process finished with exit code 0
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
MinTnt
@MinTnt
Вообще, парсинг бывает не всегда так прост как кажется. Сайты часто пытаются различными способами даже минимальными, защищаться от простых парсеров, при этом есть ещё и различные разновидности защит.

А вообще, если ты хочешь посмотреть что же получаем из пост запрос, просто делай запись в файл, так будет проще понять где ошибка и тд. К примеру
import requests

getpost = requests.get('https://www.parimatch.ru/')
with open('log.html', 'w', encoding='utf-8') as f:
	f.write(getpost.text)

Далее сможем открыть эту страничку, и посмотреть что нам загрузило.

В основном как мы видим, есть лишь пустая старничка с заставкой. Значит инфа вся подгружается скриптом.

Ещё раз повторюсь, что не всё так просто, но за то весело устроено. :D

Я вот пока посмотрел, матчи сначала подружаются get запросом по адресу https://www.parimatch.ru/api/top-matches в формате:
spoiler
"abTestLabel":null,"topEvents":[{"id":"F","eventList":["1|6154167","1|6154172","1|6154171","1|6154169","1|6153670","1|6154164","1|6154166","1|6154165","1|6154170","1|6154168"]},{"id":"CS","eventList":["1|6193860","1|6173617","1|6193859","1|6161642","2|6192368","1|6193855","1|6193858","2|6191488","2|6192369","2|6191486"]},{"id":"H","eventList":["1|6185855","1|6185856","1|6174639","1|6174637","1|6174635","1|6174636","1|6190210","1|6174680","1|6174948","1|6179742"]},{"id":"B","eventList":["1|6173785","1|6173786","1|6173784","1|6173976","1|6174103","1|6173789","1|6173929","1|6166406","1|6166663","2|6188578"]},{"id":"T","eventList":["1|6189125","1|6192182","1|6191996","1|6190277","1|6190232","1|6189853","1|6192338","1|6192328","2|6186610","1|6191995"]},{"id":"TT","eventList":["2|6193585","2|6192227","2|6193586","2|6193234","2|6193462","2|6193912","2|6192904","1|6193575","1|6193624","1|6193623"]},{"id":"VB","eventList":["2|6187527","1|6187528","1|6191657","1|6187530","1|6186281","1|6177549","1|6186390","1|6186283","1|6186388","1|6186284"]}],"source":"TopMatch"}

С которого по этим данным отправляется запрос в БД на получение данных по адресу
https://www.parimatch.ru/content/strapi/system/graphql?

query: "query getData($id: [String]) {events(where: {id: $id}) { slug, id, sportCode, categoryId, tournamentId }}" В котором в параметрах даты передаются ID матчей что получены с первого запроса "variables":{"id":["6173617","6154171","6154169".

Надеюсь помог. :g
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@s7500
Это похоже на сгенерированный класс
Попробуй взять родительский с нормальным названием и через него обратиться к дочернему классу элемента
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы