- Published on
スクレイピングをしてwordpressに記事を作成・保存する方法
目次
wordpressで外部から情報を取得して記事として保存する方法です。
いわゆるスクレイピングという手法を使います。
簡単に説明すると、他サイトのデータを自動で取得してきてもらう。ということです。
ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー[1]あるいはウェブ・スパイダー[2]とも呼ばれる。 通常このようなソフトウェアプログラムは低レベルのHTTPを実装することで、もしくはウェブブラウザを埋め込むことによって、WWWのコンテンツを取得する。
お約束ですが、こういったこともできるんだねーという意味なので悪用とかはしないでくださいね。著作権とか対象サイトの規約とか守りましょう。
※PHPのスクレイピングライブラリでは、reactやvueなどでjavascriptレンダリングされているサイトは基本取得できません。
ソースをみると一見違いがわかりませんが、レンダリングされる前は
のようになっていてスクレイピング(クロール)時は空タグとして認識されてしまいます。
1例としてインスタグラムは今回の方法ではスクレイピングできません。
この問題はヘッドレスブラウザなどで対処できる可能性が高いですが別の機会に。。
また、自動まとめプラグインを作成してみたのでよかったらどうぞ。
[kanren id="15527"]
さて本題にいきますね。
今回は「Goutte」というphpのライブラリを使ってサイトのクローリングと記事作成をおこなってみます。
ライブラリを使わずにデータを取得するにはfile_get_contentsという関数があります。
composerはphpのライブラリやパッケージを管理するもので、使いたいライブラリの導入や削除が簡単にできます。
毛嫌いする方もいるかもしれませんが、コマンドを使います。。
composerをインストールします
composer公式サイトはこちら
brewが使える環境であれば1発でインストールできます。
brew install homebrew/php/composer
他の方法でインストールする場合
curl -sS https://getcomposer.org/installer | php
php -r "readfile('https://getcomposer.org/installer');" | php
これでcomposerはインストールできたかと思います。
composerと打つだけで使えるようにする
mv composer.phar /usr/local/bin/composer
これでcomposerが使えます。
次にスクレイピングライブラリのインストールをします
composer require fabpot/goutte
これでライブラリのインストールができ、スクレイピングができる状態になりました。
基本のコード
実際にスクレイピングをするコードです。
まず、スクレイピングをするための準備をします。
use Goutte\Client;
//インスタンスを作成
$client = new Client();
requestに対象サイトを指定してデータ(html)を取得します。
$crawler = $client->request('GET', 'https://example.com');
取得した情報は変数$crawlerに格納されているので、中身を確認する場合はprintやechoで表示できます。
//取得サイトのHTMLを表示する
print $clawlar->html();
各要素、プロパティへのアクセスはCSSやjQueryのようにかけます。
//クラス名がタイトルのテキストを抽出する
$title = $clawlar->filter('.title')->text();
//titleを表示
print $title;
複数ある要素をループ内でそれぞれ取り出すこともできます。
filterはHTMLのタグやCSSのタグ属性を指定したりできます。
$crawler->filter('a')->each(function ($node) {
print $node->text()."\n";
});
基本はこのあたりにしまして、wordpressへ記事として保存をしていきたいと思います。
※他にも次ページに移動したり、form送信もできたり便利な使い方もできます。
取得した情報をwordpressに投稿する
use Goutte\Client;
$client = new Client();
//取得開始
$crawler = $client->request('GET', 'https://example.com');
//取得できてるかチェック
if(!empty($crawler)):
$crawler->filter('.main')->each(function ($node) {
$title = $node->filter('.title')->text()."\n";
$content = $node->filter('.entry')->text()."\n";
});
elseif:
echo '取得できてないよ';
endif;
$post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'draft',
);
// 記事として投稿を追加する
wp_insert_post( $post );
かなり簡単に書きましたが、スクレイピング部分は取得したい要素にあわせて変更します。
'post_status' => 'draft',は記事を下書きで保存します。
上記のコードではタイトルと本文が入った状態で記事が下書きで保存されています。
以上がスクレイピングでwordpressに記事を保存する方法でした。