2013年11月29日金曜日

Stristr 指定文字以降の文字列を取得 PHP

指定の文字以降を取得、指定の文字列以降を取得、指定の日本語以降

stristrは、文字列の中から指定の文字以降を抜き出します。

【今回の目的】
とあるページから店舗名などの情報だけを抜き取りたい

file_get_contents()で、htmlソースを取得。

ここから文字取得の編集にてこずる。
str系の関数がPHPにはたくさん用意されているが逆引きなどではあまり詳しく説明していないので、ウェブの同士にに頼ることに

【結果】
店舗情報は「■店舗名」以降に決まった法則に従って記述されている。きっとDBから呼び出していることが予想できる。


header("content-type: text/plain; charset=UTF8");//文字コード

$f = file_get_contents("http://site.com?id=店舗id"); //

echo stristr($f, "■店舗名");


これでsite.com?id=16ページの「■店舗名」以降を取得。


そして、必要事項だけを抜出して連想配列にする。


<?php
header("content-type: text/plain; charset=UTF8");

$st = file_get_contents("http://site.com?id=16");// 必要なページのhtml取得
$st = str_replace("&nbsp;","",$st);// 不要な記号削除
$str = stristr($st, "■店舗名");// 連想配列の起点0を「■店舗名」に調整する。

$rep = array('【店舗情報】', '■店舗名', '『', '』', '■取扱募集代理店', '■所在地', '■電 話', '■開店日', '■営業時間', '■対応コース', '<br>', "\r", "\n");//連想配列の基本(タイトル作る)

$arr = array();//空箱を作る
$str = str_replace($rep, "\t", $str);//タブ区切り "\t"  カンマ区切り ","

//explode関数は文字列を文字または文字列で分割し配列にして返します。以下に使用例を示します。
foreach (explode("\t", $str) as $val) { if ($val !== '') $arr[] = $val; }

print '<pre>';
print_r($arr);
print '</pre>';
?>

それで、出てくるのが

<pre>Array
(
    [0] => 保険代理店A
    [1] => 東京中央店
    [2] => 株式会社ほけんプラプラ
    [3] => 東京中央区2-2 田中ビル5F
    [4] => 0120-00-0200
    [5] => 2013年3月1日
    [6] => 10:00~18:00
    [7] => ■定休日なし
    [8] => 来店
    [9] => ■URL
    [10] => <a href="http://site.com?id=16">http://site.com?id=16</a>
    [11] => </p>


ここまでくればあとはSQL文に編集してfunctionで必要なid分だけfor or foreachなんかで取得してしまおうってことです。

2013年11月28日木曜日

PHP cURL でページを取得 クロールもできる

一連の cURL cURL_setopt cURL_exec を使ってサイト情報のチェックと、店舗情報ををDBへ放り込む。

1000店ちかくある複数の代理店の、更新店舗と閉店店舗の管理をしている。
代理店統括から来る情報は遅く、各代理店毎に様式が違うので結局は各代理店の新着情報が頼みの綱。

だけど、時々、諸事情により新着に載せずに閉店している店舗があると面倒くさい。
都道府県ごとに店舗数を照らし合わせ、違いのある都道府県から閉店店舗を探し出すという作業。

すぐに見つかれば1時間程度で済むのだが、下手をすると3時間以上かかってしまう。



そこでクローラほど大げさなものでは無いのだが、代理店のショップ番号をcURLで照らし合わせてしまおうというのである。

【前情報 CURL の使い方】

$ch = curl_init(); // cURL使うよー
curl_setopt($ch, 値, TRUEかFALSE) // 設定をごにょる
$curl_exec($ch); // ここで実行
$curl_close($ch); // 俗に言うおまじない

例えばグーグルを拝借
$ch = curl_init(); // 起
curl_setopt($ch, CURLOPT_URL, "http://www.google.co.jp"); // 承
curl_exec($ch); // 転
curl_close($ch); // 結

 ちょっと画像やなんかがおかしいが代理店の情報があるかないかを調べるには十分

ってことで、理屈としては

  1. URLに付けられてる変数「?shop=○○」を1からforかwhileかなんかで新着店舗の500まで回す。
  2. SQL文でDBにあるかを参照
  3. DBに無い場合は追加(代理店サイトも当然プログラムを組んでいるのでhtmlについているid名なりclass名から予測)
  4. こちらが多い場合は削除する
な感じでクラス化しときましょうか。

出来たら追加します。




PHPのリダイレクト 広告管理

metaでrefreashさせて広告のアクセスを見ているサイトを目にする。

どうせならPHPのheader()と合わせて飛び先まで管理した方がいいのではないか。

ウェブ広告のタグがhtmlで管理すると、コピペをしまくると意外に労力がかかり時間もかかる。
人為的なミスも増えるので、広告コードを直接編集するのは極力避けるべきだと思う。

Yahoo!知恵袋のAPIを使ってみる

保険関連のSEOを調べ、気になるキーワードの上位表示ていると、ブログが多い。
その次に、「ヤフー知恵袋」など情報をまとめたものが多い。

Yahoo!知恵袋APIを使ってみる。

ヤフーIDは持っているのでデベロッパーから必要事項登録
http://developer.yahoo.co.jp/

アプリケーションID:
dj0zaiZpPVBCZ1V2ZldodUNETSZzPWNvbn・・・・・・・

秘密キーを取得

まずは用意されていたJS「爆速JSONP」なるものを試すと、サクサクッとコピペでヤフーAPIが引き込まれhtmlとJSの記述だけで利用できた。

本題、PHPのサンプルも用意されていたので質問検索(php)DLして使う。

簡単な検索窓のついたPHPが出来た。
気になる保険会社を検索してみると、先程、一般のYahooで上位表示されていた結果と同じだ。

これは使えそうだと感じた。


次は、いかに少ないコードで濃い結果を導くか!
それが出来ればかなりのPVが稼げそうだ。