【问题标题】:Scraping SVG charts抓取 SVG 图表
【发布时间】:2017-03-19 07:46:57
【问题描述】:

我正在尝试从以下链接中抓取以下 svg:

https://finance.yahoo.com/quote/AAPL/analysts?p=AAPL

我要抓取的部分如下:

Images Here

我不需要图表的文字(只需要图表本身)。但是,我以前从未刮过 svg 图像,我不确定这是否可能。我环顾四周,但找不到任何有用的 python 包来直接执行此操作。

我知道我可以使用 selenium 使用 python 截取图像,然后使用 PIL 对其进行裁剪并将其保存为 svg,但我想知道是否有更直接的方法可以从页面上抓取这些图表.任何有用的包或实现都会有所帮助。谢谢你。

编辑:得到了一些反对票,但不知道为什么这是我将如何以我的方式实现它..

import sys
import time
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

class Screenshot(QWebView):
def __init__(self):
    self.app = QApplication(sys.argv)
    QWebView.__init__(self)
    self._loaded = False
    self.loadFinished.connect(self._loadFinished)

def capture(self, url, output_file):
    self.load(QUrl(url))
    self.wait_load()
    # set to webpage size
    frame = self.page().mainFrame()
    self.page().setViewportSize(frame.contentsSize())
    # render image
    image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
    painter = QPainter(image)
    frame.render(painter)
    painter.end()
    print 'saving', output_file
    image.save(output_file)

def wait_load(self, delay=0):
    # process app events until page loaded
    while not self._loaded:
        self.app.processEvents()
        time.sleep(delay)
    self._loaded = False

def _loadFinished(self, result):
    self._loaded = True

s = Screenshot()
s.capture('https://finance.yahoo.com/quote/AAPL/analysts?p=AAPL', 'yhf.png')

然后我会使用 PIL 中的裁剪功能将图像从图表中取出。

【问题讨论】:

  • 所以您只需要获取该 svg 文件并将其转换为 png?
  • 您的问题是这些 SVG 是由 Javascript 生成的。任何解决方案不仅涉及加载 HTML,还涉及在从 DOM 中提取内联 SVG 之前执行页面上的所有 JS。一个简单的 HTML 抓取工具无法满足您的需求。

标签: python svg web-scraping yahoo-finance


【解决方案1】:

使用 QWebView 进行网络抓取对我来说很奇怪,尽管我确实意识到它对服务器说“我不是网络抓取工具,我是嵌入式浏览器”有一个优势。请注意,这种方法并非万无一失:如果您的抓取工具显示出人类用户不寻常的行为,仍然可以检测到它。

我会这样做:

  1. 我使用requests 下载页面(可能通过隐藏您的真实 IP 地址的代理来对抗 ip-bans)。
  2. 然后我会使用BeautifulSoup 解析页面以获取您尝试获取的 svg 文件的 url。
  3. 然后我会下载 svg 文件并使用 something like this 将其转换为图像

如果您想继续使用 Qt,请在 Web 视图中查找允许检查 DOM 或提取视图下载的资源的方法。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2021-11-17
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多