漫画サイトのたのしみ方

つかれたる牛のよだれはたらたらと千万年も尽きざるごとし

漫画サイト。 それは漫画がブラウザで読める web サイトのことである。

漫画サイトには大きく分けて二種類ある。一方が違法サイトで、もう一方が合法サイトである。 仕組みは表面上はどちらもよく似ている。内部的には違うが、目的が違うので手段が違うと言っていいだろうが、大まかには同じようなものだ。

ここでは、違法サイトについて調べてみたい。

まず、あるひとつの違法サイトでのコンテンツの総数を数えてみたい。 現段階で、数え上げたのは 51717 のタイトル数だった。これは全てがコミックの 1 巻分ではなくて、第何話や、週刊誌の第何号というものを含めての数で、プラスこの数の 20% 分くらいがまだ隠れ層になっていて表出していない。そしてコンテンツは日々、運営者によって更新されるので、時間とともに数は増えていく。

隠れ層 . . . これはどう云うことかというと、今回とった手法が関係しているが、例えば 100 回ランダムに違法サイトのページアドレスを出して、データベースに記録するということを繰り返して、次回はデータベースに記録されているもの以外をデータベースに記録していくようにしたとして、100 回のうち 20 回ほどが、記録されてないアドレスになってきた場合、続けていくと100 回のうち 15 、10 、5 とだんだんと記録されていないアドレスがランダムでは出にくくなっていくことになる。 このことをここで、隠れ層と云った。隠れ層とは云わないのかもしれない、全部ではないということ。隠れ層を見つけ出すという目的ではなく1、ある時点の表出しているコンテンツのメタ情報について考察していく。

kuroca.hatenablog.com

前提

あくまでも、違法サイトのコンテンツページのアドレスを前もって知っているわけではなく、ページにあるマンガ画像が表示されない方法で、ダウンロードせずにコンテンツが埋め込まれている URL を収集して、漫画のタイトルや著者情報を分析していくというパズルであり、漫画読みたいということではない。 スタンスとしては漫画家個人に寄りそう必要なデータを明瞭にオープンに出したい。このスタンスにおいては漫画家に不利益になることには言及しない。出版社、および漫画家の権利保守のための作業軽減に役立つことも提供できる可能性はあり。

漫画読みたい気持ちもある場合は、まずは合法マンガサイトを掘り進んでコードと構造に潜り込んでみるといい。 どの漫画家が作品を何点公開しているのかなど並べて見るプログラムを考えて書いてみるなどすると、いろいろサイトの事情も見えてくる。

code ⌨
合法マンガサイトでは、漫画家が作品を何点公開しているのか?
require 'open-uri'
require 'nokogiri'
require 'time'

address = 'https://www.mangaz.com/authors/list'
html = URI.open(address)
doc = Nokogiri::HTML(html)

mangaka ={}
count = 1

(16..794).each do |num|
    a_tag = doc.xpath('//a')[num]
    if a_tag.inner_text == 'ページの上部に戻る'
        next
    end

    count += 1
    author_profile_page = 'https://mangaz.com' + a_tag[:href].to_s
    author_name = a_tag.inner_text
    mangaka.store(author_name,author_profile_page)
end

total_titles = 0
manga = []
count = 0

mangaka.each do |key,value|
    html = URI.open(value)
    doc = Nokogiri::HTML(html)
    h4 = doc.css('h4')
    total_titles += h4.size
    a = doc.xpath('//h4/a')
    a.each do |atag|
        item_name = atag.inner_text
        item_url = atag['href']
        manga[count] = {'title' => item_name,
                        'book_profile_page' => item_url,
                        'author' => key,
                        'author_profile_page' => value
                        }
        count += 1

    end
    sleep 1
end

temp = ''
r18 =''
count = 0

manga.each_with_index do |data,index|
    if temp == data['author'] then
        count += 1
    else
        puts
        count = 1
    end
    if data['book_profile_page'].match("\/r18.")
        r18 = ' -R18- '
    else
        r18 =''
    end

    print index + 1, " #{r18} ",data['author'],"  #{count}  " ,data['title']
    puts
    temp = data['author']
    sleep 0.2
end
--- author, title, tag
temp = ''
r18 =''
count = 0

manga.each_with_index do |data,index|
    if temp == data['author'] then
        count += 1
    else
        puts
        count = 1
    end
    if data['book_profile_page'].match("\/r18.")
        r18 = ' -R18- '
    else
        r18 =''
    end

    print index + 1, " #{r18} ",data['author'],"  #{count}  " ,data['title']
    puts

    value = data['book_profile_page']
    html = URI.open(value)
    doc = Nokogiri::HTML(html)
    atag = doc.css('.tag > a')
    puts
    atag.each do |tag|
        print '   -tag-   ', tag.inner_text
        puts
    end
    puts

    temp = data['author']
    sleep 0.2
end
--- csv
require 'csv'
require 'httparty'
#require 'open-uri'
require 'nokogiri'
require 'time'

manga.each do |hash|
    CSV.open('mangaz-list.csv','a+') do |data|
        
        if hash['book_profile_page'].match("\/r18.")
            r18 = '-R18-'
        else
            r18 ='nonrestrictive'
        end

        value = hash['book_profile_page']
        #html = URI.open(value)
        html = HTTParty.get(value)
        doc = Nokogiri::HTML(html.body)
        doc.remove_namespaces!
        atag = doc.css('.tag > a')
        #doc = nil
        tags = ''
        atag.each do |tag|
            tags += tag.inner_text + ';'
        end
        
        data << [hash['author'].to_s,hash['author_profile_page'].to_s,
        hash['title'].to_s,hash['book_profile_page'].to_s,r18,tags]
        puts hash['title']
    end
    doc = nil
end
--- sqlite3
require 'sqlite3'
require 'csv'

SQL=<<EOS
create table tbl_manga_z (
    id integer,
    author text,
    author_profile_page text,
    title text,
    book_profile_page text,
    r18 text,
    tags text
);
EOS

db = SQLite3::Database.new("mangaz_list.db")
db.execute(SQL)

count = 0
CSV.foreach('mangaz-list.csv') do |line|
    count += 1
    author = line[0]
    author.gsub!(/\'/,"\'\'")
    author_profile_page = line[1]
    author_profile_page.gsub!(/\'/,"\'\'")
    title = line[2]
    title.gsub!(/\'/,"\'\'")
    book_profile_page = line[3]
    book_profile_page.gsub!(/\'/,"\'\'")
    r18 = line[4]
    #r18.gsub!(/\'/,"\'\'")
    tags = line[5]
    tags.gsub!(/\'/,"\'\'")
    id = count
    db.execute("insert into tbl_manga_z (id,author,author_profile_page,title,book_profile_page,r18,tags) values('#{id}', '#{author}','#{author_profile_page}','#{title}','#{book_profile_page}','#{r18}','#{tags}')")
end

db.close

マンガサイト観測 1

違法と思われる漫画サイトの中でシンプルな構造のオンラインリーディング型のサイト . . . マンガ Thank をターゲットに観測す。(注)マンガ Thank というサイトは存在せず、こころの中に存在すべし。

違法と思われるマンガ Thank(仮称)の HTML の構造をよく確認する

違法と思われるコンテンツである漫画のスキャンデータ、もしくは電子書籍マンガからのコピーである画像ファイルは、概ね cloudflare 社2のキャッシュのイメージファイルが <img> で直接指定されている。 また、lazy loading3 で読み込まれている。 仕組みとしてはページに別のサーバーにある WordPress で管理された画像群の画像ファイル(ここが cloudflare のキャッシュになっているということで、それは当該のファイルの URL を逆引きしてドメインからドメイン所有者をわりだすと cloudflare になっているということ。いずれ図説したい。)をページ内に lazy loading で読み込んで表示させていることが確認できる。

https://urlscan.io/

Cloudflare ドメイン

Cloudflare, Inc.(クラウドフレア)とは https://ja.wikipedia.org/wiki/Cloudflare

シンプルなので理解しやすいはずである。 つまり、オンラインリーディング型のサイト、マンガ Thank(仮称)のメインのコンテンツは画像だけなので、その画像がページ内にたとえば 100 点収まっているだけというシンプルな構造で、付加的にアップデート日時がタグで囲まれて配置されている。これはマンガ Thank(仮称)のシステム管理者用にあるのだと考えられる。 アップデート日時の情報は、マンガ Thank(仮称)のマンガコンテンツを表示するページのソースコード表示で確認できるが、ブラウザでレンダリングされた表示では見えないようにはなっている。

ひとつめのデータベーステーブル [tbl_manga]

このマンガ Thank(仮称)ページの構造から考えて、以下のようなデータベースを作ることにする。

[tbl_manga]

    id INTEGER PRIMARY KEY,
    title text,
    url text,
    updated_datetime datetime,
    author text,
    book_title text

カラム title の値は、ページにあるタイトルを抽出したもの。 カラム url の値は、コンテンツの埋め込まれたページの URL で、ページに埋め込まれた画像ファイルの URL ではない。画像の URL はこのステップでは収集しない。 画像ファイルがすべて cloudflare 管轄のドメインのものを使用されているのか確認したい段階で URL を収集することになるのかもしれないが、それ自体は非常に簡単にできる。ここでは割愛。 仕組み上、この url の値はユニークである。つまり重複はない。title が重複することがあっても url は重複しない。なぜかは考えればすぐにわかるはずだ。 updated_datetime は、ページソースコードにあるアップデートした日時を収める。ただし、これが正確なのかは不明なので、後にプロファイルするための参考にするために抽出する。 その他は、ターゲットのページから抽出するのではなく、抽出されたデータをもとに生成する。

Scraping data from the site 🍄

Play with webdriver and headless chromium browser sample:
urls = generated

require 'sqlite3'
require 'csv'
require 'time'
require 'date'

SQL =<<EOS
create table tbl_manga (
    id INTEGER PRIMARY KEY,
    title text,
    url text,
    updated_datetime datetime,
    author text,
    book_title text
);
EOS

db = SQLite3::Database.open "mangathank_new.db"
db.execute(SQL)
db.close

100.times do |loop|

    db = SQLite3::Database.open "mangathank_new.db"

    4.times do |loop|
        driver.get(urls)
        #sleep 1
        flag = []
        URL = driver.current_url
        flag = db.execute("select id from tbl_manga where url='#{URL}'")
        #p flag
 
        if flag.any? then
            next
        else
            CSV.open('mangathank_TEMP.csv','a+') do |data|
                title = driver.find_element(:class_name, 'entry-title')
                updated = driver.find_element(:class_name,'updated')
                updated_datetime = updated.attribute('datetime')
                title.text.to_s.rstrip!

                pp title.text

                data << [URL,title.text,updated_datetime]
            end
        end
    end
    
    if File.exist?("mangathank_TEMP.csv") then
        CSV.foreach('mangathank_TEMP.csv') do |line|
            count += 1
            url = line[0]
            url.to_s.gsub!(/\'/,"\'\'")
            title = line[1]
            author_name = title.slice(/(?<=\[).*?(?=\])/)
            updated_datetime = line[2]
            updated_datetime.to_s.gsub!(/\'/,"\'\'")
            id = count
            title.to_s.gsub!(/\'/,"\'\'")

            #puts title
            #puts author_name 
            
            db.execute("insert into tbl_manga (id, title, url, updated_datetime ) values('#{id}', '#{title}','#{url}','#{updated_datetime}')")
            
            if author_name != nil then #
                author_name.gsub!(/\'/,"\'\'")
                
                pp author_name

            end

            book_title = title.slice(/((?<=\]).+?$)/)
            if book_title then
                book_title.gsub!(/((?=).*(|))/,'')
                book_title.gsub!(/((?=).*)/,'')
                book_title.gsub!(/(.(?<=\()文庫版(?=\)).)/,'')
                book_title.gsub!(/(.(?<=\[)文庫版(?=\]).)/,'')
                book_title.gsub!(/文庫版/,'')
                book_title.gsub!(/(.(?<=\()(?=\)).)/,'')
                book_title.gsub!(/(.(?<=).*(?=).)/,'')
                book_title.gsub!(/(.(?<=\[).+?(?=\]).)/,'')
                book_title.gsub!(/\'/,"\'\'")
                book_title.lstrip!
                book_title.rstrip!
            else
                book_title = title
            end
 
            pp book_title

            db.execute("update tbl_manga set author = '#{author_name.to_s}', book_title = '#{book_title.to_s}' where id = '#{id}' ;")
        end

        db.close
        system("rm -r mangathank_TEMP.csv")
    else 
        next
    end
    db.close
end

目標 ゴール設定は、オンラインリーディング型のサイトであるマンガ Thank(仮称)にコンテンツとして使用されている漫画について、すべて権利者を割り出して、並べて見ること。

たとえば、コミックスであれば、たいていのもは出版社が発行しているので、その出版社名、書籍データを、違法にアップロードされたものからできるだけ正確に逆引きして表示するまでがひとまずの目標とする。曖昧なメタデータから、正確なメタデータへ変換するということ。

書籍データは ISBN4 をともなったものが多いが、全てではないのと、電子書籍は書籍という枠には入れられていないために ISBN での管理を外れていても例外とは云えない。 おおかたの書籍検索システムは ISBN コードを主軸としているので、ISBN を使って書籍データを問い合わせる仕組みになっているが、これでは要件に適していないので、本のタイトルから書籍データを問い合わせることが可能なシステムの API を使い、これを実現する

マンガサイト観測 2

マンガサイトにある 51717 タイトルの出版社情報を並べてみる。 マンガ 51717 タイトル list pdf マンガ 51717 タイトル list pdf

違法と思われるオンラインリーディング型サイトのマンガ Thank (仮称) から現時点で抽出された 51717 のタイトル情報を国会図書館 NDL (National Diet Library) サーチに問い合わせて書籍データを得る。

Rf. API仕様の概要 « 国立国会図書館サーチについて https://iss.ndl.go.jp/information/api/riyou/

マンガサイト観測 1 で解説したように ISBN ではなく、サイト内で独自に割り振られたタイトルと著者名らしき文字列の情報から、タイトル名と著者名を抜き出して、NDL ( National Diet Library ) サーチの API を使いデータ照会できるように、仕様に合わせたクエリをつくり HTTPS でリクエストする。

つまり、 ISBN はわからないので、タイトルから ISBN をわりだすということが可能な API を使うということになる。 このような場合、国会図書館サーチか amazonAPI かの選択になるが、今回は制限のほぼなさそうな国会図書館サーチを選ぶ。国立国会図書館サーチの使用法は仕様公開ページをよく読んでもどこか説明が足りないので、実際に使えるサンプルを探して試行錯誤する方がよいと思う。

マンガ Thank (仮称) のコンテンツのタイトルは独自につけられている為、というより何者かによってコンテンツ(スキャンされたマンガの画像のこと)がアップロードされた時点でメタ情報が入力されているので、そのメタ情報入力の際に明らかにタイトルの英単語のつづりを間違っているなどの場合がある。

これを間違ったそのままでクエリにして、 NDL サーチから正しい情報が引き出せないケースがあるが、現時点では、それは修正せずに間違っていようがタイトルからタイトルらしきものを文字列抽出し、著書名らしきものを文字列抽出してクエリに組み込むプログラムを作った。つまり照会結果が無い場合、なんらかのメタデータにパターンや平均的でない特徴が見られることが期待できる。

NDL search

この照会結果を新たなデータベースに書き込んでいくが、データベースのテーブルは以下のようになっている。

なぜデータベースを使うのか? コンテンツの数量が多いからである。 50000 を超えて、さらにあと 10% 前後はまだデータ未取得で、さらには日々増えているので、一気に全データを取得 . . . とは考えずに継続的に改良を加えながらデータをとっていく。

ふたつめのデータベーステーブル [tbl_ bookdata]

[tbl_ bookdata]

    id INTEGER PRIMARY KEY,
    book_title text,
    url text,
    author text,
    creatortranscription text,
    volume text,
    seriestitle text,
    publisher text,
    isbn text,
    mangathank_title text,
    ex_id integer

マンガサイト観察 1 で用意した [tbl_manga] とは別に分けている。これは、 [tbl_manga] から読みだしたデータを使って、 NDL サーチにクエリをリクエストして得た情報を [tbl_bookdata] に書き込むということになる。

このデータベースのテーブル [tbl_bookdata] に書き込まれたものから、 id, seriestitle, publisher, url を抽出したものはこうなる。

id, seriestitle, publisher, url

 "1","null","null","null"
 "2","null","null","null"
 "3","null","null","null"
 "4","null","null","null"
 "5","null","Sony Music Labels","https://iss.ndl.go.jp/books/R100000002-I027014370-00"
 "49738","null","Sony Music Labels","https://iss.ndl.go.jp/books/R100000002-I027014370-00"
 "6","null","Sony Music Labels","https://iss.ndl.go.jp/books/R100000002-I027014370-00"
 "7","null","null","null"
 "8","null","null","null"
 "9","null","null","null"
 "10","null","null","null"
 "11","null","null","null"
 "12","null","アスキー・メディアワークス,KADOKAWA","https://iss.ndl.go.jp/books/R100000002-I024687562-00"
 "13","null","アスキー・メディアワークス,KADOKAWA","https://iss.ndl.go.jp/books/R100000002-I024687572-00"
 "14","null","null","null"
 "15","null","null","null"
 "16","null","null","null"
 "17","null","null","null"
 "18","null","null","null"
 "19","null","null","null"
 "20","null","null","null"
 "21","null","null","null"
 "22","null","平凡社","https://iss.ndl.go.jp/books/R100000002-I027189887-00"
 "23","null","平凡社","https://iss.ndl.go.jp/books/R100000002-I028029779-00"
 "24","null","平凡社","https://iss.ndl.go.jp/books/R100000002-I000011141069-00"
 "25","null","平凡社","https://iss.ndl.go.jp/books/R100000002-I023371158-00"
 "26","null","平凡社","https://iss.ndl.go.jp/books/R100000002-I024193406-00"
 "27","null","平凡社","https://iss.ndl.go.jp/books/R100000002-I025336987-00"
 "28","null","null","null"
 "29","角川コミックス・エース ; KCA500-1","KADOKAWA","https://iss.ndl.go.jp/books/R100000002-I026685661-00"
 "30","角川コミックス・エース ; KCA500-2","KADOKAWA","https://iss.ndl.go.jp/books/R100000002-I027116764-00"
 "31","YOUNG ANIMAL COMICS","白泉社","https://iss.ndl.go.jp/books/R100000002-I030414985-00"
 "32","YOUNG ANIMAL COMICS","白泉社","https://iss.ndl.go.jp/books/R100000002-I030704315-00"
 "33","YOUNG ANIMAL COMICS","白泉社","https://iss.ndl.go.jp/books/R100000002-I031233553-00"
 .
 .
 .
 .
 .
 .

コンテンツのタイトルのみで著者の情報がミッシングしている場合は、国会図書館 NDL サーチでは必ずしも正しい照会結果になるとは限らない。 例としては、上の囲みで"Sony Music Labels"となっている 3 行は、明らかに正しくない結果だが、照会結果がゼロではなく、見当違いのものにクエリがマッチしたということになる。

上の囲みので id, seriestitle, publisher, url という並びで 1 行になっている。 id はカウントアップされいく整数で、このデータベースでは 51717 行あるので 1~51717 まである。データベーステーブル [tbl_bookdata] で ex_id という整数のコラムを用意したが、ここへは [tbl_manga] の id の値が入る。ex_id も 1~51717 まである。ということは、[tbl_bookdata] と [tbl_manga] を内部結合に使うこともできる。

seriestitle, publisher については NDL サーチの結果のデータとして用意されているものだ。 seriestitle が連載誌名で publisher がその出版社名に当てはまる。これらはない場合もあるので、その場合は値は空になる。 [tbl_bookdata] においての url は、国会図書館サーチの結果の web ページの URL が値として入る。 [tbl_manga] においての url とは異なっていて、[tbl_manga] の urlマンガ Thank (仮称) のそれぞれのコンテンツの URL が収まっているので関連はあるが別のものを指している。 [tbl_bookdata] の urlマンガ Thank (仮称) のコンテンツはこの書誌であるという補足になっている関係になる。

また、国会図書館 NDL サーチでは、ことば(キーワード)の揺れにたいして特に寛容というわけでもない(が、アクセスの回数や頻度については明確な制限が提示されていないけれども、たいへん寛容である5)ので、ことばがマッチせずに探し出せないケースが多々ある。 独自に付けられた識別のことばが含まれたまま NDL サーチにクエリが送られた場合、マッチせずに結果が無い状態になり null で置き換えられる。 なるべくキーワードが NDL のデータベース上のものと一致するように、予め NDL 内での書籍データを確認して(何度かテストして失敗したもののクエリ内容と、手動で検索して発見される書籍データをよく見比べて)、違法漫画サイトで付与されているコンテンツタイトルを正規表現で NDL 内でのデータの収まり方に寄せて照会のリクエストのクエリを組むようにする。

例) コンテンツのタイトルのパターン

[田河水泡] のらくろ 漫画集 文庫版 第01巻

コンテンツのタイトルから正規表現を使って、必要のない文字列を除去し、タイトルと著者に分け、 NDL サーチにリクエストするクエリに組み込まれる。 "のらくろ 漫画集 1" "田河水泡"

のらくろ漫画集 (講談社): 1975|書誌詳細|国立国会図書館サーチ


例) コンテンツのタイトルのパターン

[長屋憲 × 佐藤秀峰] ブラックジャックによろしく 第01巻

コンテンツのタイトルから正規表現を使って、著者の候補を分けて、NDL サーチにリクエストするクエリをつくる。 "ブラックジャックによろしく 1" "佐藤秀峰" "長屋憲"

ブラックジャックによろしく 1 佐藤秀峰 - 国立国会図書館サーチ

ブラックジャックによろしく 1 長屋憲 - 国立国会図書館サーチ


詳細はこちら [NDL search (Ruby)]

出版社データ

以上のことを踏まえて、必ずしも正確ではない、コンテンツにたいして著作権を保持している可能性のある出版社を列挙す。

select distinct(publisher) from tbl_bookdata group by mangathank_title ;

出版社データ 🍞

 "null"
 "Sony Music Labels"
 "アスキー・メディアワークス,KADOKAWA"
 "平凡社"
 "KADOKAWA"
 "白泉社"
 "徳間書店"
 "Cygames,講談社"
 "集英社"
 "マッグガーデン"
 "角川書店,角川グループパブリッシング"
 "講談社"
 "少年画報社"
 "角川書店"
 "ヒーローズ,小学館クリエイティブ"
 "アスキー・メディアワークス,角川グループパブリッシング"
 "光文社"
 "メディアワークス,角川書店"
 "スクウェア・エニックス"
 "角川書店(発売),バンダイビジュアル (販売)"
 "EGMONT MANGA & ANIME"
 "エイベックス・エンタテインメント,エイベックス・マーケティング"
 "新書館"
 "バンダイビジュアル"
 "オーバーラップ"
 "秋田書店"
 "一迅社"
 "ホビージャパン"
 "キルタイムコミュニケーション"
 "マーベラスAQL,ポニーキャニオン"
 "一迅社,講談社"
 "アース・スターエンターテイメント,泰文堂"
 "アース・スターエンターテイメント"
 "Kadokawa"
 "KADOKAWA"
 "角川書店,KADOKAWA"
 "ハーレクイン"
 "日本文芸社"
 "星海社,講談社"
 "リイド社"
 "集英社クリエイティブ,集英社"
 "芳文社"
 "双葉社"
 "小学館"
 "バンダイナムコアーツ"
 "幻冬舎コミックス,幻冬舎(発売)"
 "TBS,ポニーキャニオン"
 "秋水社,大都社"
 "ジェネオン・ユニバーサル・エンターテイメント"
 "角川書店,角川グループホールディングス"
 "ブシロード,KADOKAWA"
 "富士見書房,角川グループパブリッシング"
 "久保書店"
 "マイクロマガジン社"
 "朝日ソノラマ"
 "朝日新聞社,朝日新聞出版"
 "朝日新聞出版"
 "創美社,集英社"
 "幻冬舎コミックス,幻冬舎"
 "アスキー・メディアワークス,Kadokawa"
 "TYPE-MOON,Kadokawa"
 "TYPE-MOON,KADOKAWA"
 "アイプロダクション,祥伝社"
 "ぶんか社"
 "TOブックス"
 "メディアファクトリー"
 "SBクリエイティブ"
 "角川グループパブリッシング"
 "アニプレックス"
 "PHP研究所"
 "イースト・プレス"
 "竹書房"
 "一二三書房"
 "コミックス,講談社 (共同刊行・発売)"
 "宙出版"
 "アスキー・メディアワークス,角川グループパブリッシング(発売)"
 "アスキー・メディアワークス,角川グループパブリッシング (発売)"
 "新潮社"
 "アルファポリス,星雲社"
 "エイベックス・ピクチャーズ"
 "小学館,ジェネオン・ユニバーサル・エンターテイメント"
 "Tonkam"
 "ジーオーティー"
 "Jパブリッシング"
 "ラポート"
 "中央公論社"
 "祥伝社"
 "ワニブックス"
 "アスキー・メディアワークス,角川グループホールディングス"
 "キングレコード"
 "ノース・スターズ・ピクチャーズ,徳間書店"
 "リブレ"
 "スーパー・ビジョン,ポリドール映像販売"
 "ノース・スターズ・ピクチャーズ,竹書房"
 "マガジンハウス"
 "フジテレビ映像企画部,ポニーキャニオン"
 "ジェネオンエンタテインメント"
 "主婦の友社"
 "NBCユニバーサル・エンターテイメント"
 "サード・ライン・ネクスト,星雲社 (発売)"
 "ぺんぎん書房"
 "宝島社"
 "マーベラスエンターテイメント,ポニーキャニオン"
 "みなみ出版,星雲社"
 "ホーム社"
 "青磁ビブロス"
 "ジャイブ"
 "学習研究社"
 "コロムビアミュージックエンタテインメント"
 "ビブロス"
 "ハーパーコリンズ・ジャパン"
 "アルファポリス,星雲社 (発売)"
 "SG企画"
 "ワーナー・ブラザース・ホームエンターテイメント"
 "ハピネット"
 "主婦と生活社"
 "ホーム社,集英社(発売)"
 "ホーム社,集英社"
 "学研プラス"
 "講談社,コミックス"
 "虫プロ商事"
 "TBS,日本コロムビア"
 "フォーラムエイトパブリッシング,フォーラムエイト (発売)"
 "文禄堂"
 "愛媛県教育会"
 "労働教育センター"
 "NHN comico,双葉社"
 "スターツ出版"
 "エンターブレイン,角川グループパブリッシング"
 "ラジオ大阪"
 "ポニーキャニオン"
 "GRINP"
 "Kodansha,ポニーキャニオン"
 "実業之日本社"
 "南海出版公司"
 "秋田書店,白泉社"
 "白泉社,集英社 (発売)"
 "あおば出版"
 "中央公論新社"
 "フロンティアワークス"
 "小池書院"
 "大都社"
 "小学館,メディアファクトリー"
 "東映ビデオ"
 "太田出版"
 "東宝"
 "フロンティアワークス,KADOKAWA"
 "ジュリアンパブリッシング"
 "星海社,講談社 (発売)"
 "ブライト出版"
 "オークラ出版"
 "誠文堂新光社"
 "角川書店,角川グループパブリッシング (発売)"
 "富士見書房,角川グループホールディングス"
 "フレックスコミックス,ソフトバンククリエイティブ"
 "SBクリエイティブ"
 "バップ"
 "G-NOVELS,誠文堂新光社"
 "NHN Comico,双葉社"
 "LINE,日販アイ・ピー・エス"
 "LINE Digital Frontier,日販アイ・ピー・エス"
 "サンリオ"
 ""
 "ネクストF,ジャイブ"
 "三交社"
 "自称清純派"
 "フレックスコミックス"
 "ポッポ焼き屋"
 "彗星社,星雲社"
 "HSU出版会,幸福の科学出版"
 "松竹"
 "フジテレビ,東宝"
 "エンターブレイン,角川グループホールディングス"
 "リブレ出版"
 "フレックスコミックス,ほるぷ出版"
 "飛鳥新社"
 "LDH pictures,バップ"
 "Avex Pictures"
 "ソフトバンククリエイティブ"
 "「インベスターZ」製作委員会,バップ"
 "大和書房"
 "湖南美术出版社"
 "冬水社"
 "エンターブレイン,KADOKAWA"
 "インデックス・コミュニケーションズ"
 "モール・オブ・ティーヴィー"
 "幻冬舎"
 "テレビ東京,ポニーキャニオン"
 "新紀元社"
 "コアマガジン"
 "サンタスティック・エンタテイメント"
 "NBCユニバーサル・エンターテイメント,エイベックス・ピクチャーズ"
 "Viz Media"
 "フジテレビジョン,ポニーキャニオン"
 "ワニマガジン社"
 "朝日新聞社"
 "オレンジページ"
 "文藝春秋"
 "コミックス,講談社"
 "富士見書房,KADOKAWA"
 "M'sワールド,GPミュージアムソフト"
 "山と溪谷社"
 "「嬢王3~Special Edition~」製作委員会,東宝"
 "エンターブレイン"
 "林檎プロモーション"
 "[八木戸マト]"
 "「Claymore」製作委員会,エイベックス・マーケティング"
 "トゥーマックス,エイベックス"
 "トゥーマックス,エイベックス・ディストリビューション"
 "トゥーマックス,avex distribution"
 "エンターブレイン,角川グループパブリッシング (発売)"
 "ソニー・マガジンズ"
 "ロングランドジェイ,ジーウォーク"
 "ハーレクイン・エンタープライズ日本支社"
 "早川書房"
 "スタジオDNA"
 "エニックス"
 "KADOKAWAメディアファクトリー"
 "エイベックス・マーケティング"
 "河出書房新社"
 "ワンツーマガジン社"
 "コアミックス"
 "小学館クリエイティブ,小学館"
 "メディアワークス,主婦の友社"
 "メディアワークス"
 "松竹映像商品部"
 "東映ビデオ,東映"
 "ベストフィールド"
 "日本評論社"
 "Ariola Japan"
 "リンダパブリッシャーズ,徳間書店"
 "ひばり書房"
 "ワーナー・ブラザースホームエンターテイメント"
 "OKAWA-Verlag"
 "OKAWA-VERLAGS GMBH"
 "สยามอินเตอร์คอมิกส์"
 "東芝エンタテインメント,ジェネオンエンタテインメント"
 "偕成社"
 "マーベラスエンターテインメント,松竹ビデオ事業室"
 "Nozomi entertainment : Right Stuf"
 "云南人民出版社"
 "민음사"
 "Gantz Partners,松竹ビデオ事業室"
 "日本放送出版協会"
 "スタジオ・シップ"
 "近代映画社"
 "小学館,コロムビアミュージックエンタテインメント"
 "宝塚クリエイティブアーツ"
 "AKS"
 "台灣東販"
 "ヒーローズ,小学館クリエイティブ (発売)"
 "創美社"
 "スコラ"
 "テレビ朝日,ポニーキャニオン"
 "マーベラスエンターテイメント,メディアファクトリー"
 "ネクストF,ジャイブ (発売)"
 "ギャガ"
 "フリュー,エイベックス・ピクチャーズ"
 "ABCライツビジネス,ポニーキャニオン"
 "[集英社]"
 "Bbmfマガジン"
 "青泉社"
 "潮出版社"
 "白泉社,集英社"
 "筑摩書房"
 "フジテレビジョン"
 "幻冬舎コミックス,幻冬舎 (発売)"
 "ビズコミュニケーションズジャパン"
 "メディアワークス,角川グループパブリッシング"
 "一賽舎"
 "フロンティアワークス,NBCユニバーサル・エンターテイメント"
 "一賽舎,スタジオDNA"
 "講談社コミッククリエイト,講談社"
 "ブッキング"
 "ブシロードメディア,KADOKAWA"
 "Carlsen"
 "茜新社"
 "メディアワークス,角川書店,角川グループパブリッシング"
 "ラクセント,フロンティアワークス"
 "小学館クリエイティブ,小学館 (発売)"
 "[斎創@さいそう。]"
 "マーベラスエンターテイメント,エイベックス・マーケティング・コミュニケーションズ"
 "ビクターエンタテインメント"
 "大陸書房"
 "モーターマガジン社"
 "扶桑社"
 "時鐘舎,北國新聞社"
 "Gzブレイン,KADOKAWA"
 "KADOKAWA Game Linkage,KADOKAWA"
 "KADOKAWA Game Linkage,KADOKAWA (発売)"
 "JICC出版局"
 "エイベックス,Avex Distribution"
 "バードランドミュージックエンタテインメント (発売),アドニス・スクウェア (販売)"
 "フロンティアワークス,KADOKAWAメディアファクトリー"
 "富士見書房"
 "「新米姉妹のふたりごはん」製作委員会,ポニーキャニオン"
 "「怨み屋本舗reboot」製作委員会,東宝"
 "デジタルサイト,ジェネオンエンタテインメント"
 "ハーレクイン,洋販"
 "東芝エンタテインメント,ポニーキャニオン"
 "小学館,ジェネオンエンタテインメント"
 "ユニバーサル・ピクチャーズ・ジャパン,ジェネオンエンタテインメント"
 "ミューズ・プランニング,エイベックス・マーケティング"
 "集英社クリエイティブ"
 "関西テレビ放送,ポニーキャニオン"
 "ひかりのくに"
 "東映アニメーション,ジェネオン・エンタテインメント"
 "ネルケプランニング"
 "東映アニメーション,東映"
 "日本コロムビア"
 "二見書房"
 "講談社 : 講談社コミッククリエイト"
 "学習研究社,少年画報社"
 "Tokyopop"
 "ベストセラーズ"
 "岩崎書店"
 "小学館,エイベックス・マーケティング・コミュニケーションズ"
 "小学館,エイベックス・マーケティング"
 "笠倉出版社"
 "外道高校野球部,東宝"
 "マーベラスエンターテイメント,キングレコード"
 "ハーヴェスト出版,星雲社"
 "プランタン出版,フランス書院"
 "宙出版,主婦と生活社"
 "エスピーオー"
 "白泉社,ジェネオンエンタテインメント"
 "Glénat"
 "Planet Manga : Panini Comics"
 "Pika édition"
 "小学館,ポニーキャニオン"
 "フジテレビジョン,よしもとミュージック"
 "青林堂"
 "富士見書房,角川書店"
 "ジェネオン・エンタテインメント"
 "GDH"
 "NHKソフトウェア,ジェネオンエンタテインメント"
 "若木書房"
 "エンジェル出版"
 "松文館"
 "テレビ東京,バップ"
 "comico,双葉社"
 "日本映像,フルメディア"
 "VERTICAL"
 "宙出版,主婦の友社"
 "サード・ライン・ネクスト,星雲社"
 "インテルフィン"
 "ポプラ社"
 "秋水社,双葉社"
 "シンエイ動画,バンダイビジュアル"
 "楽楽出版"
 "メディエイション,廣済堂出版"
 "金の星社"
 "ランティス,キングレコード"
 "メイド様!プロジェクト,ジェネオン・ユニバーサル・エンターテイメント"
 "藤子不二雄ファンサークルネオ・ユートピア"
 "講談社,バンダイビジュアル"
 "「新宿セブン」製作委員会,東宝"
 "大垣書店"
 "DREAMUSIC PUBLISHING,KING RECORDS"
 "講談社インターナショナル"
 "Funimation Entertainmment"
 "アスキー,アスペクト"
 "アスキー"
 "テレビ朝日,ジェネオンエンタテインメント"
 "テレビ東京 (製作),創通映像 (製作),シンエイ動画 (製作),バンダイビジュアル (発売)"
 "クロスメディア・パブリッシング,インプレス"
 "主婦の友インフォス,主婦の友社"
 "ミリオン出版,大洋図書"
 "SQUARE ENIX"
 "姉妹社"
 "ランティス,バンダイビジュアル"
 "VIZ Media,LLC"
 "長春出版社"
 "ゴマブックス"
 "三栄書房"
 "Bbmfマガジン,グリーンアロー出版社"
 "テレビ東京,エイベックス・ピクチャーズ"
 "東京漫画社"
 "シンエイ動画"
 "コスミック出版"
 "キングレコード,ポニーキャニオン"
 "小学館,エイベックス・ディストリビューション"
 "GDH,ビクターエンタテインメント"
 "国書刊行会"
 "NHKエンタープライズ"
 "小学館クリエイティブ"
 "フェアベル"

"青林堂"が含まれている。青林工藝舎は含まれていない。

著者データ

マンガ家の方のチェック用CVSAuthor (著者)Publisher (出版社)のデータのみ確認できるファイル。

author_publisher.csv

https://we.tl/t-HbrbAUUZFB?src=dnlwe.tl

https://we.tl/t-TYe3kJsh6qwe.tl

これはつまり、ここに名前があれば、あなたの著作が、おそらく無断で掲載されているので、あなたは当事者ですからテイクダウンする対策をこうじてくださいね、ということで候。

マンガサイト観測 3

マンガ Thank(仮称)のなかにあるテキストデータで、コンテンツの内容を表現したタイトル( title )をいくつか抽出して、その文字列で google 検索してみると、マンガ Thank(仮称)以外のページがヒットする場合があることに気がつくだろう。

当初考えていたのは、マンガ Thank(仮称)というサイトで、表示されているコンテンツ(つまりマンガのスキャンデータ)は、サイトの運営者がスキャンして、それをアップロードしているものと考えていた。

NDL サーチにヒットしない文字列のケースを観察して、正規表現のパズルを解き続けていると、なぜ、入力するメタデータに一定の命名規則がきちんと適用されないのかという疑問がわいた。その理由はいくつか考えられる。クオリティに明らかなばらつきが見られることから、少なくともメタデータを入力している作業者は複数で、最低限の文字処理の知識、データベースで運用する前提の知識のコモンセンスは徹底されてないことは確かである。

だが、マンガ Thank (仮称)で使っているタイトルの文字列のまま、他のサイトでも使われているということ、また、そのサイト mangaΠ (仮称) というのが、オンラインリーディング型ではなくて、ダウンロード型・・・つまり、マンガの画像データを zip, rar など圧縮してまとめてダウンロードさせる配布サイトで、それもどうやらマンガ Thank(仮称)よりも保有コンテンツ数が多いような雰囲気(印象であって不確かなもの)があるので、これはもしかして、ダウンロードサイトからコンテンツをダウンロードし、そのファイルを解凍し、それをマンガ Thank(仮称)のコンテンツとして使用しているのではないか?という予測に至った。

これはコンテンツのアップロードの日時を比較し、ファイルの内容を比較すれば、流れのつじつまはひとつ確認できるのであろうけれども、未確認である。

この仮説が示すのは、エコサイクルが形成されているということ。 つまり、マンガ Thank(仮称)の運営側には、マンガをスキャンしてアップロードする作業スタッフを抱えていないのかもしれないということだ。

そのステップは、他にあって、オンラインリーディング型のサイトマンガ Thank (仮称)とダウンロード型サイト mangaΠ (仮称) は、双方の運営は、まったくの無関係でいながら結果的に分業している場合もありうる。それは、わからないことだが。

マンガ Thank(仮称)に限ったことで、問題は、このコンテンツである画像ファイルは cloudflare のドメインにあることだ。

cloudflare のドメインにある画像ファイルを直接読み込むようにしているため、cloudflare にコンテンツ配信のキャッシュファイルを個別に配信停止するように求めなければ、じつはこれは、画像ファイルの URL さえ記述すればどのウェブサイトであろうと、コンテンツを公開できてしまうということに候。

仮にマンガ Thank(仮称)がドメインごと消えた場合でも、再度画像をアップロードすることなしに新たに同じようにコンテンツが配信される可能性はあるし、全く新たに似たようなサイトが始動することもありえる。

つづく


  1. それもパズルなり。https://kuroca.hatenablog.com/entry/20211009/1633774217

  2. 空中分解…海賊版サイト対策検討会はなぜ迷走したか https://www.yomiuri.co.jp/fukayomi/20181017-OYT8T50059/2/

  3. A lightweight but powerful delayed content, image and background lazy-loading plugin for jQuery & Zepto http://jquery.eisbehr.de/lazy/example_basic-usage

  4. 日本図書コード管理センター https://isbn.jpo.or.jp/index.php/fixabout/fixabout_3/

  5. ※アクセス数の上限につきましては、サービスへの影響等を含めて総合的に判断されるため、具体的な数値の目安をお示しすることができません。恐れ入りますが、APIをご利用いただく際は、多重アクセスが生じないようご対応をお願いいたします。https://iss.ndl.go.jp/information/api/