著名人のSNSアカウントリストをまとめてみた!

 

最近はFacebook疲れと言うか、どうしても知人・同僚の読んでいるアカウントでおちゃらけた発言が出来なかったりするので、以前よりもtwitterinstagramに触れる機会のほうが多くなっています。

twitterの良いところはまず第一に「気軽につぶやけること」に尽きます。このようなブログやFacebookでの投稿のようにそこまで文章に対するハードルがないところですね。 また、instagramは写真を投稿するというサービスの特性上、美味しいもの食べたり・ジムの運動記録を残したりと行った気軽さが売りですね。 サービスを使う他のユーザーも同じ目的で使っているため気負いしなくても良いという利点もあります。

タイムラインを眺めて時間を潰せるのも良いですね。 情報収集と言う目的で使うことも多々あります。 情報の精度に関してはニュースサイトと比べてしまうと幾分も落ちてしまいますし、ノイズが非常に多いわけですが、リアルタイムな情報が欲しい時はニュースサイトよりも即時性の高いtwitterのほうが個人的には良いかなと思っています。

今回は著名人のtwitter/instagramを気軽に纏めて見れるサイトってないなー(あるにはある)と思って、自分でまとめてみました。 Wikipediaの個々のページで「外部リンク」の項にtwitterInstagramへのリンクが記載されていることはご存知ですか?

Wikipediaの情報を元にスクレイピング手法を元に集約してみました。

本当はpythonScrapyを利用したかったのですが、今回はとりあえずまとめてみたかっただけなのでPHPで書いています。 コードは本当に動けばいいレベルで書いたので大分ツッコミどころが多いのですが、今回はXPATHの勉強を兼ねています。

XPATHをちゃんと利用できればScrapyで書くときにもそのまま利用できそうですからね。

では参考までにご覧くださいませ。

PHPによるスクレイピングスクリプト

<?php require_once('./common.php'); 
$base = 'https://ja.wikipedia.org'; 
$urls = [
    [ 
        'category' => '日本のイラストレーター一覧',
        'url' => 'https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E4%B8%80%E8%A6%A7',
        'xpath' => '//*[@id="mw-content-text"]/div/div/ul/li/a',
    ]
];

$talents = [];

foreach ($urls as $urlElement) {
    $resultHtml = easyCurl($urlElement['url']);
    $xml = new SimpleXMLElement($resultHtml);
    $result = $xml->xpath($urlElement['xpath']);

    $link = [];
    foreach ($result as $key => $value) {
        $v = (Array)$value;
        if(startWith($v['@attributes']['href'], '#') || endWith($v['@attributes']['href'], 'action=edit&redlink=1')) {
            continue;
        }
        $talents[$urlElement['category']][] = [
            'name' => $v['@attributes']['title'],
            'url' => $v['@attributes']['href']
        ];
    }
}


echo print_r($talents, 1);

$text = '';

foreach($talents as $key => $category) {
    $text = "<h2>$key</h2>\n<ul>\n";
    foreach ($category as $talent) {
        $resultHtml = easyCurl($base . $talent['url']);
        if(!$resultHtml) {
            continue;
        }
        $xml = new SimpleXMLElement($resultHtml);
        $result = $xml->xpath('//*[@id="mw-content-text"]/div/ul/li/a');

        $link = [];
        foreach ($result as $key => $value) {
            $v = (Array)$value;
            if(!array_key_exists('href', $v['@attributes'])) {
                continue;
            }
            $href = $v['@attributes']['href'];
            if(strpos($href, 'instagram')) {
                $link[]= sprintf('<a href="%s" class="instagram">Instagram</a>', $href);
            }
            if(strpos($href, 'twitter') && preg_match("%https://twitter.com/[^/]+$%", $href)) {
                $link[] = sprintf('<a href="%s" class="twitter">twitter</a>', $href);
            }
        }
        if(0 < count($link)) {
            sort($link);
            echo $talent['name'] . "\n";
            $text .= "<li>" . $talent['name'] . ' <span>' . implode(' ', $link) . "</span></li>\n";
        }
    }
    $text .= "</ul>\n";
    file_put_contents($key . '.php', $text);
}