2016-03-19 12 views
-1

APIからデータを収集し、それをcsvファイルに追加するスクリプト(Python 2.7.11、Windows 10)を作成しようとしています。apiからデータを読み込み、.csvバグを埋め込むバグ

私が使用したいAPIはjsonでデータを返します。 表示されているレコードの数を制限してページングします。 したがって、単一のクエリで取得できるレコードの最大数があり、ページ番号を変更して別のクエリを実行する必要があります。

APIは、データセットが分割されているページ数を通知します。 のは、ページあたりのレコードの最大#は100で、ページのNRであると仮定しましょう2.

マイスクリプト:

import json 
import urllib2 
import csv 

url = "https://some_api_address?page=" 
limit = "&limit=100" 
myfile = open('C:\Python27\myscripts\somefile.csv', 'ab') 

def api_iterate(): 
    for i in xrange(1, 2, 1): 
     parse_url = url,(i),limit 
     json_page = urllib2.urlopen(parse_url) 
     data = json.load(json_page) 
     for item in data['someobject']: 
      print item ['some_item1'], ['some_item2'], ['some_item3'] 
      f = csv.writer(myfile) 
     for row in data: 
      f.writerow([str(row)]) 

これは動作するようには思えないが、つまりそれは、CSVファイルを作成しますが、ファイルにデータが入力されません。明らかに、クエリーのアドレスを作成するスクリプトの部分、またはjsonを読み込む部分、またはcsvにクエリーを書き込む部分を処理する部分に問題があります。またはそれらのすべて。

私は他のリソースとチュートリアルを使用しようとしましたが、ある時点で私は立ち往生しました。あなたの助けに感謝します。

+2

この 'api_iterate'関数を呼び出していますか? – alecxe

+0

実際のURLとは何ですか?あなたが持っているスクリプトには、それが動作しなくなる多くの問題があります。 –

+0

あなたの助けてくれてありがとう@alecxe - いいえ、私はこのポストを書いた時点でそれを呼んでいないが、私はすべきことを理解した。申し訳ありません、私はちょうどそれと遊び始めています。しかしそれは何も変わらなかった。 – Jan

答えて

0

あなたが指定したURLは、次のページへのリンクをオブジェクトの1つとして提供します。これを使用して、すべてのページにわたって自動的に反復処理することができます。

以下のスクリプトは、各ページを取得Dataobject配列からのエントリーのうちの2つを抽出し、output.csvファイルに書き込みます:

id,url 
1347854,https://api-v3.mojepanstwo.pl/dane/krs_osoby/1347854 
1296239,https://api-v3.mojepanstwo.pl/dane/krs_osoby/1296239 
705217,https://api-v3.mojepanstwo.pl/dane/krs_osoby/705217 
802970,https://api-v3.mojepanstwo.pl/dane/krs_osoby/802970  
:これはあなたのような何かを探して、出力ファイルが得られます

import json 
import urllib2 
import csv 


def api_iterate(myfile): 
    url = "https://api-v3.mojepanstwo.pl/dane/krs_osoby" 
    csv_myfile = csv.writer(myfile) 
    cols = ['id', 'url'] 
    csv_myfile.writerow(cols)  # Write a header 

    while True: 
     print url 
     json_page = urllib2.urlopen(url) 
     data = json.load(json_page) 
     json_page.close() 

     for data_object in data['Dataobject']: 
      csv_myfile.writerow([data_object[col] for col in cols]) 

     try: 
      url = data['Links']['next']  # Get the next url 
     except KeyError as e: 
      break 

with open(r'e:\python temp\output.csv', 'wb') as myfile: 
    api_iterate(myfile) 

+0

ありがとう@マーティンエバンス、これは素晴らしいです。私はあなたのソリューションの背後にある論理を完全に理解しています。私はまだそれがうまくいかなかったことを除いて、私が何が間違っていたのかまだ分かっていないと言いました。私は自分自身でそれを理解しなければなりません..とにかく、ありがとう。 – Jan

+0

em ..別のAPI(適切な変更を加えた)にアクセスするためにあなたのコードを使用しようとしましたが、コードが機能しないので、まだそれを取得しないようです。別の質問として投稿するか、このスレッド内であなたを気にすることはできますか? – Jan

+0

おそらく別の質問としては良いでしょう。チャンスはjsonのレイアウトが違うか、おそらく "次の"要素を与えないため、別の解決策が必要になります。このページにリンクしてください。 –

関連する問題