芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

Python(requests)でニコニコ大百科内検索

Pythonスクリプトニコニコ大百科の単語検索が行えるスクリプトです.


import requests,pprint
from bs4 import BeautifulSoup as bs

def nico_search(p1,p2,query):
    def url_get(data):
        d = []
        for j in data:
            if len(j.find_all("a")) < 3:
                d.append({
                    "word":j.a.get_text(),
                    "url":"https://dic.nicovideo.jp"+j.a.get("href")
                    })
            else:
                d.append({
                    "word":j.a.get_text(),
                    "url":None,
                    "転送url":j.find_all("a")[-1].get("href")
                    })
        return d

    param1 = {
        "単語・生放送記事":"al",
        "単語記事":"a",
        "動画記事":"v",
        "商品記事":"i",
        "ユーザー記事":"u",
        "コミュ記事":"c",
        "生放送記事":"l",
        "全記事":"all",
        "お絵カキコ":"oekaki",
        "ピコカキコ":"mml"
        }
    param2 = {
        "タイトル":"t",
        "本文(記事)":"b",
        "タイトル・本文":"a"
        }

    wiki = "https://dic.nicovideo.jp/s/{0}/{1}/{2}".format(param1[p1],param2[p2],query)

    res = requests.get(url=wiki)
    sp=bs(res.content,"html.parser")

    try:
        page_num = sp.find("p",attrs={"class":"search-count_results"}).get_text().replace("検索結果: ","").replace("件","")
        page_num = int(page_num)
    except AttributeError:
        print("検索結果が1件もありませんでした")
        return None

    data = sp.find_all("div",attrs={"class":"search-table_title"})[1:]
    data_list = url_get(data)

    st_pg_contents = sp.find("div",attrs={"class":"st-pg_contents"}).find_all("a")
    if st_pg_contents:
        for i in st_pg_contents[:-1]:
            res = requests.get(url="https://dic.nicovideo.jp"+i.get("href"))
            sp=bs(res.content,"html.parser")
            data = sp.find_all("div",attrs={"class":"search-table_title"})[1:]
            data_list = data_list + url_get(data)

    else:
        pass

    pprint.pprint(data_list, indent=4)
    print("検索結果数:",page_num)
    print("取得ページ数:",len(data_list))
    return data_list
    

nico_search("単語・生放送記事","タイトル",input('search word:'))

試し実行すると以下のように出力されますよ. 第一と第二引数を変更すれば,検索範囲が変わるため,検索結果も異なります.

search word:楔前部
検索結果が1件もありませんでした
search word:平沢進
[   {   'url': 'https://dic.nicovideo.jp/a/%E5%B9%B3%E6%B2%A2%E9%80%B2',
        'word': '平沢進'},
    {   'url': 'https://dic.nicovideo.jp/a/%E7%A7%81%E3%81%AF%E5%B9%B3%E6%B2%A2%E9%80%B2%E3%81%A0%E3%81%9E%E3%80%82%E5%B9%B3%E6%B2%A2%E5%94%AF%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%80%82',
        'word': '私は平沢進だぞ。平沢唯じゃない。'},
    {   'url': 'https://dic.nicovideo.jp/a/aria%28%E5%B9%B3%E6%B2%A2%E9%80%B2%29',
        'word': 'Aria(平沢進)'},
    {   'url': None,
        'word': '平沢進MAD',
        '転送url': 'https://dic.nicovideo.jp/id/782908'},
    {   'url': None,
        'word': 'ヴォルキス・プロラデューク',
        '転送url': 'https://dic.nicovideo.jp/id/143882'},
    {   'url': 'https://dic.nicovideo.jp/a/sign%28%E5%B9%B3%E6%B2%A2%E9%80%B2%29',
        'word': 'Sign(平沢進)'},
    {   'url': 'https://dic.nicovideo.jp/a/%E3%81%91%E3%81%84%E3%82%AA%E3%82%B9%E3%83%A6%E3%83%8B%E3%81%8A%E3%82%93%21',
        'word': 'けいオスユニおん!'},
    {   'url': 'https://dic.nicovideo.jp/a/%E7%A7%81%E3%81%AF%E5%B9%B3%E6%B2%A2%E9%80%B2%E3%81%A0%E3%81%9E%E3%80%82%E5%B9%B3%E6%B2%A2%E5%94%AF%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%80%82%E3%81%AE%E6%B3%A2%E5%8F%8A',
        'word': '私は平沢進だぞ。平沢唯じゃない。の波及'},
    {   'url': 'https://dic.nicovideo.jp/a/vocaloid%E3%81%A7%E5%B9%B3%E6%B2%A2%E9%80%B2',
        'word': 'VOCALOIDで平沢進'},
    {   'url': None,
        'word': '有限会社ケイオスユニオン',
        '転送url': 'https://dic.nicovideo.jp/id/143882'},
    {   'url': None,
        'word': 'ケイオスユニオン',
        '転送url': 'https://dic.nicovideo.jp/id/143882'}]
検索結果数: 11
取得ページ数: 11

qiita.com dic.nicovideo.jp