Web从交互式图表中抓取数据

时间:2014-04-23 15:40:00

标签: python svg charts web-scraping

是否可以在this webpage中获取交互式图表背后的数据(抱歉,网站需要登录)?

当我用鼠标悬停在图表上时,数据会显示,但我该如何获取数据?

以下是该网站的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 :(得分:2)

您必须解析该信息(并从您的标签中猜测,您将在python中执行此操作)。但是,快速查看Raphael documentation,我相当确定您可以用另一种更快的方式获取数据:数据必须作为javascript数组存在于某处。首先尝试寻找。

最终,根据此javascript数据,您发现的SVG会生成。如果您查看SVG Path element说明,您将看到如何解释这些ML定义,然后您应该能够将这些行解析为(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 ove和L ine命令轮流在这个字符串中。但它确实看起来所有其他路径都以类似的方式生成(这使我更强烈地思考数据集只是在您尚未查看的javascript文件中的某个位置)。

最后,要获取此源代码,您应该考虑使用urllib2进行编程检索。

答案 1 :(得分:1)

这种情况的一个很好的选择是将硒与一些抓取工具(如Python中的Scrapy)相结合。我在以下链接中写了一个完整的示例:http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python/