ホームページ  >  記事  >  バックエンド開発  >  PHP Web クローラーは fsockopen を使用して HTTP リクエストを実装します

PHP Web クローラーは fsockopen を使用して HTTP リクエストを実装します

WBOY
WBOYオリジナル
2023-06-17 11:02:081763ブラウズ

Web クローラーは、ユーザーの行動をシミュレートすることでネットワーク上のデータを自動的にキャプチャし、保存または分析できる自動データ収集ツールです。広く使用されている Web 開発言語として、PHP には豊富な Web クローラー開発ツールとテクノロジーもあります。

この記事では、PHP の fsockopen 関数を使用して HTTP リクエストを実装し、それによって単純な Web クローラー システムを構築する方法を紹介します。 fsockopen 関数は、ソケット通信に関連する PHP 関数であり、TCP/IP プロトコルに基づいてネットワーク接続を確立するために使用できます。 fsockopen を使用して HTTP リクエストを行う場合は、HTTP プロトコルの仕様に従い、正しいリクエスト ヘッダー情報とリクエスト本文データを送信して、ターゲット ページの応答コンテンツを取得する必要があります。以下では、このプロセスを段階的に説明します。

ネットワーク接続の確立

fsockopen 関数を使用してネットワーク接続を確立する場合、ターゲット サーバーのホスト名とポート番号を指定する必要があり、HTTP サーバーの使用を選択できます。またはHTTPSプロトコル。以下は、単純なネットワーク接続の例です。

$hostname = 'example.com';   // 目标服务器主机名
$port = 80;                  // 目标服务器端口号
$protocol = 'tcp';           // 使用 TCP/IP 协议

$handle = fsockopen($protocol . '://' . $hostname, $port, $errno, $errstr);
if (!$handle) {
    echo '网络连接错误';
}

この例では、TCP/IP プロトコルを使用して、ターゲット サーバーのホスト名を example.com として指定し、ポート番号は 80 です。接続が成功した場合はソケット ハンドル $handle が返され、そうでない場合はネットワーク接続エラー メッセージが出力されます。

HTTP リクエストの送信

ネットワーク接続を確立した後、HTTP プロトコルに従って、正しい HTTP リクエスト ヘッダー情報とリクエスト本文データを送信する必要があります。具体的には、リクエストメソッド、リクエストパス、リクエストヘッダ情報、リクエストボディデータを定義し、仕様に従ってHTTPプロトコルに準拠した文字列に結合する必要があります。以下は、HTTP GET リクエストの送信例です。

$path = '/';           // 请求路径
$method = 'GET';       // 请求方法

// 组装请求头信息
$headers = array(
    'Host: ' . $hostname,
    'Connection: close',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
);

// 组装请求体数据
$body = '';

// 拼接 HTTP 请求
$request = $method . ' ' . $path . " HTTP/1.1
";
$request .= implode("
", $headers) . "
";
$request .= "
";
$request .= $body;

// 发送请求
fwrite($handle, $request);

この例では、リクエスト パスをルート ディレクトリ / として定義し、リクエスト メソッドを GET として定義します。次に、ホスト、接続、およびユーザー エージェントを含むリクエスト ヘッダー情報を定義します。便宜上、ここでは単純なユーザー エージェントを使用しますが、実際の開発では、サーバーによるブロックを避けるために、よりランダムで複雑な UA を使用する必要がある場合があります。次に、リクエスト本文のデータが空になるように定義しました。最後に、HTTP リクエストを連結し、fwrite 関数を介してターゲット サーバーに送信します。

HTTP 応答の受信

ターゲット サーバーは HTTP 要求を受信すると、HTTP 応答を返します。この応答には、応答ヘッダー情報と応答本体データが含まれます。 PHP の fread 関数を使用して、ソケット ハンドルから応答コンテンツを読み取り、応答ヘッダーと応答本文のデータを解析する必要があります。以下に例を示します。

// 接收响应
$response = '';
while (!feof($handle)) {
    $response .= fgets($handle);
}

// 关闭连接
fclose($handle);

// 解析响应
list($header, $body) = explode("

", $response, 2);
$headers = explode("
", $header);
$status = array_shift($headers);
list($version, $code, $reason) = explode(' ', $status, 3);

この例では、ループを使用して応答コンテンツを 1 行ずつ読み取り、それを $response 変数に保存します。次に、ターゲット サーバーへのネットワーク接続を閉じました。次に、explode 関数を使用して応答ヘッダーと応答本文を解析し、応答ヘッダーからステータス コードと応答の説明を取得します。実際の開発では、Content-Type、Set-Cookie などの他の応答ヘッダー情報も解析する必要がある場合があります。

これまで、比較的単純な HTTP リクエストの送信とレスポンスの解析プロセスを実装してきました。プロキシ サーバーの使用、ランダムな遅延の追加など、独自のニーズに応じて Web クローラー システムの機能とパフォーマンスをさらに改善および調整できます。同時に、Web クローラーの規範と倫理を遵守し、クローラー ツールを悪用したり、Web サイトの正当な権利や利益やユーザーのプライバシーを侵害したりしてはなりません。

以上がPHP Web クローラーは fsockopen を使用して HTTP リクエストを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。