从交互式ch中Web抓取数据

2024-04-27 18:15:07 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以在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元素,我没有把它们粘贴在这里。


Tags: 数据pathsvgnonestroke网站style图表
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:]]

请注意,这只能正常工作,因为Move和Line命令在此字符串中轮流执行。但看起来所有其他路径都是以类似的方式生成的(这使我更加强烈地认为数据集只是javascript文件中的某个地方,您还没有看到)。

最后,要获得此源代码,您应该研究如何使用urllib2进行编程检索。

对于这种情况,一个很好的选择是将selenium与一些类似Python中的Scrapy的工具相结合。我在下面的链接中编写了一个完整的示例:http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python/

相关问题 更多 >