Yahoo デベロッパーネットワークの API を使って知恵袋の質問とベストアンサーを取得してみます。API を利用するには アプリケーションIDが必要になりますが Yahoo! JAPAN ID があれば簡単に取得できます。
- 目次 -
スポンサーリンク
API
API の詳細は yahoo サイトで確認できますが、ポイントだけ何点か書いておきます。
-
リクエスト
検索キーワードを GET のパラメータで指定する -
レスポンス
質問とベストアンサーが XML 形式で返却される -
制限事項
取得可能な質問は 1000件まで
1回のリクエストで取得できる質問は 100件まで
ソース
質問を 100件づつ取得し、1000件に到達したら終了します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import xml.etree.ElementTree as ET import requests NAME_SPACE = '{urn:yahoo:jp:chiebukuro}' LIMIT = 1000 # 取得できる上限 1000件 MAX_PER_REQ = 100 # 1回のリクエストで取得できる上限 100件 def search_yahoo(params): # セッション s = requests.session() total = 0 while True: params['start'] = total + 1 params['results'] = MAX_PER_REQ if total + MAX_PER_REQ <= LIMIT else LIMIT - total r = s.get('http://chiebukuro.yahooapis.jp/Chiebukuro/V1/questionSearch', params=params) root = ET.fromstring(r.text.encode('utf-8')) res_available = root.get('totalResultsAvailable') # マッチした質問総数 res_returned = root.get('totalResultsReturned') # 取得件数 questions = root.findall('.//' + NAME_SPACE + 'Question') for question in questions: content = question.find(NAME_SPACE + 'Content').text bestanswer = question.find(NAME_SPACE + 'BestAnswer').text url = question.find(NAME_SPACE + 'Url').text postedDate = question.find(NAME_SPACE + 'PostedDate').text ansCount = question.find(NAME_SPACE + 'AnsCount').text yield content, bestanswer, url, ansCount, postedDate total += int(res_returned) if total >= min([LIMIT, int(res_available)]): break if __name__ == '__main__': params = {} params['appid'] = 'アプリケーションID' # 検索条件 params['condition'] = 'solved' # 状態 : 解決済み params['categoryid'] = '2078297918' # カテゴリ: 地域、旅行、お出かけ params['query'] = '北海道 旅行' for i, (content, bestanswer, url, ansCount, postedDate) in enumerate(search_yahoo(params)): print ('== {} : {} =========='.format(i, postedDate[0:10])) print (u'【質問】') print content print (u'【回答数 {}】'.format(ansCount)) print (u'【ベストアンサー】') print bestanswer print url print |
注意点
レスポンスの XML はネームスペース(xmlns)を指定しています。
1 |
<ResultSet xmlns="urn:yahoo:jp:chiebukuro" |
そのため、find や findall を使う場合は、タグ名の前に{urn:yahoo:jp:chiebukuro}を付ける必要があります。
結果
こんな感じで表示されます。(質問や回答の内容は省略しています)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
== 1 : 2017-01-13 ========== 【質問】 北海道旅行についてです! 今月の23日から行きます。車の運転が … 省略 【回答数 5】 【ベストアンサー】 札幌から中山峠を抜けて洞爺湖に至る道は…省略 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11169146841 == 2 : 2017-01-12 ========== 【質問】 北海道旅行をしたいのですが、おすすめの場所と時期を… 省略 【回答数 4】 【ベストアンサー】 北海道新幹線を利用するなら函館ですね。 函館というと… 省略 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13169128828 ・・・ |