Программа для очистки веб-страниц не может найти элемент, который я вижу в браузере

Я пытаюсь получить названия потоков на https://www.twitch.tv/directory/game/Dota%202, используя Requests и BeautifulSoup. Я знаю, что мои критерии поиска верны, но моя программа не находит нужных мне элементов.

Вот скриншот, показывающий соответствующую часть исходного кода в браузере:

Снимок экрана браузера, показывающий часть веб-страницы, а также исходный код с помощью инструментов разработчика / веб-инспектора.

Исходный код HTML в виде текста:

<div class="tw-media-card-meta__title">
  <div class="tw-c-text-alt">
    <a class="tw-full-width tw-interactive tw-link tw-link--button tw-link--hover-underline-none tw-link--inherit" data-a-target="preview-card-title-link" href="/weplayesport_en">
      <div class="tw-align-items-start tw-flex">
        <h3 class="tw-ellipsis tw-font-size-5" title="NAVI vs HellRaisers | BO5 | ODPixel &amp; S4 | WeSave! Charity Play">NAVI vs HellRaisers | BO5 | ODPixel &amp; S4 | WeSave! Charity Play</h3>
      </div>
    </a>
  </div>
</div>

Вот мой код:

import requests
from bs4 import BeautifulSoup

req = requests.get("https://www.twitch.tv/directory/game/Dota%202")

soup = BeautifulSoup(req.content, "lxml")

title_elems = soup.find_all("h3", attrs={"title": True})

print(title_elems)

Когда я его запускаю, title_elems - это просто пустой список ([]).

Почему моя программа не находит элементы?


person AMC    schedule 28.03.2020    source источник
comment
кроме того, можете ли вы поделиться результатами работы этого приложения, если оно все еще используется? Если используется и работает в режиме полуреального времени, моему другу это понравится.   -  person    schedule 29.09.2020
comment
@OakDev Какое приложение вы имеете в виду?   -  person AMC    schedule 01.10.2020


Ответы (2)


Интересующий вас элемент создается динамически после начальной загрузки страницы, что означает, что ваш браузер выполнил JavaScript, сделал другие сетевые запросы и т. Д. Для создания страницы. Запросы - это просто HTTP-библиотека, и поэтому они не будут выполнять эти функции.

Вы можете использовать такой инструмент, как Selenium, или, возможно, даже проанализировать сетевой трафик на предмет необходимых вам данных и напрямую отправлять запросы.

person AMC    schedule 28.03.2020
comment
если вам повезет, вы можете обнаружить запросы XHR / Ajax, которые явно загружают контент. См. Пример: webscraping.pro/scrape-lazy-load-page-python -запросы. - person Igor Savinkin; 01.07.2020

Это то, что вы можете сделать, чтобы получить названия разных игр с этого сайта, используя модуль запросов:

import re
import requests

url = "https://www.twitch.tv/directory/game/Dota%202"
link = "https://gql.twitch.tv/gql"

formdata = [{"operationName":"DirectoryRoot_Directory","variables":{"name":"dota 2"},"extensions":{"persistedQuery":{"version":1,"sha256Hash":"9f4f6ae67f21ee50b454fcf048691107a52bfe7907ead73b9427398e343ca319"}}},{"operationName":"Directory_DirectoryBanner","variables":{"name":"Dota 2"},"extensions":{"persistedQuery":{"version":1,"sha256Hash":"a64b0348103e054cbdb20c58de5fc05160da3f86c37c80263d7e6282f2577f54"}}},{"operationName":"DirectoryPage_Game","variables":{"name":"dota 2","options":{"sort":"RELEVANCE","recommendationsContext":{"platform":"web"},"requestID":"JIRA-VXP-2397","tags":[]},"sortTypeIsRecency":False,"limit":30},"extensions":{"persistedQuery":{"version":1,"sha256Hash":"f2ac02ded21558ad8b747a0b63c0bb02b0533b6df8080259be10d82af63d50b3"}}}]

with requests.Session() as s:
    s.headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
    res = s.get(url)
    s.headers['Client-Id'] = re.findall(r"Client-ID\":\"(.*?)\"",res.text)[0]
    res = s.post(link,json=formdata)
    for item in res.json()[2]['data']['game']['streams']['edges']:
        print(item['node']['title'])

Типы результатов, которые вы можете получить:

PUBS 7.27 POG VIBE COOL FUN
Playing more 7.27
7.27 Pubs :) Climb to 9k
В новый сезон с новыми победами Custom Hero Chaos |  !discord 
Бобрый вечер !розыгрыш 
RERUN: Adroit vs Execration Game 1 - BTS Pro Series 2: SEA - Group Stage w/ MLP & johnxfire
(RU) Повтор | EGB.com Arena of Blood 
No Matter What
mid 5000-6000(5600) (!розыгрыш каждый день)
chegou a cam, pena que to parecendo um neanderthal
person asmitu    schedule 01.07.2020