AWESOME-LOG

Pythonでデータ解析

年間AVランキングをスクレイピングして傾向を可視化してみた

ideeeです。
エロデータサイエンティストを目指し、Pythonを勉強しています。

PythonでAVランキングトップ100から、単語の出現頻度を可視化してみました。
早速ですが、2012年のものがこちら

f:id:koumori23:20180807220556j:plain

前にツイッターで流行ったやつですね

「AV」は当たり前ですが、「美少女」「人妻」「時間」が多いですね笑

Pythonで年間AVランキングのトップ100をスクレイピングし、
そのタイトルを形態素解析WordCloudで可視化をしています。
f:id:koumori23:20180801214842j:plain

2010年から2017年までを調べてみました。
*DMM.R18のサイトを参考にします。アダルト耐性がないかたはご遠慮下さい。

やること

Selenium、Pandas、Janome、WordCloudをインストール
②AVランキングページからタイトルをスクレイピング
③タイトルを形態素解析してwordcloudで可視化

前提知識

  • HTMLの基礎がわかる
  • CSSの基礎がわかる
  • Pythonの基礎がわかる

前提として、HTML、CSSPythonの基礎がわかっていないと難しいと思います。
基礎的なものはaidemyやドットインストールなどがオススメなのでそこの
Pythonのコースをやってみてください。

Selenium、Pandas、Janome、WordcCoudをインストール

スクレイピング時に必要なライブラリ

「②AVランキングページからタイトルをスクレイピング」のスクレイピングするには

Selenium
Pandas

Pythonのライブラリが必要です。
Seleniumを利用するには、Selenium用のブラウザのインストールが必要となります。
僕の場合はChromedriverというものをインストールしています。
PandasはPythonの数値演算で利用するライブラリです。
Pandasは取得したデータをCSV形式を読み込んだり、保存することができるので今回これを使用します。

形態素解析と可視化するときに必要なライブラリ

形態素解析するには
Janome
それを可視化するには
Wordcloud
のpyrhonライブラリが必要です

pipでインストールできるので、それぞれインストールしておいてください

②AVランキングページからタイトルをスクレイピング

コード

こちらがスクレイピングするコードです

from selenium import webdriver
import pandas as pd

browser = webdriver.Chrome(executable_path='*chromedriverのパスをいれてください*')
url = "http://www.dmm.co.jp/digital/videoa/-/ranking/=/year="

#実行部分
for q in range(2010, 2018):
    df = []
    df = pd.DataFrame(columns=["rank", "title"])
    for x in range(1, 6):
        #ページ取得
        browser.get(url + str(q) + "/page=" + str(x))
        print(url+ str(q) + "/page=" + str(x))
        #データ取得
        posts = browser.find_elements_by_class_name("bd-b")
        print("Starting to get posts...")
        print(len(posts))
        for post in posts:
            try:
                rank = post.find_element_by_css_selector(".rank").text
                print("ランク:{}".format(rank))
                title = post.find_element_by_css_selector('img').get_attribute('alt')
                print("タイトル:{}".format(title))
                se = pd.Series([rank, title],["rank", "title"])
                df = df.append(se, ignore_index=True)
            except Exception as e:
                print(e)
    print("Finished Scraping. Writing CSV.......")
    df.to_csv("dmm_ranking" + str(q) + ".csv")
    print("DONE")

上記のコードを実行すればランク、タイトルが入った2010年から2017年の
CSVファイルが出力されます。

f:id:koumori23:20180804023211j:plain

③タイトルを形態素解析してwordcloudで可視化

形態素解析とは

タイトルが入ったファイルができたので、
それを形態素解析し、wordcloudで可視化したいと思います

そもそも、形態素解析は、

ある文章、フレーズを「意味を持つ最小限の単位(単語)」に分解し、文章やフレーズの内容を判断するために用いられます。*1

今回はスクレイピングしたタイトルを形態素解析で分解し、
名詞部分を取り出してまとめています。

コード

こちらがコードです

from janome.tokenizer import Tokenizer
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import pandas as pd

train = pd.read_csv("dmm_ranking2010.csv")
title_texts = train["title"].values.tolist()

words = []

t = Tokenizer()
for title_text in title_texts:
    tokens = t.tokenize(title_text)
    for token in tokens:
        # 品詞を取り出し
        partOfSpeech = token.part_of_speech.split(',')[0]
        if partOfSpeech == '名詞':
            words.append(token.base_form)

text = ' '.join(words)

#word cloud
fpath = "~/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc"
wordcloud = WordCloud(background_color="white", font_path=fpath, width=900, height=500).generate(text)

plt.figure(figsize=(10,8))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

以上のコードを実行すれば、冒頭のような画像が出るかと思います。

上記では2010年(dmm_ranking2010.csv)のファイルを読み込んでいます。
他の年の傾向を調べたい場合は
CSVファイルを他の年のファイルに変えて実行してください。

また、今回Macなので、Windowsの場合は下記のfpathのパスが変更が必須です。
日本語フォントのパスを入れてください。

fpath = "~/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc"

 

結果発表

ついに結果というか、可視化されたデータが以下のものです
2010年
f:id:koumori23:20180807220412j:plain
2011年
f:id:koumori23:20180807220456j:plain
2012年
f:id:koumori23:20180807220556j:plain
2013年
f:id:koumori23:20180807220607j:plain
2014年
f:id:koumori23:20180807220616j:plain
2015年
f:id:koumori23:20180807220627j:plain
2016年
f:id:koumori23:20180807220638j:plain
2017年
f:id:koumori23:20180807220650j:plain

それぞれ詳しく解説はできませんが、
2010年は会いにいけるアイドルが流行り出したのがこのあたり!
2013年圧倒的な鈴村あい!
2017年VRがきてる!

2013年、2014年に大きく出てる「鈴村あい」は「鈴村あいり」の間違えです。
形態素解析で人名がうまく抽出できてないようです。そのあたりはこれからの課題ですね。
また、年ごとに目立つものが少なくなっています。
AVも多様化がすすんでいるからかもしれません。



みんなのPython 第4版

みんなのPython 第4版