@R4ndolphC4rter

Как с помощью Selenium правильно спарсить данные сайта, подгружаемые динамически?

Здравствуйте!
Поставил для себя цель: написать программу, которая бы скачивала видео все/выборочно с какого-либо (поиск осуществляется по логину) аккаунта tikitok.
Данную задачу я разделил на подзадачи. И с одной из подзадач (а она самая важная) возникла проблема. Не получается программно загрузить контент сайта. Например, я взял случайный популярный аккаунт https://www.tiktok.com/@egorkreed . Сначала пытался с помощью библиотеки requests в связке с bs4 получить html страницу. Понял, что этот способ не подходит. Страница генерируется динамически. Решил использовать библиотеку Selenium.

Код для подзадачи:
spoiler
Сейчас я максимально упростил код

import time
from selenium import webdriver

URL = 'https://www.tiktok.com/@egorkreed'


def get_html(url):
    driver = webdriver.Chrome()
    driver.get(url)

get_html(URL)


Данный код открывает страницу:
5e31e14f47942265632633.png

Результат: Бесконечная попытка прогрузки видео.

Но, если я перейду по той же ссылке через браузер вручную, то результат будет следующим:
5e31e1b7dc93d150630277.png

Не понимаю в чём проблема.
Вопрос:
Как грамотно получить код html страницы с помощью Selenium, чтобы контент (клипы) отображались?

P.S.
пробовал использовать адаптированный под мою программу код из примера документации с ожиданием
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()


Какое бы время ожидания (10, 50, 100...) я не ставил, результатом программы является исключение. Нужный элемент не найден.
  • Вопрос задан
  • 1421 просмотр
Решения вопроса 1
@R4ndolphC4rter Автор вопроса
Программно у меня не прогружаются блоки (содержащии видео)
<div class="jsx-1410658769 video-feed-item">
...
</div>


Из-за чего проблема? Как можно было бы исправить?

02.02.2020 (дата палиндром, кста)
Покопавшись по сайту обнаружил, что нужные мне id видео, а так же дополнительная информация о видео приходит в формате json (в пачке из 30 штук) по requests get запросу на адрес
https://m.tiktok.com/share/item/list?secUid=MS4wLjABAAAAel1W8SHY_s5E-E8fS9SFwEGKTV4TqtP-GotZf737nudl9M5gm99Pk_8bp8A0UXS8&id=6568346904743116806&type=1&count=30&minCursor=0&maxCursor=0&shareUid=&lang=&_signature=N5.bMAAgEBaTTMphzSDYUTef2iAAGmv


В этой ссылке передаются различные параметры.
Важные из них:
&maxCursor=N
&_signature=LONG_STRING
Если делать запрос без правильной сигнатуры, то json файл будет, грубо говоря, пуст. Никакой нужной информации.

Так что теперь стоит другой вопрос. А именно: как подделать tiktok сигнатуру?
Но этот вопрос не относится к данной теме, а потому (и не только) считаю эту тему закрытой. Спасибо всем, кто помогал.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
R4ndolphC4rter интересно что такое tiktok делает в браузере чего не делает селениум -

window.addEventListener('load', function() {
                            navigator.serviceWorker.register('/sw.js');
                        });


удачи

Кстати R4ndolphC4rter через джаву с Selenium 3.14, оч. старый FF - 40 - видео грузится и работает вообще сразу без всякого тюнинга:
Video link selected: https://www.tiktok.com/@egorkreed/video/678***************5
Video link selected: https://www.tiktok.com/@egorkreed/video/678***************7
Video link selected: https://www.tiktok.com/@egorkreed/video/678***************4
...

а с Chrom - ом - нет (та же ситуация что через питон)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы