[英]python: getting npm package data from a couchdb endpoint
我想獲取npm包元數據。 我發現此端點為我提供了所需的所有元數據。
我編寫了以下腳本來獲取此數據。 我的計划是選擇一些特定的鍵並將該數據添加到某些數據庫中(我也可以將其存儲在json文件中,但是數據很大)。 我做了以下腳本來獲取數據:
import requests
import json
import sys
db = 'https://replicate.npmjs.com';
r = requests.get('https://replicate.npmjs.com/_all_docs', headers={"include_docs" : "true"})
for line in r.iter_lines():
# filter out keep-alive new lines
if line:
print(line)
decoded_line = line.decode('utf-8')
print(json.loads(decoded_line))
注意,我什至不包括all-docs
,但它會陷入無限循環。 我認為這是因為數據巨大。
看看-https://replicate.npmjs.com/_all_docs的輸出標題
給我以下輸出:
{"total_rows":1017703,"offset":0,"rows":[
{"id":"0","key":"0","value":{"rev":"1-5fbff37e48e1dd03ce6e7ffd17b98998"}},
{"id":"0-","key":"0-","value":{"rev":"1-420c8f16ec6584c7387b19ef401765a4"}},
{"id":"0----","key":"0----","value":{"rev":"1-55f4221814913f0e8f861b1aa42b02e4"}},
{"id":"0-1-project","key":"0-1-project","value":{"rev":"1-3cc19950252463c69a5e717d9f8f0f39"}},
{"id":"0-100","key":"0-100","value":{"rev":"1-c4f41a37883e1289f469d5de2a7b505a"}},
{"id":"0-24","key":"0-24","value":{"rev":"1-e595ec3444bc1039f10c062dd86912a2"}},
{"id":"0-60","key":"0-60","value":{"rev":"2-32c17752acfe363fa1be7dbd38212b0a"}},
{"id":"0-9","key":"0-9","value":{"rev":"1-898c1d89f7064e58f052ff492e94c753"}},
{"id":"0-_-0","key":"0-_-0","value":{"rev":"1-d47c142e9460c815c19c4ed3355d648d"}},
{"id":"0.","key":"0.","value":{"rev":"1-11c33605f2e3fd88b5416106fcdbb435"}},
{"id":"0.0","key":"0.0","value":{"rev":"1-5e541d4358c255cbcdba501f45a66e82"}},
{"id":"0.0.1","key":"0.0.1","value":{"rev":"1-ce856c27d0e16438a5849a97f8e9671d"}},
{"id":"0.0.168","key":"0.0.168","value":{"rev":"1-96ab3047e57ca1573405d0c89dd7f3f2"}},
{"id":"0.0.250","key":"0.0.250","value":{"rev":"1-c07ad0ffb7e2dc51bfeae2838b8d8bd6"}},
注意,所有文檔都從第二行開始(即,所有文檔都是“行”鍵值的一部分)。 現在,我的問題是如何僅獲取“行”鍵的值(即所有文檔)。 我出於類似目的找到了此存儲庫,但由於我是JavaScript的初學者,因此無法使用/轉換它。
如果get()
的參數中沒有stream=True
,則在循環開始之前 ,所有數據都將下載到內存中。
然后是一個問題,至少這些行本身不是有效的JSON。 ijson
,您將需要像ijson
這樣的增量JSON解析器。 ijson
又希望像這是不容易從所獲得的目標文件requests.Response
,所以我會用urllib
從這里Python標准庫:
#!/usr/bin/env python3
from urllib.request import urlopen
import ijson
def main():
with urlopen('https://replicate.npmjs.com/_all_docs') as json_file:
for row in ijson.items(json_file, 'rows.item'):
print(row)
if __name__ == '__main__':
main()
有沒有理由在迭代這些行之前不解碼json?
你可以嘗試一下:
import requests
import json
import sys
db = 'https://replicate.npmjs.com';
r = requests.get('https://replicate.npmjs.com/_all_docs', headers={"include_docs" : "true"})
decoded_r = r.decode('utf-8')
data = json.loads(decoded_r)
for row in data.rows:
print(row.key)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.