从互动图表中抓取数据
能不能获取到这个网页上互动图表背后的数据呢?(抱歉,这个网站需要登录才能访问)
当我用鼠标悬停在图表上时,数据会显示出来,但我该怎么获取这些数据呢?
下面是这个网站的一部分HTML源代码:
<svg height="460" version="1.1" width="1037" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: relative; left: -0.5px;">
<desc>Created with Raphaël 2.1.0</desc>
<defs>
<path style="" fill="none" stroke="#f1f1f1" d="M20,130L1017,130M20,159.66666666666666L1017,159.66666666666666M20,189.33333333333331L1017,189.33333333333331M20,219L1017,219M20,248.66666666666666L1017,248.66666666666666M20,278.3333333333333L1017,278.3333333333333M20,308L1017,308">
<path style="" fill="none" stroke="#f1f1f1" d="M295.0344827586207,130L295.0344827586207,337.66666666666663M295.0344827586207,365L295.0344827586207,415M535.6896551724138,130L535.6896551724138,337.66666666666663M535.6896551724138,365L535.6896551724138,415M776.3448275862069,130L776.3448275862069,337.66666666666663M776.3448275862069,365L776.3448275862069,415M1017,130L1017,337.66666666666663M1017,365L1017,415">
<path style="" fill="none" stroke="#cccccc" d="M17,337.66666666666663L1018,337.66666666666663">
<path style="" fill="none" stroke="#cccccc" d="M17,365L1018,365">
<rect x="20" y="130" width="997" height="207.66666666666666" r="0" rx="0" ry="0" fill="#ff0000" stroke="none" style="opacity: 0;" opacity="0">
<path style="" fill="none" stroke="#6e87d7" d="M20,281.030303030303L54.37931034482759,316.6902356902357L88.75862068965517,318.78787878787875L123.13793103448276,318.78787878787875L157.51724137931035,318.78787878787875L191.89655172413794,312.4949494949495L226.27586206896552,285.2255892255892L260.65517241379314,312.4949494949495L295.0344827586207,314.59259259259255L329.41379310344826,316.6902356902357L363.7931034482759,297.8114478114478L398.1724137931035,318.78787878787875L432.55172413793105,335.56902356902356L466.9310344827586,293.61616161616155L501.3103448275862,276.8350168350168L535.6896551724138,272.6397306397306L570.0689655172414,274.7373737373737L604.448275862069,272.6397306397306L638.8275862068965,216.00336700336698L673.2068965517242,216.00336700336698L707.5862068965517,239.07744107744105L741.9655172413793,281.030303030303L776.344827586207,144.68350168350165L810.7241379310345,245.37037037037032L845.1034482758621,239.07744107744105L879.4827586206897,247.46801346801345L913.8620689655172,245.37037037037032L948.2413793103449,245.37037037037032L982.6206896551724,207.61279461279457L1017,163.56228956228955" stroke-width="2">
<path style="" fill="none" stroke="#f1f1f1" d="M20,390L1017,390M20,415L1017,415">
<path style="opacity:
还有很多很多这样的path
元素,我没有在这里粘贴出来。
2 个回答
0
在这种情况下,一个不错的选择是把Selenium和一些像Scrapy这样的抓取工具结合起来使用,都是用Python编写的。
2
你需要解析这些信息(根据你的标签,我猜你想用Python来做这个)。不过,我简单看了一下Raphael的文档,我觉得你可以用更快的方法获取数据:这些数据应该在某个地方以JavaScript数组的形式存在。你可以先去找找这个数组。
最终,你找到的SVG就是从这些JavaScript数据生成的。如果你查看SVG路径元素的描述,你会看到那些M
和L
的定义是怎么被解释的,然后你就能把这些线解析成你想要的(Python)数据集。
不过,我想再强调一下,没有任何图片作为参考,我们很难找到你想要的东西(比如,它是直方图还是折线图?)。用L
画出的线可能就是你需要的全部。
举个例子,如果你在Python环境中使用你列出的第一个路径,你可以这样做:
svg_string = "M20,130L1017,130M20,159.66666666666666L1017,159.66666666666666M20,189.33333333333331L1017,189.33333333333331M20,219L1017,219M20,248.66666666666666L1017,248.66666666666666M20,278.3333333333333L1017,278.3333333333333M20,308L1017,308"
import re
data = [map(float, xy.split(',')) for xy in re.split('[ML]', svg_string)[1:]]
请注意,这样做之所以有效,是因为M
和L
命令在这个字符串中交替出现。但看起来其他路径也是以类似的方式生成的(这让我更相信数据集就在你还没查看的某个JavaScript文件里)。
最后,要获取这个源代码,你可以考虑使用urllib2来进行程序化的获取。