2019年8月2日金曜日

PHPでクロール・スクレイピング

データ取得の自動化ができれば、AI学習も迅速に対応できます。
ということで、今回はPHPを使ってWebからデータの自動取得を行います。

今までは、お手軽な file_get_contents がよく使われていましたが、
タイムアウト処理が不向きであったりや、なにかとセキュリティの向上で
利用できなくしているレンタルサーバーもあるので、curlを使ってみます。

例として、ヤフーのページを取得後、URLのみを抽出します。
 $url = "https://www.yahoo.co.jp/";
 $url = "https://weather.yahoo.co.jp/weather/jp/40/8210/40133.html";
 $ua = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
 //$ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36";
 
 $crl = curl_init();
 //curl_setopt($crl, CURLOPT_POST, true);
 //curl_setopt($crl, CURLOPT_POSTFIELDS, $param);
 curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false); // SSLのページはこれがないと読めない
 curl_setopt($crl, CURLOPT_URL, $url);
 curl_setopt($crl, CURLOPT_USERAGENT, $ua);
 curl_setopt($crl, CURLOPT_HEADER, false); // false=ヘッダー表示なし、true=ヘッダー表示あり
 curl_setopt($crl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($crl, CURLOPT_FRESH_CONNECT, true);
 curl_setopt($crl, CURLOPT_AUTOREFERER, true);
 curl_setopt($crl,CURLOPT_TIMEOUT, 3);  // タイムアウト(秒)
 $response = curl_exec($crl);
 $info = curl_getinfo($crl);
 $errorNo = curl_errno($crl);
 $code = curl_getinfo($crl, CURLINFO_HTTP_CODE);
 //echo $code;
 if ($errorNo === CURLE_OK) {
  $header_size = curl_getinfo($crl, CURLINFO_HEADER_SIZE);
  $header = substr($response, 0, $header_size); // headerだけ切り出し
  $body = substr($response, $header_size);  // bodyだけ切り出し
  
  //var_dump($response);
  //var_dump($info);
  
  //echo $header;
  //echo $body;
  
  // URLのみ抽出
  if (preg_match_all('(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)', $body, $result) !== false) {
   foreach ($result[0] as $value) {
    print $value . '
';
   }
  }
 }
 curl_close($crl);

抽出したURLがこちら。簡単にできますね。

シェルパラボ(システム開発・ソフトウェア作成業務請負)
https://www.chomolungma.biz/
https://www.filetalk.info/index.html
 

0 件のコメント:

コメントを投稿