Python 从网站上显示的图表中获取数据

Python 从网站上显示的图表中获取数据,python,latex,tikz,Python,Latex,Tikz,我被要求画一张这样的图表 使用乳胶(更准确地说,是tikz和/或pgf)。如果我有数据,这不会是个问题,但我没有。我所拥有的只是从哪里可以显示图形,但我不知道如何从那里获取数据 今天我花了一整天的时间试图获取这些数据,包括给谷歌写信,使用一种软件追踪线条并推断图形的点,比如data小偷和DigitalEIT,但我没有成功。我认为后者不起作用,因为图表中的线条太细,并且有多个蓝色阴影。当然,我试着用画笔和Gimp来提高画质,但还是没能成功 我也尝试过使用eps2pgf,一个将eps图形转换为pg

我被要求画一张这样的图表

使用乳胶(更准确地说,是tikz和/或pgf)。如果我有数据,这不会是个问题,但我没有。我所拥有的只是从哪里可以显示图形,但我不知道如何从那里获取数据

今天我花了一整天的时间试图获取这些数据,包括给谷歌写信,使用一种软件追踪线条并推断图形的点,比如data小偷和DigitalEIT,但我没有成功。我认为后者不起作用,因为图表中的线条太细,并且有多个蓝色阴影。当然,我试着用画笔和Gimp来提高画质,但还是没能成功

我也尝试过使用eps2pgf,一个将eps图形转换为pgf代码的Java脚本,但即使这样,对于我使用图像捕获(mac)和打印屏幕(Windows)保存的图形也不起作用,老实说,这将是我的最后一个选择,因为这是一种“暴力方法”,吐出了一个你无法真正改进的丑陋代码


毕竟,我决定开始学习Python,因为我的主管,要求我使用tikz绘制这幅图的人说,有一个Python代码可以从这样的网站获取数据。现在我甚至不确定Python是否能胜任这项工作(尽管我很高兴能找到学习它的借口),当然学习一门新语言和做类似的事情需要时间,所以我想知道是否真的有办法从该网站获取数据,最好使用Python,但如果没有,还有其他方法。

,如果谷歌能为这些数据提供一个API,那就太好了!也就是说,您仍然可以从站点中获取一些数据。下面是如何去做的

安装Firebug

我更喜欢Firefox,但Chrome的开发工具也应该可以使用

调查 首先,让我们访问有问题的,并使用Firebug尝试看看发生了什么。使用F12激活Firebug或进入工具->Firebug->打开Firebug。首先单击“网络”选项卡并重新加载页面。这将显示所有请求,并将让您了解网站的工作方式。通常flash插件从外部加载数据,而不是将数据嵌入实际的插件中,如果查看请求,您将看到标记为
POST-service
的请求。如果您将鼠标悬停在它上面,firebug将显示完整的url,您将看到请求
http://www.google.com/transparencyreport/traffic/service
。您可以单击请求并查看发送的标题、post数据、响应以及用于执行请求的cookie

如果查看响应,您将看到格式错误的JSON。据我所知,这似乎包含标准化交通数据点列表。实际上,您可以从firebug中剪切和粘贴响应,但由于这是一个python问题,让我们更加努力地工作

将数据导入Python

要成功发出post请求,我们需要(几乎)完成浏览器所做的一切。我们可以进行一些欺骗,只需复制请求头并从firebug发布数据,就可以欺骗真正的请求

标题和帖子数据

使用三重引号将多行字符串粘贴到shell中。复制请求头并将其粘贴到中。

并在post中复制数据。

按摩数据

原始格式非常奇怪,只有最上面的一位似乎包含数据点,所以我将舍弃其余部分

>>> cleaned = content.split("'")[0][4:-1] + ']' 
既然它是有效的JSON,那么我们可以将它反序列化为本机python数据类型

>>> import json
>>> data = json.loads(cleaned)
我感兴趣的所有点都是浮点数,因此我将基于浮点数进行过滤

>>> data = [x for x in data if type(x) == float]
处理/保存数据

现在我们有了数据,检查它,做额外的处理,等等

>>> data[:5] 
<<< 
[44.73874282836914,
 45.4061279296875,
 47.5350456237793,
 44.56114196777344,
 46.08817672729492]
我们也可以使用from(或其他一些绘图/绘图库)绘制出来

结论


如果您只是对一些事情感兴趣,您可以调整图表以显示所需内容,然后使用适当请求使用的请求标题/post数据
http://www.google.com/transparencyreport/traffic/service
。你可能会想比我更仔细地检查实际响应,我只是丢弃了对我来说没有意义的部分。希望他们能为这些数据公开一个公共API。

看起来它正在用于显示。而且,如果您使用DOM检查器深入页面,您会在图表的
flashVars
中发现一大堆可怕的数据。不是答案,但可能有用。@mu太短了,谢谢。我安装了一个Dom检查器(我以前从未听说过),并试图找到您提到的内容,但到目前为止什么都没有。这里很晚了,但我明天早上再去。即使这不是一个完整的答案,我相信它会有帮助,我也很感谢这些指针。@mu太短了,我使用的是Firefox的DOM检查器,但当我醒来时,我看到了zeekay的答案,并遵循它,它工作得非常完美!现在我只需要用tikz来绘制它!你的答案解释得很好,也很详细,就连我,一个十足的傻瓜,也能得到数据。你干得很出色,帮了我很多忙。多谢各位。不过,我可以建议你在回答中加一点吗?我花了大约30分钟试图弄清楚为什么命令“data=json.loads(cleaned)”不起作用,我想我没有这个库。在阅读了相关内容,找到了如何查看已安装库的列表后,我意识到我只需要导入json(愚蠢,我知道)!那么,你能添加这一行以防其他人使用它吗?再次感谢!不,真的,谢谢你。你真的花时间解释了一切。这可能花了你至少一个小时,这对一个你甚至不认识的人来说是一大笔钱,但是当你认为你救了我的时候
>>> cleaned = content.split("'")[0][4:-1] + ']' 
>>> import json
>>> data = json.loads(cleaned)
>>> data = [x for x in data if type(x) == float]
>>> data[:5] 
<<< 
[44.73874282836914,
 45.4061279296875,
 47.5350456237793,
 44.56114196777344,
 46.08817672729492]
>>> with open('data.json', 'w') as f:
...:     f.write(json.dumps(data))
>>> import matplotlib.pyplot as plt
>>> plt.plot(data)