#概要
ニコニコ動画のタグ検索結果をXML形式で取得する。
既存の検索APIがあるそうだが、ログイン必須で使いにくい。
(→参考記事:ニコニコ動画のsearch API仕様整理)
ログインなしで使う為のPythonコードを書いた。
※既存の検索APIでは51ページ以上は取得できないが、この方法なら取得できると思われる。
#コード
nc2xml.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# nc2xml.py
# Copyright (c) 2014 nezuq
# This software is released under the MIT License.
# http://opensource.org/licenses/mit-license.php
import sys
import time
import datetime
import urllib
import urllib2
from lxml import etree
argvs = sys.argv
argc = len(argvs)
#検索キーワード
KEYWORD = u'キマシタワー'
if 1 < argc:
KEYWORD = argvs[1].decode('utf-8')
#ソート基準
#SORT_TYPE = 'n' #最新コメント投稿日時
#SORT_TYPE = 'v' #再生数
#SORT_TYPE = 'm' #マイリスト
#SORT_TYPE = 'r' #コメント数
SORT_TYPE = 'f' #投稿日時
#SORT_TYPE = 'l' #再生時間
if 2 < argc:
SORT_TYPE = argvs[2]
#対象ページ番号(ID取得開始ページ)
MIN_PAGENUMBER = 1
if 3 < argc:
MIN_PAGENUMBER = int(argvs[3])
#対象ページ番号(ID取得終了ページ)
MAX_PAGENUMBER = 3
if 4 < argc:
MAX_PAGENUMBER = int(argvs[4])
#検索方法
SEARCH_TYPE = 'tag' #タグ検索
def main():
keyword = urllib2.quote(KEYWORD.encode("utf-8"))
ids = []
nrow_bef = -1
npage = MIN_PAGENUMBER - 1
while ((nrow_bef != len(ids)) and (npage < MAX_PAGENUMBER)):
npage += 1
uri = 'http://www.nicovideo.jp/%s/%s?sort=%s&rss=2.0&page=%d' % (SEARCH_TYPE, keyword, SORT_TYPE, npage)
print u'動画ID問合せ中 : ' + uri
time.sleep(1)
res = urllib2.urlopen(uri)
rss = etree.fromstring(res.read())
nrow_bef = len(ids)
ids += map((lambda x: x.text.rsplit('/', 1)[1]), rss.findall('./channel/item/link'))
query = 'http://i.nicovideo.jp/v3/video.array?v=' + ','.join(ids)
print u'動画データ取得中 : ' + query
d = datetime.datetime.today()
# ※問い合わせに20秒以上かかる場合はタイムアウトし、0件となる。
# ※負荷がかかるクエリを発行するのはIPブロックやAPI封鎖の可能性もあるのでNG。
time.sleep(1)
urllib.urlretrieve(query, u'%s_%s.xml' % (KEYWORD, d.strftime('%y%m%d%H%M%S')))
print 'end!'
if __name__ == '__main__':
main()
nc2xml.pyを実行する。
python nc2xml.py "百合" m 1 3
#出力イメージ
http://i.nicovideo.jp/v3/video.array?v=sm9720246,sm19673281
#感想
百合文化発展のためにデータ分析しなきゃ……(使命感)
#参考ページ
-> ニコニコ動画のsearch API仕様整理
-> i.nicovideo.jp APIとgetthumbinfo APIの比較
-> ニコニコ動画の検索APIについて調べたのでメモ
-> ニコニコ動画のタグ検索結果をRSSで取得する