【问题标题】:Fastest way to get dynamically updated HTML content from website?从网站获取动态更新的 HTML 内容的最快方法?
【发布时间】:2019-10-10 03:48:12
【问题描述】:

我想抓取一个股票网站并使用 selenium 获取价格。我不能使用普通的 HTML 请求,因为 HTML 是动态的。 我正在使用无头硒网络驱动程序来获取数据,但每个请求大约需要 30 秒。 有没有更快的方法来获取动态 HTML?

【问题讨论】:

  • 要呈现整个动态网站,浏览器是必要的,而且需要时间。 Selenium 什么也没做。因此,这取决于网速、计算机性能以及用于 selenium 的浏览器。
  • 您是否检查过该网站是否不提供 API?如果是,它会比试图刮掉它更快。此外,如果只有一页需要 30 scd 加载,那么您很可能无法减少加载时间。
  • 如果您添加网站,我们可以看看我们是否可以帮助您找到更快的方法。
  • 基础网站是“nasdaq.com/market-activity/stocks”,程序将每只股票的代码添加到 URL 的末尾。

标签: python selenium web-scraping dynamic-html


【解决方案1】:

不,你被 Selenium 的渲染等待时间困住了

动态 HTML 需要完整的浏览器。没有太多的谈判。如果您的页面是独立且不同的,即您正在抓取stocks.com/oilandgas 和stocks.com/agriculture,则有一种可能的方法来加快速度。

您可能拥有的一个选项是为每个 Selenium Webdriver 实例创建一个单独的线程,并让两个网页同时由两个不同的 Selenium Webdrivers 抓取。

需要注意的是,只有当瓶颈(导致缓慢的原因)是网站的呈现时,它才会加快速度。

如果是网速、你电脑的处理能力,或者网站的服务器速度,这都不会改善。

实际上,下面的 Daniel Farrell 建议它会提高网络速度。你可能想试一试。

【讨论】:

  • 网络延迟通常可以通过并行来缓解,即使网络不是瓶颈。
  • 感谢您的信息。我可能只会使用 API 来获取股票价格。
  • 是的,如果 API 存在的话,它确实是最好的选择。
【解决方案2】:

该网站正在从 XHR 获取数据

所以你可以使用 requests 和 json.loads 加载它,这已经更快了。

就更新 HTML 比轮询更快而言,有一些框架(puppeteer)可以将更新事件从浏览器发送到主脚本,但 AFAIK 在 Python 中无法做到这一点。

【讨论】:

    【解决方案3】:

    您可以使用两个 API 来获取摘要信息和基于股票代码的公司简介。您可以使用更快的请求和 Session 来提高效率来请求此信息。

    import requests
    
    tickers = ['FB']
    results = {}
    
    with requests.Session() as s:
        for ticker in tickers:
            results[ticker] = {}
            r = s.get(f'https://api.nasdaq.com/api/quote/{ticker}/summary?assetclass=stocks').json()
            results[ticker]['summary'] = r
            r = s.get(f'https://api.nasdaq.com/api/company/{ticker}/company-profile').json()
            results[ticker]['profile'] = r
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      相关资源
      最近更新 更多