Maison  >  Article  >  développement back-end  >  Le robot d'exploration Web PHP utilise fsockopen pour implémenter les requêtes HTTP

Le robot d'exploration Web PHP utilise fsockopen pour implémenter les requêtes HTTP

WBOY
WBOYoriginal
2023-06-17 11:02:081763parcourir

Un robot d'exploration Web est un outil de collecte de données automatisé qui peut automatiquement capturer des données sur le réseau en simulant le comportement des utilisateurs et les stocker ou les analyser. En tant que langage de développement Web largement utilisé, PHP dispose également d’une multitude d’outils et de technologies de développement de robots d’exploration Web.

Cet article expliquera comment utiliser la fonction fsockopen de PHP pour implémenter des requêtes HTTP afin de créer un système de robot d'exploration Web simple. La fonction fsockopen est une fonction PHP liée à la communication Socket et peut être utilisée pour établir une connexion réseau basée sur le protocole TCP/IP. Lorsque vous utilisez fsockopen pour effectuer une requête HTTP, vous devez suivre les spécifications du protocole HTTP et envoyer les informations d'en-tête de requête correctes et les données du corps de la requête pour obtenir le contenu de la réponse de la page cible. Ci-dessous, nous montrerons ce processus étape par étape.

Établir une connexion réseau

Lorsque vous utilisez la fonction fsockopen pour établir une connexion réseau, vous devez spécifier le nom d'hôte et le numéro de port du serveur cible, et vous pouvez choisir d'utiliser le protocole HTTP ou HTTPS. Voici un exemple simple de connexion réseau :

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

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

Dans cet exemple, nous spécifions le nom d'hôte du serveur cible example.com, en utilisant le protocole TCP/IP, et le numéro de port est 80. Si la connexion réussit, un handle de socket $handle sera renvoyé ; sinon, un message d’erreur de connexion réseau sera généré.

Envoyer une requête HTTP

Après avoir établi la connexion réseau, nous devons envoyer les informations d'en-tête de requête HTTP correctes et demander les données du corps conformément au protocole HTTP. Plus précisément, nous devons définir la méthode de requête, le chemin de la requête, les informations d'en-tête de la requête et les données du corps de la requête, et les regrouper en une chaîne conforme au protocole HTTP conformément à la spécification. Voici un exemple d'envoi d'une requête 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);

Dans cet exemple, nous définissons le chemin de la requête comme répertoire racine / et la méthode de requête comme GET. Ensuite, nous définissons les informations d'en-tête de la demande, qui incluent l'hôte, la connexion et l'agent utilisateur. Pour plus de commodité, nous utilisons ici un simple agent utilisateur. Dans le développement réel, vous devrez peut-être utiliser un UA plus aléatoire et plus complexe pour éviter d'être bloqué par le serveur. Ensuite, nous avons défini les données du corps de la requête comme étant vides. Enfin, nous concaténons la requête HTTP et l'envoyons au serveur cible via la fonction fwrite.

Recevoir une réponse HTTP

Lorsque le serveur cible reçoit la requête HTTP, il renvoie une réponse HTTP. Cette réponse comprend des informations d’en-tête de réponse et des données de corps de réponse. Nous devons utiliser la fonction fread de PHP pour lire le contenu de la réponse à partir du handle du socket et analyser l'en-tête de la réponse et les données du corps de la réponse. Voici un exemple :

// 接收响应
$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);

Dans cet exemple, nous utilisons une boucle pour lire le contenu de la réponse ligne par ligne et le stocker dans la variable $response. Nous avons ensuite fermé la connexion réseau au serveur cible. Ensuite, nous utilisons la fonction d'explosion pour analyser l'en-tête et le corps de la réponse, et obtenir le code d'état et la description de la réponse à partir de l'en-tête de la réponse. Dans le développement réel, nous pouvons également avoir besoin d'analyser d'autres informations d'en-tête de réponse, telles que Content-Type, Set-Cookie, etc.

Jusqu'à présent, nous avons implémenté un processus d'envoi de requêtes HTTP et d'analyse de réponse relativement simple. Vous pouvez encore améliorer et ajuster les fonctions et les performances du système de robot d'exploration Web en fonction de vos propres besoins, comme l'utilisation d'un serveur proxy, l'ajout de délais aléatoires, etc. Dans le même temps, nous devons également respecter les normes et l'éthique des robots d'exploration, ne pas abuser des outils de robots et ne pas porter atteinte aux droits et intérêts légitimes du site Web et à la vie privée des utilisateurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn