Невозможно собрать нужное количество видео и изображений с помощью Selenium в Python - PullRequest
0 голосов
/ 30 января 2020

Я много искал на SO, но большинство ответов не смогли решить мою проблему:

  • Что я пытаюсь очистить:

    • У меня есть ссылка . Ссылка перенаправляет на динамический c веб-сайт.
    • Я хочу получить количество видео и изображений, находящихся по этой ссылке.
    • Я хочу сделать это, используя bs4, Selenium и Python.
  • С какой проблемой я сталкиваюсь:

    • Когда я проверяю «проверить элемент» и делаю простые Ctrl + F, чтобы найти теги видео. Я могу видеть правильное количество видео. Но когда я открываю «источник просмотра» на той же странице, я вижу только один тег видео.

Кроме того, когда я пытаюсь очистить, я могу получить только 1 видео. Я не знаю, почему другие теги видео не обнаруживаются bs4. Я предполагаю, что это как-то связано с Javascript загруженными страницами. Но даже когда я использую приведенный ниже код с Selenium, я все равно не могу получить правильное количество видео и изображений

Это код, который я пробовал:

driver = webdriver.Chrome()
driver.get("https://www.kickstarter.com/projects/evolutionwear/fast-solar-charging-that-fits-in-your-pocket/?ref=kicktraq")
res = driver.execute_script('return document.documentElement.outerHTML')
soup = BeautifulSoup(res, 'html.parser')

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

c=1
for vidL in soup.find_all("div", {'class': 'play_button_container absolute-center has_played_hide'}):
    print(vidL)
    print(c)
    c+=1

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Поскольку данные, представленные javascripts, вам нужно дождаться, пока элемент будет виден, прежде чем использовать Beautiful soup.

Код :

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.kickstarter.com/projects/evolutionwear/fast-solar-charging-that-fits-in-your-pocket/?ref=kicktraq")
WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,".play_button_container")))
res = driver.page_source
soup = BeautifulSoup(res, 'html.parser')
c=1
for vidL in soup.find_all("div", {'class': 'play_button_container absolute-center has_played_hide'}):
    print(vidL)
    print(c)
    c+=1

Вывод На консоли:

<div class="play_button_container absolute-center has_played_hide">
<button aria-label="Play video" class="play_button_big play_button_dark radius2px" type="button">
<span aria-hidden="true" class="ksr-icon__play"></span>
Play
</button>
</div>
1
<div class="play_button_container absolute-center has_played_hide">
<button aria-label="Play video" class="play_button_big play_button_dark radius2px" type="button">
<span aria-hidden="true" class="ksr-icon__play"></span>
Play
</button>
</div>
2
<div class="play_button_container absolute-center has_played_hide">
<button aria-label="Play video" class="play_button_big play_button_dark radius2px" type="button">
<span aria-hidden="true" class="ksr-icon__play"></span>
Play
</button>
</div>
3
<div class="play_button_container absolute-center has_played_hide">
<button aria-label="Play video" class="play_button_big play_button_dark radius2px" type="button">
<span aria-hidden="true" class="ksr-icon__play"></span>
Play
</button>
</div>
4
<div class="play_button_container absolute-center has_played_hide">
<button aria-label="Play video" class="play_button_big play_button_dark radius2px" type="button">
<span aria-hidden="true" class="ksr-icon__play"></span>
Play
</button>
</div>
5
1 голос
/ 30 января 2020

Чтобы напечатать количество видео, которое вам нужно вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете использовать любую из следующих стратегий локатора :

...