エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較

      2020/02/08

PHPの cURLで APIや Webサイトにアクセスする方法

 

file_get_contentsもあるけど cURLの方が細かな制御が可能

 
PHPのプログラムの処理の一つとして
・APIにアクセスをする
・Webスクレイピングをする
という場合には、PHPのプログラムから Webサイトにアクセスをする必要があります。
 
そんなときに「cURL(カール)」を使って Webサイトにアクセスする方法を解説します。
 
 
PHPから Webサイトにアクセスする場合は「file_get_contents()」を使うと簡単にページの情報を取得できますので便利です。
 
ですが、下記のサイトにあるように、「file_get_contents()」では厳密な制御が難しいという難点があります。
https://qiita.com/shinkuFencer/items/d7546c8cbf3bbe86dab8
 
個人的なツールを作成するときには file_get_contents()でも問題なくても、Webサービスを作成する場合にはトラブルにつながる可能性があるわけです。
 
そんなわけで、PHPから Webサイトにアクセスするときは、cURLを利用することをおすすめします。
 
 

cURLで Webサイトから情報を取得する関数の一例

 
cURLを利用して Webサイトにアクセスして、そのレスポンスを取得する関数としては下記のように記述できます。
先に紹介したサイトのサンプルソースをほぼそのままですが。
 

 
アクセスする URLをパラメータとして付与して関数を呼び出します。
JSON形式で結果を返してくれる APIにアクセスしたと想定すると、結果を配列で取り出すことができる、という仕組みのものです。
 
 

SSLでアクセス、UserAgentが必要なページへの対応を行った cURLの関数

 
ですが、このサンプルソースでは、2つの条件では正常に情報を取得することが出来ません。
 
・SSLでアクセスする必要があるページ
・UserAgentを必要とするページ
 
 
最近は、多くのサイトが SSLに対応してきまして、SSLでのみアクセス可能なサイトも増えてきました。
そのため、SSLでのアクセス対応は必須といえます。
 
また、自動プログラムによるアクセスやスクレイピングされることの対策として、UserAgentが設定されていない状態でのアクセスを拒否するサイトも存在しています。
 
というわけで、この 2つを対策してみましょう。
 
 
また、先のソースは APIにアクセスして JSONをレスポンスとして取得する想定でしたが、単純に HTMLを取得する場合もあるでしょうから、それを分岐した処理も加えてみます。(さらに、header情報のみを取得する処理も加えてみます。)
 
 

 
 
上記の「CURLOPT_USERAGENT」のパラメータとして指定している「USER_AGENT_TEXT」は、下記のような感じで定数として指定している想定です。
 

 
 

SSLでのアクセスが必要なサイトにアクセスしたときのエラー

 
SSLでのアクセスが必要なサイトにアクセスしたときに表示されるエラーの一例は、以下のようになります。
 

 
SSLでサイトにアクセスする際は、サーバ証明書のチェックを行いますが、上記のエラーは「サーバ証明書がありません」というものです。
そのため、先の設定では、SSLでアクセスする際もサーバ証明書のチェックを行わない、とするものです。
 
 
ですが、サーバ証明書を設置することで本来の SSLアクセスであるサーバ証明書をチェックしながら正常にアクセスをする方法もあります。
 
詳しくは下記の記事などが参考になるかと思います。
https://www.softel.co.jp/blogs/tech/archives/4026
 
 

UserAgentがない状態でサイトにアクセスしたときのエラー

 
UserAgentがない状態でサイトにアクセスしたときのエラーは、サイトによってさまざまです。
そのため、こんなエラーが出ますという表現は意味を持ちませんが、この記事を書くきっかけとなったサイトでは下記のようなエラーがでていました。
 
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
 
上記のエラーは、「サポート外のブラウザです」ということですので、正しく見ることができるブラウザの UserAgentを指定してみるといいのではないか、と思います。

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!

PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。

JSON形式の値を配列形式に変換・PHPでは json_decode()、json_encode()
JSON形式の値を配列形式に変換・PHPでは json_decode()、json_encode()

JSONとは「JavaScript Object Notation」の略でテキストベースのデータフォーマット。JSONの値をPHPで配列に変換するWebツールの紹介とその処理「json_encode()」「json_decode()」関数の解説。

PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法
PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法

PHPで配列の値を、preg_replace関数でクォーテーションで囲み、implode関数で「,(カンマ)」で区切ってテキスト化する方法。この方法であれば配列が空でも分岐の処理は必要なし!

PHPで正規表現の検証には preg_match_allが便利

PHPで正規表現の検証には preg_match_allが便利です。その便利さの使い方の解説です。

ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について

レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。

Basic認証の.htaccess、.htpasswd生成ツールと解説

Basic認証を設定する際に必要となる.htaccess、.htpasswdファイルを生成するツール。ID、PASS、.htpasswdへのパスを入力することで編集する情報を生成します。

CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説
CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説

CentOS6系、7系のPHPバージョンを5.3から5.6、7.0、7.1にアップする作業手順と解説。yum updateコマンドを使い作業時間は約10分。コマンドの解説や引数の意味なども解説しているので役に立つはず。

QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)作成サービスを公開

QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。

PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い

PHPのデバッグ等で変数や配列の中身を確認するために使用する関数print_r、var_dump、var_exportの動作の違い、仕様の違いについて確認した。var_exportがオススメ。

ECCUBEの商品一覧ページのSEO対策!rel=”next” rel=”prev”を設定

Googleは関連あるページはその旨明示するよう求めています。ECCUBEの商品一覧ページでその求めに応じるための「rel=”next”」「rel=”prev”」について解説します。