python - 带有硒的 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
}
解决方案
如果存在随机延迟 b/w 时间,您可能可以使用 selenium 中的 WebDriverWait 类。
示例代码:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"YOUR IFRAME XPATH")))
推荐阅读
- vb.net - 使数据集公开的问题
- android - 为什么我的图片在从 Firebase 检索时没有显示,即使它已成功上传?
- json - 如何通过控制器 adonis 调用 http 请求?
- react-native - WebView 未在 iPhone 上加载
- javascript - onChange 是延迟的一个字符 - 钩子
- django - Django:从视图或模板中的模型获取用户信息的更好方法是什么?
- python - 在python中直接写入.csv时,如何防止用户输入相同的输入两次
- mv - UNIX:如何通过终端将最后创建的文件移动到某个目录
- javascript - 这需要 $.ajax 调用的软件包才能工作
- sql - 查找出现的几个事件 - Postgresql