掲示板をスクレイピングして風俗嬢のランキングを作る

概要

最初に概要を述べます。
近年風俗業界もネットでの広告に力を入れている。
代表的なサイトとして、cityheaven, pureloversなどがある。しかし、レビューサイトは一部の地域や業種(fucolle, atarijo, kan-deli.net)ではあるものの、未だ統合的な風俗レビューサイトはない。現在、多くの風俗に関するレビューは2ch, shitaraba, bakusaiに投稿されている。
大目的として女の娘を選ぶ(指名)ことを目的としている。
私はこれまでこれらの掲示板に対してのスクレイピング方法を示してきた。
今回はcityheavenから特定の店舗の女の娘リストを取得して、掲示板(今回はしたらばのみ)においてどの娘が何回レスされているか数える。その際に、例えば「かな」という女の娘の出現頻度を数える際に文章で「○○かな?」などの名詞ではないものと区別するためにMeCabを用いて形態素解析を行う。
結果として無事出現頻度のランキングを図示することができた。
今後の展開としては、
1.レスの日付を用いた評価値の作成
現在に近いレスに高い重みをつけるほうが現実的と考えられるので
2.他の掲示板のレスと合わせて解析する

の2点を考えている。

本題

今回は「池袋人妻城」を対象とする。したらばの該当店のスレを用いる。スレ取得は以前の投稿で使ったコードをそのまま使います。
したらばのスレをRのrvestを用いてスクレイピングする - saikeisai's diary
(ちゃんと関数化するのは今度で)
女の娘のリストはcityheavenのサイトから取得する。
レスのなかでひらがな二文字の名前などは無関係な文章中でも出てくるのでMeCab形態素解析を用いた。
出現回数のランキングを示す。
f:id:saikeisai:20170517211004p:plain
公式で出している本指名のランキングは、
f:id:saikeisai:20170517211428p:plainである。
ランキング一覧|池袋風俗デリヘル 池袋人妻城


以下にコードを示す。(変数resは上のリンクのコードを使えばとれます)

library("rvest")
library(RMeCab)
heaven<-"https://www.cityheaven.net/tokyo/A1305/A130505/hitodumajod/girllist/"
html<-read_html(x=heaven)

num_page_nodes<-html_nodes(html,xpath='//*[@id="contensbox"]/div/div/ul[2]/center/a')
num_page<-length(num_page_nodes)
#上に次のページのリンクがない場合
if(num_page==0){
  num_page<-1
}

getgirl<-function(html){
  girl_nodes<-html_nodes(html,xpath='//*[@class="girllisttext"]') %>% html_text()
  girl<-gsub("\\\r|\\\n|\\\t","",girl_nodes)
  girl<-gsub("[更新].+","",girl)
  girl<-gsub("[歳].+","",girl)
  girl<-gsub("[[:digit:]]","",girl)
  girl<-gsub("  ","",girl)
  return(girl)
}

girl<-c()
for(i in 1:num_page){
  url<-paste0(heaven,i,"/")
  girls_html<-read_html(x=url)
  girl<-c(girl,getgirl(girls_html))
}


res_conv<-iconv(x = res,to="Shift_JIS",from="UTF-8")
res_conv<-na.omit(res_conv)

# 最終的な単語リストを保存するオブジェクトの確保
wordlist <- ""
#テキストが回答ごとに別の要素になっているのでfor文を利用する
for (i in 1:length(res_conv)){
  currentlist <- unlist(RMeCabC(res_conv[i]))
  wordlist <- append(wordlist, currentlist)
}
noun_res<-wordlist[names(wordlist) == "名詞"]

num_girls<-length(girl)
girls_count<-numeric(num_girls)
for(i in 1:num_girls){
  girls_count[i]<-length(grep(pattern = girl[i],x = noun_res))
}
girl_list<-data.frame(girl=girl,count=girls_count)
ranking_to<-as.integer(num_girls/6)
ranking_count<-girl_list[head(order(girl_list[,2],decreasing = TRUE),n = ranking_to),]$count
ranking_girl<-girl_list[head(order(girl_list[,2],decreasing = TRUE),n = ranking_to),]$girl
plot(1:ranking_to,ranking_count,main = thread_title,xlab="rank",ylab="count",ylim=c(0,max(ranking_count)+20))
text(x = 1:ranking_to,y = ranking_count + 10, labels = ranking_girl)

私はMeCabShift_JISでインストールしたのでiconvで変換しましたが、環境によっては不要かもしれません。
(また、その際に20程度のレスがNAになってしまいました)

名詞だけ取り出すコードは以下を参照しました。
R言語でワードクラウドを作る - jnobuyukiのブログ