PHPで簡単なWebクローラーを作ってみた

Webサイトから必要な情報を収集することと言えば、近年流行りのPythonだよね！今回は初心者がPHPで簡単なクローラーを作り、わかりやすくスクレイピングの方法についてご紹介します。

始める前に、WebスクレイピングとWebクローラーの概要を説明します。

[Webスクレイピング](https://www.octoparse.jp/blog/web-scraping/)とは、WebページのHTML内から情報を抽出することです。

[Webクローラー](https://www.octoparse.jp/blog/what-is-web-crawler/)とは、一般的にWEB上を巡回してWebサイトの情報を収集するボットプログラムのことを指します。

それでは、始めましょう！

 

#ステップ1

Webページに入力ボックスと送信ボタンを追加します。入力ボックスにWebページのURLを入力できます。
![php-extract-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/a7ee525e-ff68-ea58-a5a3-4e4fd6143fe7.jpeg)



#ステップ2

データを抽出するときには正規表現が必要です。


```
function preg_substr($start, $end, $str) // Regular expression      

{      

    $temp = preg_split($start, $str);      

    $content = preg_split($end, $temp[1]);      

    return $content[0];      

}  
```  

 

#ステップ3

データを抽出するときは文字列分割が必要です。

 
```
function str_substr($start, $end, $str) // string split       

{      

    $temp = explode($start, $str, 2);      

    $content = explode($end, $temp[1], 2);      

    return $content[0];      

}
```
 

#ステップ4

関数を追加し抽出した内容を保存します。

```
function writelog($str)

{

  @unlink("log.txt");

  $open=fopen("log.txt","a" );

  fwrite($open,$str);

  fclose($open);

} 
```

抽出したコンテンツがブラウザに表示されるものと一致しない場合、正しい正規表現を見つけることができません。ここで保存した.txtファイルを開いて正しい文字列を見つけることができます。

```
function writelog($str)

{

@unlink("log.txt");

$open=fopen("log.txt","a" );

fwrite($open,$str);

fclose($open);

}
```
 

#ステップ5

画像を抽出したいなら、関数も必要とされます。

```
function getImage($url, $filename='', $dirName, $fileType, $type=0)

   {

    if($url == ''){return false;}

    //get the default file name

    $defaultFileName = basename($url);

    //file type

    $suffix = substr(strrchr($url,'.'), 1);

    if(!in_array($suffix, $fileType)){

        return false;

    }

    //set the file name

    $filename = $filename == '' ? time().rand(0,9).'.'.$suffix : $defaultFileName;

          

    //get remote file resource

    if($type){

        $ch = curl_init();

        $timeout = 5;

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

        $file = curl_exec($ch);

        curl_close($ch);

    }else{

        ob_start();

        readfile($url);

        $file = ob_get_contents();

        ob_end_clean();

    }

    //set file path

    $dirName = $dirName.'/'.date('Y', time()).'/'.date('m', time()).'/'.date('d',time()).'/';

    if(!file_exists($dirName)){

        mkdir($dirName, 0777, true);

    }

    //save file

    $res = fopen($dirName.$filename,'a');

    fwrite($res,$file);

    fclose($res);

    return $dirName.$filename;

    }
```

 

#ステップ6

抽出用のコードを書きます。例として、AmazonのWebページを見てみましょう。まず商品のページリンクを入力します。

```
if($_POST[‘URL’]){

//---------------------example-------------------

$str = file_get_contents($_POST[‘URL’]);

$str = mb_convert_encoding($str, ‘utf-8’,’iso-8859-1’);

writelog($str);

//echo $str;

echo(‘Title:’ . Preg_substr(‘/<span id= “btAsinTitle”[^>}*>/’,’/<Vspan>/$str));

echo(‘<br/>’);

$imgurl=str_substr(‘var imageSrc = “’,’”’,$str);

echo ‘<img src=”’.getImage($imgurl,”,’img’ array(‘jpg’)); 
``` 

 

そうすると、抽出する商品が出てきます。以下はスクリーンショットです。
![php-extract-2-new.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/0dc234ac-8ec8-ada6-d98c-d2b24643868b.jpeg)




いかがでしたでしょうか。

PythonやJavaScript、PHPなどのプログラミング言語でお仕事にしているプロ級の方にとってはすごく簡単ですが、プログラミングに詳しくない方は練習する必要があります。今では、Webスクレイピング技術の開発に伴い、Webスクレイピングツールが増え、コーディングする必要はもうありません。

例えば、[Ocotpase](https://www.octoparse.jp)の[Webスクレイピングテンプレート](https://www.octoparse.jp/blog/a-revolutionary-web-scraping-software-to-boost-your-business-easier/)を使用すると、ワンタッチでWebサイトからデータを収集することができます。皆さんも使ってみましょう！
![タスクテンプレート.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/000de708-0c37-e7c3-d168-eae9e9e72502.gif)