Quiero raspar un sitio web de acciones y obtener los precios con selenio. No puedo usar solicitudes HTML normales ya que el HTML es dinámico. Estoy usando el controlador web de selenio sin cabeza para obtener los datos, pero toma alrededor de 30 segundos para cada solicitud. ¿Hay una forma más rápida de obtener el HTML dinámico?

0
Sh4d0wb0y 10 oct. 2019 a las 06:48

3 respuestas

La mejor respuesta

No, estás atrapado en el tiempo de espera de Selenium con el renderizado

El HTML dinámico requiere un navegador completo. No hay mucha negociación con eso. Si sus páginas son separadas y distintas, es decir, si está eliminando stocks.com/oilandgas y stocks.com/agriculture, existe una posible forma de acelerar las cosas.

La única opción que puede tener es crear un hilo separado para cada instancia de Selenium Webdriver y hacer que ambas páginas web sean raspadas al mismo tiempo por dos Selenium Webdrivers diferentes.

La advertencia es que solo acelerará las cosas si el cuello de botella (lo que está causando la lentitud) es la representación del sitio web.

Si se trata de la velocidad de Internet, la potencia de procesamiento de su computadora o la velocidad del servidor del sitio web, esto no mejoraría las cosas.

En realidad, Daniel Farrell a continuación sugiere que mejoraría la velocidad de la red. Es posible que desee darle una oportunidad a esto.

3
Matthew Gaiser 10 oct. 2019 a las 04:08

Hay dos API que puede usar para obtener información resumida y el perfil de la empresa en función del ticker. Puede utilizar solicitudes más rápidas y Sesión para mayor eficiencia para realizar solicitudes de esta información.

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
1
QHarr 10 oct. 2019 a las 06:08

Ese sitio está obteniendo datos de un XHR

network tab

Así que podría cargar eso con solicitudes y json.loads, que ya es mucho más rápido.

En cuanto a obtener HTML actualizado más rápido que el sondeo, hay algunos frameworks (titiriteros) que pueden enviar eventos de actualización desde el navegador al script principal, pero AFAIK no hay forma de hacerlo en Python.

1
pguardiario 10 oct. 2019 a las 04:55
58315190