首页 > 解决方案 > 带有硒的 iframe 的结果不一致

问题描述

我正在尝试从 coinmarketcap(https://coinmarketcap.com/currencies/ethereum/social/)中抓取加密货币的 Twitter 用户名。其中一些没有像 ( https://coinmarketcap.com/currencies/bitcoin/social/ ) 这样的 twitter iframe。

问题是 iframe 在大约 3 秒内加载。但是我多次测试了我的程序,我发现即使等待 5 秒后 iframe 也并不总是加载。有时我手动尝试打开页面,但它甚至没有出现在屏幕上(但非常罕见)。

我期待它应该完美地工作并刮掉所有东西,但它似乎很容易出错,因为它取决于加载时间和服务器响应?

有没有更好更稳定的方法来做到这一点?这是我的第一个网络抓取项目,它似乎是唯一可行的解​​决方案

在等待时我可以使用另一种方法吗?

我知道你可以从 iframe 中获取源并抓取它,但我找不到它。

这是我的功能:

def get_crypto_currency_social(slug):


url = "https://coinmarketcap.com/currencies/"+slug+"/social/"
browser = webdriver.Chrome('./chromedriver')
# .add_argument('headless')
browser.get(url) 
try:
    wait(browser, 5).until(EC.presence_of_element_located((By.ID, "twitter-widget-0")))
except:
    pass

html = browser.page_source
soup = BeautifulSoup(html, 'lxml')

market_cap = soup.find('div', {'class': 'statsValue___2iaoZ'}).text.split('$')[-1]
coin_name  = soup.find('small', {'class': 'nameSymbol___1arQV'}).text
coin_rank  = soup.find('div', {'class': 'namePillPrimary___2-GWA'}).text.split('#')[-1]

try:
    iframe = browser.find_elements_by_tag_name('iframe')[0]
    browser.switch_to.frame(iframe)
    twitter_username = browser.find_element_by_class_name("customisable-highlight").text
except NoSuchElementException:
    twitter_username = ""
except: 
    print("Error getting twitter username")
finally:
    browser.quit()

return {
    "coin_rank": coin_rank,
    "market_cap": market_cap,
    "coin_name": coin_name,
    "twitter_username": twitter_username
}

标签: pythonseleniumweb-scrapingiframebeautifulsoup

解决方案


如果存在随机延迟 b/w 时间,您可能可以使用 selenium 中的 WebDriverWait 类。

示例代码:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"YOUR IFRAME XPATH")))

推荐阅读