Scraping Google Finance (BeautifulSoup)

Estoy intentando eliminar Google Finance y obtener la tabla “Acciones relacionadas”, que tiene la identificación “cc-table” y la clase “gf-table” basada en el inspector de páginas web en Chrome. (Enlace de muestra: https://www.google.com/finance?q=tsla )

Pero cuando ejecuto .find (“tabla”) o .findAll (“tabla”), esta tabla no aparece. Puedo encontrar objetos con apariencia de JSON con el contenido de la tabla en el contenido HTML en Python, pero no sé cómo obtenerlo. ¿Algunas ideas?

La página está renderizada con JavaScript. Hay varias formas de renderizarlo y rasparlo.

Puedo rasparlo con selenium. Primero instale Selenium:

sudo pip3 install selenium 

Luego obtenga un controlador https://sites.google.com/a/chromium.org/chromedriver/downloads

 import bs4 as bs from selenium import webdriver browser = webdriver.Chrome() url = ("https://www.google.com/finance?q=tsla") browser.get(url) html_source = browser.page_source browser.quit() soup = bs.BeautifulSoup(html_source, "lxml") for el in soup.find_all("table", {"id": "cc-table"}): print(el.get_text()) 

Alternativamente PyQt5

 from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWebKit import * from PyQt5.QtWebKitWidgets import QWebPage from PyQt5.QtWidgets import QApplication import bs4 as bs import sys class Render(QWebPage): def __init__(self, url): self.app = QApplication(sys.argv) QWebPage.__init__(self) self.loadFinished.connect(self._loadFinished) self.mainFrame().load(QUrl(url)) self.app.exec_() def _loadFinished(self, result): self.frame = self.mainFrame() self.app.quit() url = "https://www.google.com/finance?q=tsla" r = Render(url) result = r.frame.toHtml() soup = bs.BeautifulSoup(result,'lxml') for el in soup.find_all("table", {"id": "cc-table"}): print(el.get_text()) 

Alternativamente Dryscrape

 import bs4 as bs import dryscrape url = "https://www.google.com/finance?q=tsla" session = dryscrape.Session() session.visit(url) dsire_get = session.body() soup = bs.BeautifulSoup(dsire_get,'lxml') for el in soup.find_all("table", {"id": "cc-table"}): print(el.get_text()) 

toda la salida:

 Valuation▲▼Company name▲▼Price▲▼Change▲▼Chg %▲▼d | m | y▲▼Mkt Cap▲▼TSLATesla Inc328.40-1.52-0.46%53.69BDDAIFDaimler AG72.94-1.50-2.01%76.29BFFord Motor Company11.53-0.17-1.45%45.25BGMGeneral Motors Co...36.07-0.34-0.93%53.93BRNSDFRENAULT SA EUR3.8197.000.000.00%28.69BHMCHonda Motor Co Lt...27.52-0.18-0.65%49.47BAUDVFAUDI AG NPV840.400.000.00%36.14BTMToyota Motor Corp...109.31-0.53-0.48%177.79BBAMXFBAYER MOTOREN WER...94.57-2.41-2.48%56.93BNSANYNissan Motor Co L...20.400.000.00%42.85BMMTOFMITSUBISHI MOTOR ...6.86+0.091.26%10.22B 

EDITAR

QtWebKit quedó obsoleto en la versión anterior en Qt 5.5 y se eliminó en 5.6.

Puede cambiar a PyQt5.QtWebEngineWidgets

A la mayoría de los propietarios de sitios web no les gustan los “raspadores” porque toman los datos que valora la compañía, utilizan una gran cantidad de tiempo y ancho de banda de su servidor y no dan nada a cambio. Las grandes empresas como Google pueden tener equipos enteros que emplean una gran cantidad de métodos para detectar y bloquear bots que intentan raspar sus datos.

Hay varias maneras de evitar esto:

  • Raspar de otro sitio web menos seguro.
  • Ver si Google u otra compañía tiene una API para uso público.
  • Use un raspador más avanzado como Selenium (y probablemente aún esté bloqueado por Google).