【问题标题】:Inconsistent results for iframe with selenium带有硒的 iframe 的结果不一致
【发布时间】:2021-08-09 16:31:23
【问题描述】:

我正在尝试从 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
}

【问题讨论】:

    标签: python selenium web-scraping iframe beautifulsoup


    【解决方案1】:

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

    示例代码:

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

    【讨论】:

    • 我试过这个,但每次我仍然得到不同的结果。我什至让它等待 15-20 秒,但我仍然没有从 iframe 得到任何回报,它根本没有加载。有时我会在 2 秒内得到它,有时我不会。我稍微更改了代码并一次尝试获取 twitter 数据/除非我使用 WebDriverWait,因为我直接输入 iframe。我不知道我是否应该习惯于得到不一致的结果,或者有办法做到这一点。
    • @Filip : 在浏览器初始化后尝试driver.implicitly_wait(10) # seconds
    • 好的,所以我尝试了这种方式,但它仍然错过了一些。我还尝试使用滚动,希望 iframe 会以某种方式被触发......我关闭了无头浏览器,并且有一个页面加载了 iframe,但它没有刮掉文本。所以这可能是我的代码?当我获得 twitter 用户名时,类可能会动态变化?
    • @Filip : 让我过一段时间再看看这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    相关资源
    最近更新 更多