【发布时间】: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