古い記事
ランダムジャンプ
新しい記事
Asamasearch で使っている、アダルトページ判定ロジックの解説を書いてみました。
asamasearch

参考:Yahoo!デベロッパーネットワーク (YDN)
http://developer.yahoo.co.jp/

ちなみに、「my %seen;」からの5行は「Perl クックブック」に載っているよく知られたイディオムを改変して使ってます。

それではどうぞ:

使用している Web API の提供が終了となったため、現在動作しません。ご了承ください。



■■■アダルトページの判定

ヤフー検索にはアダルトページフィルタ機能があります。

Yahoo!検索APIにおいてパラメータ adult_ok を 1 にすると、
アダルトコンテンツ入りの、
0 にするとアダルトコンテンツなしの検索結果になります。
デフォルトは 1 です。

この機能を使って、検索結果からアダルトページのみを取り出してみます。

■処理手順

まず、adult_ok=1 を指定し、アダルトコンテンツを含む検索結果を得ます
(デフォルトが 1 なので指定なしでもOKです)。

http://search.yahooapis.jp/WebSearchService/V1/webSearch?
appid=YahooDemo&query=eros&adult_ok=1


次に、adult_ok=0 を指定し、アダルトコンテンツを含まない検索結果を
得ます。

http://search.yahooapis.jp/WebSearchService/V1/webSearch?
appid=YahooDemo&query=eros&adult_ok=0


前者の検索結果に含まれているが後者の検索結果には含まれていない URL
を取り出します。これがアダルト判定されたページであるとみなせます。

■コード

#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
use XML::Simple;

my $key = shift @ARGV;
$key =~ s/([^0-9A-Za-z_])/'%'.unpack('H2',$1)/ge;
$key =~ s/ /+/g;

my $url_prefix = "http://search.yahooapis.jp/WebSearchService/V1/"
    ."webSearch?appid=YahooDemo&query=$key&results=50";
my @aoks = map {$_->{Url}} @{get_results($url_prefix."&adult_ok=1")};
my @angs = map {$_->{Url}} @{get_results($url_prefix."&adult_ok=0")};

my %seen;
@seen{@angs} = ();
foreach my $item (@aoks) {
    print "$item\n" unless exists $seen{$item};
}

sub get_results {
    my ($url) = @_;
    my $yahoo_response = get($url);
    my $xmlsimple = XML::Simple->new();
    my $yahoo_xml = $xmlsimple->XMLin($yahoo_response);
    if (ref($yahoo_xml->{Result}) eq "ARRAY") { # found: many
        return $yahoo_xml->{Result};
    } elsif (ref($yahoo_xml->{Result}) eq "HASH") { # found: 1
        return [$yahoo_xml->{Result}];
    }
    return []; # not found
}

■Hack の実行

検索キーは引数で指定する仕様です。
日本語の場合の文字コードは UTF-8 です。
% hack_adult.pl eros                                     
http://www.shang-bu.com/jp/eros.htm
http://eros.blog.shinobi.jp/Entry/3/
http://sketch-book.seesaa.net/category/11088-1.html

% hack_adult.pl アイドル
http://www.kumagaya.or.jp/~mamada/idol/idol.htm
http://zxz.jugem.jp/
http://idol-yoshiwara.jp/
http://www.houmotsu.com/i/gazou.htm
http://yapoo-bbs.net/bbs_ai/aidoru/

■Hack をさらに Hack する

サンプルコードではWeb検索を対象としていますが、
画像検索、動画検索でも可能です。



関連書籍:
Perlクックブック〈VOLUME1〉
Perlクックブック〈VOLUME2〉
Yahoo! Hacks
まるごとPerl! Vol.1