抓取谷歌财经(BeautifulSoup)

Posted

技术标签:

【中文标题】抓取谷歌财经(BeautifulSoup)【英文标题】:Scraping Google Finance (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 对象,但不知道如何获取它。有什么想法吗?

【问题讨论】:

【参考方案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 代理,请参阅我对 ***.com/questions/55130791/… 的回答【参考方案2】:

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

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

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

【讨论】:

以上是关于抓取谷歌财经(BeautifulSoup)的主要内容,如果未能解决你的问题,请参考以下文章

谷歌财经,如何获取 JSON 数据流?

爬虫--python3.6+selenium+BeautifulSoup实现动态网页的数据抓取,适用于对抓取频率不高的情况

使用 BeautifulSoup 进行网页抓取(Google)[重复]

定期抓取雅虎财经

python: 带有 BeautifulSoup 的 Google 搜索刮板

Python_爬虫_BeautifulSoup网页解析库