从网站获取动态更新 HTML 内容的最快方法?
Fastest way to get dynamically updated HTML content from website?
我想抓取一个股票网站并使用 selenium 获取价格。我不能使用正常的 HTML 请求,因为 HTML 是动态的。
我正在使用 headless selenium webdriver 来获取数据,但每个请求大约需要 30 秒。
有没有更快的方法获取动态 HTML?
不,你受困于 Selenium 的渲染等待时间
动态 HTML 需要完整的浏览器。没有太多的谈判。如果您的页面是独立且不同的,即您正在抓取 stocks.com/oilandgas 以及 stocks.com/agriculture,则有一种可能的方法可以加快速度。
您可能拥有的一个选择是为每个 Selenium Webdriver 实例创建一个单独的线程,并让两个不同的 Selenium Webdrivers 同时抓取两个网页。
需要注意的是,只有当瓶颈(导致缓慢的原因)是网站呈现时,它才会加快速度。
如果是网速,你电脑的处理能力,或者网站的服务器速度,这不会有任何改善。
实际上,下面的 Daniel Farrell 建议它可以提高网络速度。你可能想试一试。
该站点正在从 XHR 获取数据
所以你可以用请求和 json.loads 加载它,这已经快多了。
就比轮询更快的更新 HTML 而言,有一些框架(puppeteer)可以将更新事件从浏览器发送到主脚本,但据我所知,在 [=21] 中无法做到这一点=].
您可以使用两种 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
我想抓取一个股票网站并使用 selenium 获取价格。我不能使用正常的 HTML 请求,因为 HTML 是动态的。 我正在使用 headless selenium webdriver 来获取数据,但每个请求大约需要 30 秒。 有没有更快的方法获取动态 HTML?
不,你受困于 Selenium 的渲染等待时间
动态 HTML 需要完整的浏览器。没有太多的谈判。如果您的页面是独立且不同的,即您正在抓取 stocks.com/oilandgas 以及 stocks.com/agriculture,则有一种可能的方法可以加快速度。
您可能拥有的一个选择是为每个 Selenium Webdriver 实例创建一个单独的线程,并让两个不同的 Selenium Webdrivers 同时抓取两个网页。
需要注意的是,只有当瓶颈(导致缓慢的原因)是网站呈现时,它才会加快速度。
如果是网速,你电脑的处理能力,或者网站的服务器速度,这不会有任何改善。
实际上,下面的 Daniel Farrell 建议它可以提高网络速度。你可能想试一试。
该站点正在从 XHR 获取数据
所以你可以用请求和 json.loads 加载它,这已经快多了。
就比轮询更快的更新 HTML 而言,有一些框架(puppeteer)可以将更新事件从浏览器发送到主脚本,但据我所知,在 [=21] 中无法做到这一点=].
您可以使用两种 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