【问题标题】:Scraping Google Finance (BeautifulSoup)抓取谷歌财经(BeautifulSoup)
【发布时间】:2017-12-28 18:41:31
【问题描述】:

我正在尝试抓取 Google Finance,并根据 Chrome 中的网页检查器获取“相关股票”表,该表的 ID 为“cc-table”,类为“gf-table”。 (示例链接:https://www.google.com/finance?q=tsla

但是当我运行 .find("table") 或 .findAll("table") 时,这个表没有出现。我可以在 Python 的 HTML 内容中找到带有表内容的 JSON 对象,但不知道如何获取它。有什么想法吗?

【问题讨论】:

    标签: python python-3.x web web-scraping beautifulsoup


    【解决方案1】:

    页面使用 JavaScript 呈现。有几种方法可以渲染和抓取它。

    我可以用 Selenium 刮掉它。 首先安装 Selenium:

    sudo pip3 install selenium
    

    那就找个驱动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())
    

    或者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())
    

    或者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())
    

    所有输出:

    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
    

    编辑

    QtWebKit 在 Qt 5.5 中被上游弃用并在 5.6 中被删除。

    你可以切换到 PyQt5.QtWebEngineWidgets

    【讨论】:

    • 你能说出几种渲染和抓取 javascript 的方法吗?我认为处理它的唯一方法是 Selenium。
    • @Mohamed 在我的示例中,我展示了使用 Dryscrape、使用 QtWebKit 和 selenium 的 PyQt5 的方法,您可以分别使用所有 3 个示例。 Dryscrape 是我的最爱,但不能在 Windows 上运行 PyQt5 是我的下一个最爱,但我发现 Selenium 很笨重。这里有 3 个示例,我希望还有其他的 checkout scrapy-splash 示例。
    • dryscrape 是否可以像 python 中的请求和类似工具一样让你在 google 上被禁止抓取? (即不使用任何代理)
    • 我在开发脚本时没有被禁止。我知道谷歌有先进的反机器人工具。如果您不想被禁止,可以尝试使用 Selenium 代理,请参阅我对 stackoverflow.com/questions/55130791/… 的回答
    【解决方案2】:

    大多数网站所有者不喜欢抓取工具,因为它们获取公司重视的数据,占用大量服务器时间和带宽,并且不提供任何回报。像 Google 这样的大公司可能会让整个团队使用各种方法来检测和阻止试图抓取数据的机器人。

    有几种方法可以解决这个问题:

    • 从另一个不太安全的网站上抓取。
    • 查看 Google 或其他公司是否有供公众使用的 API。
    • 使用更高级的抓取工具,例如 Selenium(可能仍会被 google 屏蔽)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 2011-09-14
      • 2020-10-09
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多