2017年12月06日更新

スクレイピングで2chまとめブログのリストと連絡先を取得してみました。

少し前に営業ツールとして2chまとめブログのリストを取得してみました。方法とおおよその結果集計を紹介します。

  • 追加

2chまとめブログのリストとなるサイトを取得する

ほとんどのサイトが、検索以外にいくつかのリストサイトに登録・掲載をしていることを利用し、
そこのサイトにカスタマイズをしたスクレイピングを行うことで、リストが取得できるのでは、と営業ツールを簡易的に作ってみました。
今回、取得したリストは3つです。
2chnavi
FC2ランキング
Livedoorランキング
その他いくつか

スクレイピングのプログラム

いつもの通り、以下の要領でスクレイピングを行える環境を作ります。

これを元に、URLとサイト名をまずは取得をしてしまいましょう。

2chnaviをスクレイピングする場合

取得するURL: http://2chnavi.net/allentries/?threshold=0&page=[!num!]
ページ数: 1-20
URLを取得するXPATH: //a[contains(@class,'entry_site')]/@href
preg_match: /(http.*)$/
preg_matchでの番数: 1

サイト名を取得するXPATH: //a[contains(@class,'entry_site')]

2chnaviの場合は、URLの形式が少し変わります。
「/sites/view/?site_url=http%3A//xxxxxx.xxxx」となっている部分を取得しなければいけないので、
%3A//を://へ変換する部分が必要です。

Livedoorランキングの新着記事から2chまとめブログのリストを作成するXPATH

取得するURL: http://blog.livedoor.com/category/[!pack!]/recent?p=[!num!]
ページ数: 1-2
カテゴリー部分の数字([!pack!]に代入する数字): 243,432,433,434,435,445,446,520,522,523,524,536,537,538,539,540,550,563,607,608,616,619
URLを取得するXPATH: //div[@class='main']//div[contains(@class,'txt')]/p[@class="option"]/a/@href
preg_match: /(http:.*)$/
preg_matchでの番数: 1

サイト名を取得するXPATH: //div[@class='main']//div[contains(@class,'txt')]/p[@class="option"]/a

Livedoorランキングは100位までしか取れません。
しかしその分カテゴリー分けがされているので、新着記事を定期的に行い、ランキングを数回行うとある程度の数を取得が出来ます。

Livedoorランキングのランキングから2chまとめブログの上位を取得する方法

取得するURL: http://blog.livedoor.com/category/[!pack!]/recent?p=[!num!]
ページ数: 1-2
カテゴリー部分の数字([!pack!]に代入する数字): 243,432,433,434,435,445,446,520,522,523,524,536,537,538,539,540,550,563,607,608,616,619
URLを取得するXPATH: //div[@class='main']//div[contains(@class,'txt')]/p[@class="option"]/a/@href
preg_match: /(http:.*)$/
preg_matchでの番数: 1

サイト名を取得するXPATH: //div[@class='main']//div[contains(@class,'txt')]/p[@class="option"]/a

FC2ブログランキングから2chまとめブログのリストをスクレイピングするXPATH

取得するURL: https://blog.fc2.com/subgenre/22/[!num!]/
ページ数: 1-13
URLを取得するXPATH: //p[@class="main_entry_blog_name"]/a/@href
preg_match: /(http:.*)$/
preg_matchでの番数: 1

サイト名を取得するXPATH: //p[@class="main_entry_blog_name"]/a

その他同様に、なんとかアンテナ等、ほとんどのブログが最初に登録をするブログや有名アンテナをメインに行う

後はほとんど同じなので、同様にいくつかスクレイピングを行っていきます。
スクレイピング部分の設定をデータベース化し、いつでも呼び出せるようにしておくと良いでしょう。

データベース化する際に行う処理

2chnaviLivedoorランキングでは重複が多いです。
そのため、重複チェックを行う必要があります。

しかし、最後のスラッシュがあるか無いかで微妙に異なってくるため、最後のスラッシュはトリミングしましょう。

最終更新日を見つける

取得したとしても、最近更新していなければ意味がありません。
なので、更新日をチェックしましょう。
URLのRSSへアクセスし、最終更新日がX日以内等を動いている判断として巡回します。

2chまとめブログから連絡先を見つける

2chまとめブログの連絡先は3パターンがあります。
・メールアドレスが書いてある
・フォームが設置してある
・フォームへのリンクを貼ってある

サイトのトップページをチェックし、それら3つへのリンクかフォームを見つけ出します。

$xml = $this->html_to_xml($this->url);
//アクセスできない場合は終了
if (!$xml) {
$this->form_checked = true;
$this->status = "forbidden";
$this->save();
return false;
}

//ライブドアブログで閉鎖済みの場合をチェック
$xpath["path"] = "//title";
$xpath["match"] = "/.*/";
$xpath["num"] = 0;
$xpath["preg"] = 0;
$list_title = $this->xpath_and_preg($xpath, $xml);
if (isset($list_title[0]) and $list_title[0] == "404 Not Found | このページは存在しないか、すでに削除されています") {
$this->form_checked = true;
$this->status = "deleted";
$this->save();
return false;
}


//リンクのURLを取得
$xpath["path"] = "//@href";
$xpath["match"] = "/.*/";
$xpath["num"] = 0;
$xpath["preg"] = 0;
$lists_href = $this->xpath_and_preg($xpath, $xml);

//リンクの文字列を取得
$xpath["path"] = "//a//*";
$xpath["match"] = "/.*/";
$xpath["num"] = 0;
$xpath["preg"] = 0;
$lists_word = $this->xpath_and_preg($xpath, $xml);

//FormのアクションURLを取得
$xpath["path"] = "//form/@action";
$xpath["match"] = "/.*/";
$xpath["num"] = 0;
$xpath["preg"] = 0;
$lists_form = $this->xpath_and_preg($xpath, $xml);
$forms = [];

//メタタグ内に記載されたtwitterのアカウントを取得
$xpath["path"] = "//meta[name='twitter:site']/@content";
$xpath["match"] = "/@(.*)/";
$xpath["num"] = 0;
$xpath["preg"] = 0;
$lists_twitter = $this->xpath_and_preg($xpath, $xml);

//文章中にメールアドレスが記載されている場合が有るため全文章を取得
$xpath["path"] = "//*";
$xpath["match"] = "/([a-zA-Z0-9])+([a-zA-Z0-9\._-])*(@|★|☆|@|あっとまーく|アットマーク|●|○)([a-zA-Z0-9_-])+\.([a-zA-Z0-9\._-]+)+/mu";
$xpath["num"] = 0;
$xpath["preg"] = 1;
$lists_mail = $this->xpath_and_preg($xpath, $xml);

//mailアドレスをAタグのURLから探す
$preg = "/^mailto:(.*)$/";
foreach ($lists_href as $list) {
if (preg_match($preg, $list, $match)) {
$forms[] = $match[1];
$this->email = $match[1];
}
}
//mailアドレスを文章中に記載されているかを探す
$preg = "/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+\.([a-zA-Z0-9\._-]+)+$/";
foreach ($lists_word as $list) {
if (preg_match($preg, $list, $match)) {
$forms[] = $match[0];
$this->email = $match[0];
}
}

//メールアドレスがあれば挿入
foreach ($lists_mail as $list) {
$forms[] = $list;
$this->email = $list;
}

//問い合わせフォームを探す
//livedoorフォーム
$preg = "/message\.blogcms\.jp/";
foreach ($lists_href as $list) {
if (preg_match($preg, $list)) {
$forms[] = $list;
$this->form = $list;
}
}
foreach ($lists_form as $list) {
if (preg_match($preg, $list)) {
$forms[] = $list;
$this->form = $list;
}
}
//fc2form
$preg = "/form.*fc2\.com/";
foreach ($lists_href as $list) {
if (preg_match($preg, $list)) {
$forms[] = $list;
$this->form = $list;
}
}
foreach ($lists_form as $list) {
if (preg_match($preg, $list)) {
$forms[] = $list;
$this->form = $list;
}
}

//埋め込みフォーム子要素に
$xpath["path"] = "//form[//input/@value='formmail']/@action";
$xpath["match"] = "/^.*$/";
$xpath["num"] = 0;
$xpath["preg"] = 0;
$lists_form_2 = $this->xpath_and_preg($xpath, $xml);
foreach ($lists_form_2 as $list) {
$forms[] = (string) $list;
}

//特定キーワードからアバウトページを探す
$xpath["path"] = "//a";
$lists_word = $this->xpath_only($xpath, $xml);
$xpath["path"] = "//a//*";
$lists_word_deep = $this->xpath_only($xpath, $xml);
$keywords = [
"^.{0,10}問い合わせ.{0,10}$",
"^.{0,10}こちら.{0,10}$",
"^.{0,10}コチラ.{0,10}$",
"^.{0,20}について.{0,10}$",
"^.{0,20}(当|この|本)ブログ.{0,10}$",
"^.{0,10}about.{0,10}$",
"^.{0,10}連絡.{0,10}$",
"^.{0,10}アバウト.{0,10}$",
"^.{0,10}あばうと.{0,10}$",
"^.{0,10}contact.{0,10}$",
"^.{0,10}コンタクト.{0,10}$",
"^.{0,10}メール.{0,10}$",
"^.{0,10}mail.{0,10}$",
];
$this->status = "checked";
$this->form_checked = true;

foreach ($lists_word as $list) {
foreach ($keywords as $keyword) {
if (preg_match("/" . $keyword . "/sui", trim((string) $list))) {
$link = (string) $list->attributes()->href;
$collect = $this->url_collect($this->url, $link);
if ($collect !== false) {
if ($collect != null) {
$forms[] = $collect;
}
} else {
$this->status = "may_auto_site";
}
}
}

if ($list->children()) {
foreach ($list->children() as $child) {
foreach ($keywords as $keyword) {
if (preg_match("/" . $keyword . "/su", trim((string) $child))) {
$link = (string) $list->attributes()->href;
$collect = $this->url_collect($this->url, $link);
if ($collect !== false) {
if ($collect != null) {
$forms[] = $collect;
}
} else {
$this->status = "may_auto_site";
}
}
}
}
}
}

出典:code

Twitterを見つける等ありますが、ひとまずこんな形で探します。
Aboutページを見つけた場合、Aboutページでもまた検索をしなければいけません。

URLの候補をこうして見つけていくことが出来ますが、中には、Livedoorの初期デザインのまま、「このサイトについて」のリンク先を「#」としているサイトがあります。
#となっているサイトは、現在更新していたとしても自動で更新しているサイトである可能性が高いので、自動サイトとして位置づけています。

2chまとめブログリストのスクレイピング結果

4250サイトほど取得し、
稼働中のサイト:2000サイト
自動更新の可能性があるサイト:700サイト
Twitterアカウント:2000サイト
メールアドレス:700サイト

程が取得できました。

自動かどうかを知っていると営業する際の力の入れ方に力が変わってきます。

※なお、簡単にツール化していますので、リストやツールが欲しい方はぜひご連絡ください。
このツールから、メールへの一括送信や、テンプレートを飛ばすなども出来るよう調整をしている所です。

シェアする気になったらシェアする

ツイート

ユーザー情報ユーザーの紹介

Gmatom 浜田貴朗

2008年よりコミュニティサイトを運営しつつ、効果の高い広告はバナー広告では無く誘導的コンテンツ広告と気付き、コンテンツ作成を手掛ける。 ポイントサイト・キュレーションサイト・動画自動投稿サイトや自動記事作成ツール、自動フォローツール等ツールの開発等、主にウェブ系の業界にて開発・運営を行っています。 V系バーの立ち上げ・ウェブ戦略・立地戦略等飲食店の立ち上げ・運営も携わっていました。

関連するキーワードキーワードからまとめを探す