【问题标题】:Unable to scrape right number of videos and images using Selenium in Python无法在 Python 中使用 Selenium 抓取正确数量的视频和图像
【发布时间】:2020-05-16 12:33:46
【问题描述】:

我在SO上搜索了很多,但大多数答案都无法解决我的问题:

  • 我要抓取的内容:

    • 我有一个link。该链接将重定向到动态网站。
    • 我想获取此链接上的视频数量和图像数量。
    • 我想使用 bs4、Selenium 和 Python 来实现。
  • 我面临什么问题:

    • 当我检查“检查元素”并执行简单的 Ctrl+F 来查找视频标签时。我可以看到适量的视频。但是,当我打开同一页面的“查看源代码”时,我只能看到 1 个视频标签。

此外,当我尝试抓取时,我只能检索 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

【问题讨论】:

  • 您要查找的类“play_button_container...”在
    标签中,而不是
  • 抱歉,复制粘贴代码时打错了。我已经改变了它。它不适用于 div。
  • 你可以尝试用这个res = driver.page_source替换第三行吗?

标签: python selenium xpath beautifulsoup css-selectors


【解决方案1】:

要打印您需要为visibility_of_all_elements_located() 诱导WebDriverWait 的视频数量,您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    driver.get("https://www.kickstarter.com/projects/evolutionwear/fast-solar-charging-that-fits-in-your-pocket/?ref=kicktraq")
    print(len(WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.play_button_container.absolute-center.has_played_hide")))))
    
  • 使用XPATH

    driver.get("https://www.kickstarter.com/projects/evolutionwear/fast-solar-charging-that-fits-in-your-pocket/?ref=kicktraq")
    print(len(WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='play_button_container absolute-center has_played_hide']")))))
    
  • 控制台输出:

    5
    

【讨论】:

    【解决方案2】:

    由于数据是由 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
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签