【问题标题】:How to click the button to crawl the reviews using python如何单击按钮以使用 python 抓取评论
【发布时间】:2020-12-09 15:05:01
【问题描述】:

我正在尝试抓取此网站上的评论:https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425897/

但是,我必须单击一个按钮 (Toon meer) 才能显示所有评论。

<div class="load-more load-more--divider load-more--reviews js-review-load-more-container">
  <a data-href="/nl/rnwy/productPage/reviews?productId=9200000118425896&amp;offset=5&amp;limit=10&amp;loadMore=true" class="review-load-more__button js-review-load-more-button" data-test="review-load-more"><div class="css-loader css-loader--reviews"></div>
      Toon meer</a>
</div>

我使用下面的代码:

import requests
import pandas as pd
from selenium import webdriver
from bs4 import BeautifulSoup
from datetime import datetime

start_time = datetime.now()
data = []
link = "https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425897/"
op = webdriver.ChromeOptions()
op.add_argument('--ignore-certificate-errors')
op.add_argument('--incognito')
op.add_argument('--headless')
driver = webdriver.Chrome(executable_path='D:/Desktop/work/real/chromedriver.exe',options=op)
driver.get(link)
driver.find_element_by_css_selector('div.review-load-more__button js-review-load-more-button').click()

但是,它会引发错误:

No such element: Unable to locate element: {"method":"css selector","selector":"div.review-load-more__button js-review-load-more-button"} . 

有什么解决办法吗?

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    Css 选择器不能通过包含文本来选择元素。

    尝试使用 xpath。脚本的最后一行应该类似于:

    wait = WebDriverWait(driver, 10)
    wait.until(expected_conditions.element_to_be_clickable((By.XPATH, "//a[contains(., 'Toon meer')]")).click()
    

    【讨论】:

    • 我尝试了您的解决方案,但它引发了错误:元素点击被拦截:元素在点 (202、1865) 处不可点击。这是什么意思?
    • 这意味着另一个元素(不可见)正在阻止点击。在更新的答案中添加等待条件。
    【解决方案2】:

    当您获得页面时,会弹出一个带有接受按钮的弹出窗口,单击它,然后继续单击您的元素。

    driver.get('https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425896/')
    wait=WebDriverWait(driver, 10)
    wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@class='js-confirm-button']"))).click()
    wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@data-test='review-load-more']"))).click()
    

    导入

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait 
    from selenium.webdriver.support import expected_conditions as EC
    

    【讨论】:

      【解决方案3】:

      要点击Toon meer,你需要为element_to_be_clickable()诱导WebDriverWait,你可以使用以下Locator Strategies之一:

      • 使用CSS_SELECTOR

        driver.get('https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425896/')
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-test='consent-modal-confirm-btn']>span"))).click()
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.review-load-more__button.js-review-load-more-button"))).click()
        
      • 使用XPATH

        driver.get('https://www.bol.com/nl/p/Matras-140x200-7-zones-koudschuim-premium-plus-tijk-15-cm-medium/9200000118425896/')
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@data-test='consent-modal-confirm-btn']/span"))).click()
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='review-load-more__button js-review-load-more-button' and contains(., 'Toon meer')]"))).click()
        
      • 注意:您必须添加以下导入:

        from selenium.webdriver.support.ui import WebDriverWait
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support import expected_conditions as EC
        

      【讨论】:

      • 感谢您提供全面的解决方案。我尝试使用 css_selector 运行。但是,有时它可以单击按钮,有时则不能。我不知道为什么。我应该延长等待时间吗?
      • @mht 是的,这是对网络连接的依赖。我能够将等待时间减少到20 秒。您可能需要调整。
      • 如何确定等待时间?我怎样才能获得网络连接(我猜它是一个数字?)?
      • @mht 抱歉,我们应该将其视为所需元素在 HTML 中呈现所需的时间,而不是 网络连接,并且此特定值应该是您 测试计划 / 测试用例.
      猜你喜欢
      • 2022-01-10
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多