我被要求绘制一个像这样的图表
使用Latex(更确切地说,tikz和/或pgf)。如果我有数据,这不会是一个问题,但我没有。我所拥有的只是可以显示图表的website,但我不知道如何从那里获取数据。
我今天花了一天时间试图获取这些数据,包括写入Google并使用一种跟踪线条并推断图形点的软件,例如Datathief和DigitizeIt,但我没有成功。我认为后者不起作用,因为图中的线条太薄而且有多个蓝色阴影。当然,我尝试使用Paint和Gimp来提高图像质量,但我仍然无法使其工作。
我也尝试过使用eps2pgf,这是一个将eps数字转换为pgf代码的Java脚本,但即使这样也不适用于我使用Image Capture(mac)和Print Screen(Windows)保存的图表,说实话是我的最后一个选择,因为它是一种“蛮力方法”,吐出一个你无法真正改进的丑陋代码。
毕竟我决定开始学习Python,因为我的主管,那个让我用tikz绘制这张图片的人说,有一个Python代码可以从这样的网站获取数据。现在我甚至不确定Python是否会完成这项工作(虽然我很高兴有借口学习它)当然,学习一门新语言并做类似的事情需要时间,所以我想知道是否真的有从该网站获取数据的方法,最好使用Python,但如果没有,则使用任何其他方法。
答案 0 :(得分:20)
好吧,如果Google为这些数据提供API,那就太好了!也就是说,您仍然可以从网站上删除一些数据。这是怎么回事......
安装Firebug
我更喜欢Firefox Firebug,但Chrome的开发者工具也应该有用。
<强>究强>
首先,让我们访问有问题的url并使用Firebug尝试看看发生了什么。使用F12激活Firebug或转到Tools-&gt; Firebug-&gt;打开Firebug。首先单击“网络”选项卡,然后重新加载页面。这显示了所有请求,并将为您提供有关网站工作原理的一些信息。通常,flash插件会在外部加载数据,而不是将其嵌入实际插件中,如果查看请求,您会看到标记为POST service
的请求。如果您将鼠标悬停在其上,则firebug会显示完整的网址,您会看到该网页向http://www.google.com/transparencyreport/traffic/service
发出了请求。您可以单击该请求,查看发送的标题,发布数据,响应和用于执行请求的cookie。
如果查看响应,您会看到看似错误的JSON。据我所知,这似乎包含规范化的交通数据点列表。你实际上可以从firebug中剪切并粘贴响应,但由于这是一个python问题,让我们的工作更加努力。
将数据导入Python
为了成功发布帖子请求,我们需要做(几乎)浏览器所做的一切。我们可以作弊,只需复制请求标头并从firebug发布数据,以欺骗真正的请求。
标题&amp;发布数据
使用三引号将多行字符串粘贴到shell中。复制请求标头并将其粘贴。
>>> headers = """ <paste headers> """
接下来将其转换为httplib2的dict。我将使用列表推导(基于换行符拆分字符串,然后在第一行拆分行:并删除尾随空格,这给出了dict
可以转换成的两个列表的列表一本字典),但你可以随心所欲地做到这一点。您也可以手动创建字典,我只是更快找到它。
>>> headers = dict([[s.strip() for s in line.split(':', 1)]
for line in headers.strip().split('\n')])
并复制帖子数据。
>>> body = """ <paste post data> """
提出请求 我将使用httplib2但是还有一些其他的http客户端和一些很好的工具来抓取网络,例如mechanize和scrapy。我们将使用API的URL,我们复制的标题以及我们从firebug复制的帖子数据来发出POST请求。请求返回响应头和内容的元组。
>>> import httplib2
>>> h = httplib2.Http()
>>> url = 'http://www.google.com/transparencyreport/traffic/service'
>>> resp, content = h.request(url, 'POST', body=body, headers=headers)
按摩数据
原始格式非常奇怪,只有顶部位似乎包含数据点,所以我会抛弃其余的。
>>> 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]
...或者只是保存它。
>>> with open('data.json', 'w') as f:
...: f.write(json.dumps(data))
我们也可以使用pyplot(或其他图形/绘图库)中的matplotlib绘制出来。
>>> import matplotlib.pyplot as plt
>>> plt.plot(data)
<强>结论强>
如果您只是对一些事情感兴趣,可以调整图表以显示您想要的内容,然后使用正确请求http://www.google.com/transparencyreport/traffic/service
使用的请求标题/发布数据。您可能希望比我更接近地检查实际响应,我只是丢弃了对我没有意义的部分。希望他们会公开这个数据的公共API。