10

このようなグラフを描くように頼まれました

ここに画像の説明を入力してください

ラテックス(より正確には、tikzおよび/またはpgf)を使用します。データがあれば問題ありませんが、問題はありません。私が持っているのはグラフを表示できるウェブサイトだけですが、そこからデータを取得する方法がわかりません。

今日は、Googleへの書き込みや、DatathiefやDigitizeItなど、線をトレースしてグラフのポイントを推測するタイプのソフトウェアを使用するなど、このデータを取得しようとして1日を過ごしましたが、失敗しました。グラフの線が細すぎて複数の青の色合いがあるため、後者は機能しなかったと思います。もちろん、PaintとGimpを使って画質を改善しようとしましたが、それでもうまくいきませんでした。

また、epsの数字をpgfコードに変換するJavaスクリプトであるeps2pgfを使用してみましたが、Image Capture(mac)とPrint Screen(Windows)を使用して保存したグラフでは機能しませんでした。正直なところ、これが私の最後になります。これは「ブルートフォースアプローチ」であるため、実際には改善できない醜いコードを吐き出します。

結局、Pythonの学習を始めることにしました。なぜなら、tikzを使用してこの絵を描くように頼まれた上司が、このようなWebサイトからデータを取得するためのPythonコードがあると言ったからです。今ではPythonがその仕事をするかどうかさえわかりません(それを学ぶための言い訳には満足していますが)そしてもちろん新しい言語を学び、そのようなことをするのに時間がかかるので、本当にあるかどうか知りたいですできればPythonを使用して、そのWebサイトからデータを取得する方法。そうでない場合は、他の方法。

4

1 に答える 1

25

そうですね、Googleがこのデータ用のAPIを提供してくれたら素晴らしいと思います!そうは言っても、サイトから一部のデータを取得することはできます。これがそれについて行く方法です...

Firebugをインストールする

FirefoxにはFirebugが好きですが、Chromeの開発者ツールも機能するはずです。

まず最初に、問題のURLに アクセスし、Firebugを使用して何が起こっているかを確認しましょう。F12でFirebugをアクティブ化するか、[ツール]->[Firebug]->[Firebugを開く]に移動します。最初に[ネット]タブをクリックして、ページをリロードします。これにより、行われたすべてのリクエストが表示され、サイトがどのように機能するかについての洞察が得られます。通常、フラッシュプラグインは、実際のプラグインに埋め込まれているのではなく、外部でデータをロードします。リクエストを見ると、というラベルの付いたリクエストが表示されPOST serviceます。カーソルを合わせると、firebugに完全なURLが表示され、ページがにリクエストを送信したことがわかりますhttp://www.google.com/transparencyreport/traffic/service。リクエストをクリックして、送信されたヘッダー、投稿データ、レスポンス、リクエストの実行に使用されたCookieを確認できます。

詳細をリクエストする

応答を見ると、JSONの形式が正しくないように見えるものがわかります。私の知る限り、これには正規化された交通データポイントのリストが含まれているようです。実際にFirebugから応答を切り取って貼り付けることもできますが、これはPythonの質問なので、もう少し頑張ってみましょう。

データをPythonに取り込む

POSTリクエストを正常に行うには、ブラウザが実行するすべてのことを(ほぼ)実行する必要があります。実際のリクエストをスプーフィングするために、少しごまかしてリクエストヘッダーをコピーし、Firebugからデータを投稿することができます。

ヘッダーと投稿データ

三重引用符を使用して、複数行の文字列をシェルに貼り付けます。リクエストヘッダーをコピーして、に貼り付けます。 リクエストヘッダー

>>> headers = """ <paste headers> """

次に、それをhttplib2のdictに変換します。リスト内包表記(改行に基づいて文字列を分割し、最初の行を分割し、末尾の空白を削除dictして、辞書に変換できる2つの要素のリストのリストを作成します)を使用しますが、好きなようにこれを行うことができます。手動で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などのWebをスクレイピングするための優れたツールがいくつあります。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))

matplotlib(または他のグラフ/プロットライブラリ)のpyplotを使用してプロットすることもできます。

>>> import matplotlib.pyplot as plt
>>> plt.plot(data)

ピプロット

結論

いくつかのことに興味がある場合は、チャートを調整して必要なものを表示してから、適切なリクエストで使用されるリクエストヘッダー/投稿データを使用できますhttp://www.google.com/transparencyreport/traffic/service。実際の応答を私よりも詳しく調べたいと思うかもしれません。私には意味のない部分を破棄しただけです。うまくいけば、彼らはこのデータのパブリックAPIを公開するでしょう。

于 2011-05-07T11:45:03.033 に答える