Raspado de datos de gráfico interactivo

Hay un sitio web con un par de gráficos interactivos de los que me gustaría extraer datos. He escrito un par de raspadores web antes en Python utilizando SelDen webdriver, pero este parece ser un problema diferente. He mirado un par de preguntas similares sobre stackoverflow. De estos, parece que la solución podría ser descargar datos directamente desde un archivo json. Miré el código fuente del sitio web e identifiqué un par de archivos json, pero al inspeccionarlos no parecen contener los datos.

¿Alguien sabe cómo descargar los datos de esos gráficos? En particular, estoy interesado en este gráfico de barras: .//*[@id='network_download']

Gracias

Edición: Debo agregar que cuando inspeccioné el sitio web utilizando Firebug vi que es posible obtener datos en el siguiente formato. Pero esto obviamente no es útil ya que no incluye ninguna etiqueta.

       

Las tablas de SVG como esta tienden a ser un poco difíciles de raspar. Los números que desea no se muestran hasta que realmente desplaza los elementos individuales con el mouse.

Para obtener los datos que necesita

  1. Encuentra una lista de todos los puntos
  2. Para cada punto en dots_list, haga clic o pase el cursor (cadenas de acción) el punto
  3. Raspe los valores en la información sobre herramientas que aparece

Esto funciona para mí:

 from __future__ import print_function from pprint import pprint as pp from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains def main(): driver = webdriver.Chrome() ac = ActionChains(driver) try: driver.get("https://opensignal.com/reports/2016/02/state-of-lte-q4-2015/") dots_css = "div#network_download g g.dots_container circle" dots_list = driver.find_elements_by_css_selector(dots_css) print("Found {0} data points".format(len(dots_list))) download_speeds = list() for index, _ in enumerate(dots_list, 1): # Because this is an SVG chart, and because we need to hover it, # it is very likely that the elements will go stale as we do this. For # that reason we need to require each dot element right before we click it single_dot_css = dots_css + ":nth-child({0})".format(index) dot = driver.find_element_by_css_selector(single_dot_css) dot.click() # Scrape the text from the popup popup_css = "div#network_download div.tooltip" popup_text = driver.find_element_by_css_selector(popup_css).text pp(popup_text) rank, comp_and_country, speed = popup_text.split("\n") company, country = comp_and_country.split(" in ") speed_dict = { "rank": rank.split(" Globally")[0].strip("#"), "company": company, "country": country, "speed": speed.split("Download speed: ")[1] } download_speeds.append(speed_dict) # Hover away from the tool tip so it clears hover_elem = driver.find_element_by_id("network_download") ac.move_to_element(hover_elem).perform() pp(download_speeds) finally: driver.quit() if __name__ == "__main__": main() 

Salida de muestra:

 (.venv35) ➜ stackoverflow python svg_charts.py Found 182 data points '#1 Globally\nSingTel in Singapore\nDownload speed: 40 Mbps' '#2 Globally\nStarHub in Singapore\nDownload speed: 39 Mbps' '#3 Globally\nSaskTel in Canada\nDownload speed: 35 Mbps' '#4 Globally\nOrange in Israel\nDownload speed: 35 Mbps' '#5 Globally\nolleh in South Korea\nDownload speed: 34 Mbps' '#6 Globally\nVodafone in Romania\nDownload speed: 33 Mbps' '#7 Globally\nVodafone in New Zealand\nDownload speed: 32 Mbps' '#8 Globally\nTDC in Denmark\nDownload speed: 31 Mbps' '#9 Globally\nT-Mobile in Hungary\nDownload speed: 30 Mbps' '#10 Globally\nT-Mobile in Netherlands\nDownload speed: 30 Mbps' '#11 Globally\nM1 in Singapore\nDownload speed: 29 Mbps' '#12 Globally\nTelstra in Australia\nDownload speed: 29 Mbps' '#13 Globally\nTelenor in Hungary\nDownload speed: 29 Mbps' <...> [{'company': 'SingTel', 'country': 'Singapore', 'rank': '1', 'speed': '40 Mbps'}, {'company': 'StarHub', 'country': 'Singapore', 'rank': '2', 'speed': '39 Mbps'}, {'company': 'SaskTel', 'country': 'Canada', 'rank': '3', 'speed': '35 Mbps'} ... ] 

Debe tenerse en cuenta que los valores a los que hizo referencia en la pregunta, en los elementos del círculo, no son particularmente útiles, ya que solo especifican cómo dibujar los puntos dentro del gráfico SVG.