

困りごとは、表題の通りです。

こちらがやりたいことです。  
＊追記：print 文が2系のものになっているという指摘を受けましたが、  
どのように修正すれば良いかわかりません。宜しくお願いします

PythonでマイニングプールからのハッシュレートをAPIで取得してJSONから表示

[code]

    #python3
    
    -*- coding: utf-8 -*-
    インポートするモジュール*-
    
    import urllib.request
    import urllib.parse
    import json
    import sys
    import codecs
    
    
    #python3
    webAPIからJSONの形式の文字列の結果をもらう
    def dataGet():
    
         URIスキーム
        url = ''
    
         URIパラメータのデータ 
        param = {
            'address': 'worker',    # 取得したい人のID
            'type': 'json'             # 取得するデータの指定
        }
    
         webAPIからのJSONを取得
        response = readObj.read()
    
         print type(response)  # >> <type 'str'>
    　
    # URIパラメータの文字列の作成
        paramStr = urllib.request(param)  # type=jsonと整形される
    
        return response
    
    webAPIから取得したデータをJSONに変換する
    def jsonConversion(jsonStr):
    
         webAPIから取得したJSONデータをpythonで使える形に変換する
        data = json.loads(jsonStr)
        return data
    
         日本語が u'\u767d' のようになってしまうため、Unicodeに変換する
         return json.dumps(data[0], ensure_ascii=False)
    
    
    if __name__ == '__main__':
    
        resStr = dataGet()
        res = jsonConversion(resStr)
    
        取得したデータを表示する
        for item in res:
            print(item.dataGet())
    
[/code]

上記のコードを実行したところ、

[code]

    #python3
     File "zec3.py", line 43, in <module>
        resStr = dataGet()
      File "zec3.py", line 25, in dataGet
        paramStr = urllib.request(param) 
      type=jsonと整形される
    TypeError: 'module' object is not callable
    
[/code]

というエラーが表示され、モジュールが読み込めないのは、わかったのですが、  
対処の仕方が分かりません。宜しくお願いします。


CC BY-SA 4.0
2018-11-15T10:07:05.233
50357
2020-10-28T04:02:05.200
2018-11-16T07:32:39.317
31003
31003
question
python3 json api
モジュールが読み込めないので、Python3でマイニングプールからのハッシュレートをAPIで表示できない


# エラーの原因

`urllib.request` はモジュールであるため、 `urllib.request(param)`
というような使い方が出来ません。`urllib.request.Request`や`urllib.request.urlopen`を組み合わせてリクエストを実行する必要があります。

# 正しい実装に向けて

ドキュメントを参照するか、比較的扱いやすい`requests`ライブラリを利用して作成し直すことをおすすめします。  
[21.6. urllib.request — URL を開くための拡張可能なライブラリ — Python 3.6.5
ドキュメント](https://docs.python.jp/3/library/urllib.request.html)  
[Requests: HTTP for Humans™ — Requests 2.20.1
documentation](http://docs.python-requests.org/en/master/)


CC BY-SA 4.0
2018-11-16T08:35:58.437
50379
2018-11-16T08:35:58.437
29826
50357
answer


書き直すと以下のようなコードでAPIを取得できると思います。WebAPIでJSON形式とわかっている場合はurllibで十分対応可能です。

[code]

    import urllib.request
    import urllib.parse
    import json
    
    def dataGet():
        # urlは空白だったので適当に書きました
        url = 'https://example.com/api'
        param = {
            'address': 'worker',    # 取得したい人のID
            'type': 'json'             # 取得するデータの指定
        }
    
        paramStr = urllib.parse.urlencode(param)
        req = urllib.request.Request(f'{url}?{paramStr}')
        with urllib.request.urlopen(req) as response:
            return json.load(response)
    
    res = dataGet()
    #resは、辞書型なのでjsonで整形してからプリントしています。また、`ensure_ascii=False`は、非ASCII文字をエスケープせずにそのまま出力しています。
    print(json.dumps(res, ensure_ascii=False, indent=2))
    
[/code]


CC BY-SA 4.0
2018-11-16T11:57:00.373
50383
2018-11-16T11:57:00.373
15171
50357
answer