【问题标题】:Web scraping using Selenium in python - trouble retrieving all data在 python 中使用 Selenium 进行 Web 抓取 - 检索所有数据时遇到问题
【发布时间】:2021-11-30 08:03:55
【问题描述】:

我正在尝试使用 selenium 对 coinmarketcap.com 进行网络抓取,我正在尝试检索硬币名称、硬币市值、价格和流通供应等数据。但是,我在这方面并不成功。我只能取回 11 个山寨币,不能更多。另外,我研究了几种如何使用不同的方法渲染 javascrip(我假设 coinmarketcap 是在其中制作的)的方法。这是我的代码的开始:

driver = webdriver.Chrome(r'C:\Users\Ejer\PycharmProjects\pythonProject\chromedriver')
driver.get('https://coinmarketcap.com/')

Crypto = driver.find_elements_by_xpath("//div[contains(concat(' ', normalize-space(@class), ' '), 'sc-16r8icm-0 sc-1teo54s-1 lgwUsc')]")
#price = driver.find_elements_by_xpath('//td[@class="cmc-link"]')
#coincap = driver.find_elements_by_xpath('//td[@class="DAY"]')

CMC_list = []
for c in range(len(Crypto)):
    CMC_list.append(Crypto[c].text)
print(CMC_list)

driver.close()

我的目标是将名称、硬币市值、价格和流通供应量存储在数据框中,以便我可以应用机器学习方法并分析数据。所以,我愿意接受任何建议。提前致谢

【问题讨论】:

    标签: python selenium-webdriver xpath css-selectors webdriverwait


    【解决方案1】:

    面对同样的问题,我在 Crypto = driver.find_elements_by_xpath 之前添加了一个页面滚动... 像这样:

    i=0
    while i<15:
      driver.execute_script("window.scrollBy(0, window.innerHeight)")
      time.sleep(SCROLL_PAUSE_TIME)
      i+=1
    Crypto = driver.find_elements_by_xpath('//div[@class="sc-16r8icm-0 sc-1teo54s-0 dBKWCw"]')
    

    在我的笔记本电脑上,向下滚动页面 13 次足以刷新所有 100 个硬币。为了确定,我放了 15 个。 下一步是获取刷新的内容。也许我必须每 1 或 2 分钟重复一次滚动才能获得它。 我在这里的第一篇文章。很难插入代码。希望有用

    【讨论】:

      【解决方案2】:

      要检索 硬币名称列表,您需要关闭 cookies 栏,关闭 弹出窗口 并为 @ 诱导 WebDriverWait 987654323@,您可以使用以下任一Locator Strategies

      • 使用CSS_SELECTORget_attribute("innerHTML")

        driver.get("https://coinmarketcap.com/")
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.cmc-cookie-policy-banner__close"))).click()
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button/b[text()='No, thanks']"))).click()
        print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table.cmc-table tbody tr td > a p[color='text']")))])
        
      • 使用XPATHtext属性:

        driver.get("https://coinmarketcap.com/")
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.cmc-cookie-policy-banner__close"))).click()
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button/b[text()='No, thanks']"))).click()
        print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//table[contains(@class, 'cmc-table')]//tbody//tr//td/a//p[@color='text']")))])
        driver.quit()
        
      • 控制台输出:

        ['Bitcoin', 'Ethereum', 'XRP', 'Tether', 'Litecoin', 'Bitcoin Cash', 'Chainlink', 'Cardano', 'Polkadot', 'Binance Coin', 'Stellar', 'USD Coin', 'Bitcoin SV']
        
      • 注意:您必须添加以下导入:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 2020-10-05
        • 2017-08-10
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 2022-07-22
        相关资源
        最近更新 更多