python - soup - web scraping tutorial




Schaben Google Finanzen(BeautifulSoup) (2)

Ich versuche Google Finance zu kratzen und erhalte die Tabelle "Verwandte Aktien" mit der ID "cc-table" und der Klasse "gf-table" auf der Grundlage des Webseiten-Inspektors in Chrome. (Beispiellink: https://www.google.com/finance?q=tsla )

Aber wenn ich .find ("table") oder .findAll ("table") laufe, erscheint diese Tabelle nicht. Ich finde JSON-aussehende Objekte mit dem Inhalt der Tabelle im HTML-Inhalt in Python, weiß aber nicht, wie ich es bekommen kann. Irgendwelche Ideen?


Die Seite wird mit JavaScript gerendert. Es gibt mehrere Möglichkeiten, es zu rendern und zu kratzen.

Ich kann es mit Selen kratzen. Installieren Sie zuerst Selen:

sudo pip3 install selenium

Dann hol dir einen Treiber 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())

Alternativ 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())

Alternativ 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())

alle Ausgabe:

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

Die meisten Website-Besitzer mögen keine Scraper, weil sie Daten, die das Unternehmen wertet, nehmen, verbrauchen einen ganzen Haufen ihrer Server-Zeit und Bandbreite und geben nichts zurück. Große Unternehmen wie Google können ganze Teams einsetzen, die eine ganze Reihe von Methoden einsetzen, um Bots zu erkennen und zu blockieren, die versuchen, ihre Daten zu kratzen.

Es gibt mehrere Möglichkeiten, dies zu umgehen:

  • Kratzen Sie von einer anderen, weniger gesicherten Website.
  • Überprüfen Sie, ob Google oder ein anderes Unternehmen eine API für die öffentliche Nutzung hat.
  • Verwenden Sie einen fortschrittlicheren Schaber wie Selenium (und wahrscheinlich immer noch von Google blockiert werden).






beautifulsoup