自宅サーバの整理箱

自宅サーバを構築しwordpress,fedora,CentOSの作業メモ

*

画像投稿サイトsankakucomplex.comの画像をスクレイピングしてWordPressへ投稿する。

   

スクレイピングの練習に「画像投稿サイトのsankakucomplex.com」から検索した画像を取得するスクリプトを作成しました。
ついでに取得した画像をWordpressに自動投稿してみました。
設定したらhttp://設定URL/sankakucomplex.phpへアクセスしてください。
キーワードを入力する画面が表示されます。

■sankakucomplex.php

<?php 
//-----------------------------
//USER CONFIG
//-----------------------------
$SITE_ID = 4;
$CAT_ID  = 3;
$STATUS = 'draft';
$MAX_POST_NUM = 4;
$TITLE = 'SAMPLE2';
$TOPURL ='https://chan.sankakucomplex.com/?commit=Search&tags=';

//基本設定
include_once('/var/www/simplehtmldom/simple_html_dom.php');
require_once('/var/www/html/wordpress/wp-load.php');
require_once('/var/www/html/wordpress/wp-includes/user.php');
require_once('/var/www/html/wordpress/wp-includes/category-template.php');
require_once 'MDB2.php';
$db = "mysql://wordpress:wordpress@localhost/wordpress?charset=utf8";
$mdb2 =& MDB2::factory($db); //connect

//フォームの表示(初期表示)
if($_POST['keyword']=='')
{
    //MENU
    echo '<html lang="ja"><head>';
    echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
    echo '</head><body>';
    echo "<form action=". $_SERVER['PHP_SELF']. " method='post'>";
    echo "キーワード:<input type='text' name='keyword' size=20><br>";
    echo "<input type='submit' name='submit' value='送信'>";
    echo "</form>";
    echo "</body>";
    echo "</html>";
    return 0;
}
else
{
    $keyword = urlencode($_POST['keyword']);
    $TOPURL .= $keyword; 
}

//WordPress-SignOn
$creds = array();
$creds['user_login'] = 'wpadmin';
$creds['user_password'] = 'wpadmin';
$creds['remember'] = true;
$user = wp_signon( $creds, false );

if (is_wp_error($user)){
   echo $user->get_error_message();
   return;
}else{
//   echo "login OK<br/>";
}

//Category Make
switch_to_blog( $SITE_ID );
$cat_url = get_the_category_by_ID($CAT_ID);
restore_current_blog();

//-----------------------------
//スクレイピング部
//-----------------------------
//listからdetail-URLを取得
$loop_count = 0;
$post_count = 0;
ini_set('user_agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');

$html = file_get_html($TOPURL);
$area = $html->find('div.content div', 0);
$vurl = $area->find('span a');

$iLoop = 0;
foreach ($vurl as $imgurl) {

    //Loop4までスキップ
    if($iLoop < 4)
    {
	$iLoop = $iLoop + 1;
	continue;
    }

    //vurl連想配列から画像URLを抽出
    $detail = file_get_html('https://chan.sankakucomplex.com/ja' . $imgurl->href);
    $imgtag = $detail->find('div#post-content img', 0);

    $pos    = mb_strpos($imgtag->src,'?');
    $imgsrc = 'https:' . mb_substr($imgtag->src,0 , $pos);

    //sava imagefile
    $wp_upload_dir = wp_upload_dir();
    $IMGDIR= $wp_upload_dir['path']. '/';
    $URLPATH=$wp_upload_dir['url']. '/';

    $imgdata = file_get_contents($imgsrc);
    if ($imgdata == false)
    {
            continue;
    }
    $exp = end(explode('.', $imgsrc));
    if($exp == 'jpg' || $exp == 'png' || $exp == 'gif')
    {
            //ok
            $filename =strtotime( "now" ). '.'. $exp;
            $filesavepath= $IMGDIR. $filename;
            $imageurl = $URLPATH. $filename;
            file_put_contents($filesavepath,$imgdata);
    }

    $vlist[] = array('imgsrc' => $imageurl,
		     'alt' => $imgtag->alt
                    );
 
   $iLoop = $iLoop + 1;
    if($iLoop >= $MAX_POST_NUM + 4)
    {
	break;
    }
}

$content = '';
foreach ($vlist as $item) {
	$imgtag   = "<img src='" .$item['imgsrc'] . "' alt='" .$item['alt'] . "'><br/>";
	$content .= $imgtag; 
}
$content .= "<br/>引用元:画像は<a href=" . $TOPURL . ">sankakucomplex.com</a>より引用<br/>";

//-- debug sta --
//echo "<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body>";
//echo $content;
//echo "<br/>";
//echo "</body></html>";
//return;
//-- debug end --

//-----------------------------
//以下WordPress投稿処理
//-----------------------------
/* 同じタイトルの記事はスキップ */
$tablename = 'wp_'.$SITE_ID.'_posts';
$sql = "SELECT COUNT(*) FROM `$tablename` WHERE `post_title` = '$TITLE'";
$count = 0;
$count = $mdb2->queryOne($sql);

if($count > 0 ){
    $errmsg = 'Double-Post-Check SQL-ERROR(' .$count .') <br>';
    echo $errmsg;
    return;
}else{

}

$post_value = array(
    'post_author' => 1,                         // 投稿者のID。
    'post_title' =>"{$TITLE}",                  // 投稿のタイトル
    'post_content' =>"{$content}",              // 投稿の本文。
    'post_category' =>array($CAT_ID),           // カテゴリーID(配列)。
    'post_status' => "{$STATUS}"                // 公開ステータス。
);

//$insert_idには投稿のID(「wp_posts」テーブルの「ID」)が入る。 投稿に失敗した場合は0が返る。
switch_to_blog( $SITE_ID );
remove_filter('content_save_pre', 'wp_filter_post_kses');
$insert_id = wp_insert_post($post_value,true);
restore_current_blog();

if(is_wp_error($insert_id)) {
    /* 投稿に失敗した時の処理等を記述 */
    echo 'error';
    echo $insert_id;
} else {
    /* 投稿に失敗した時の処理等を記述 */
    $okmsg = 'OK(' .$insert_id .')<br>';
    echo $okmsg;
}

return;

?>

下記の部分はご使用環境に合わせて変更してください。
・ワードプレスの配置場所へ変更
・DBユーザとパスワードを変更

//基本設定
include_once('/var/www/simplehtmldom/simple_html_dom.php');
require_once('/var/www/html/wordpress/wp-load.php');
require_once('/var/www/html/wordpress/wp-includes/user.php');
require_once('/var/www/html/wordpress/wp-includes/category-template.php');
require_once 'MDB2.php';
$db = "mysql://wordpress:wordpress@localhost/wordpress?charset=utf8";

■ダウンロードはこちら

 - Word Press, スクレイピング

 Total 541 views