LoginSignup
20
20

More than 5 years have passed since last update.

ニコニコ動画のタグ検索結果をXML形式で取得する。(ログイン不要)

Last updated at Posted at 2014-04-29

概要

ニコニコ動画のタグ検索結果を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

出力イメージ

感想

百合文化発展のためにデータ分析しなきゃ……(使命感)

参考ページ

-> ニコニコ動画のsearch API仕様整理
-> i.nicovideo.jp APIとgetthumbinfo APIの比較
-> ニコニコ動画の検索APIについて調べたのでメモ
-> ニコニコ動画のタグ検索結果をRSSで取得する

20
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
20