Heim >Backend-Entwicklung >PHP-Tutorial >Der PHP-Webcrawler verwendet fsockopen, um HTTP-Anfragen zu implementieren
Ein Webcrawler ist ein automatisiertes Datenerfassungstool, das durch Simulation des Benutzerverhaltens automatisch Daten im Netzwerk erfassen und speichern oder analysieren kann. Als weit verbreitete Webentwicklungssprache verfügt PHP auch über eine Fülle von Webcrawler-Entwicklungstools und -technologien.
In diesem Artikel erfahren Sie, wie Sie mit der fsockopen-Funktion von PHP HTTP-Anfragen implementieren und so ein einfaches Webcrawler-System erstellen. Die fsockopen-Funktion ist eine PHP-Funktion im Zusammenhang mit der Socket-Kommunikation und kann zum Aufbau einer Netzwerkverbindung basierend auf dem TCP/IP-Protokoll verwendet werden. Wenn Sie fsockopen verwenden, um eine HTTP-Anfrage zu stellen, müssen Sie die HTTP-Protokollspezifikationen befolgen und korrekte Anfrage-Header-Informationen und Anfrage-Body-Daten senden, um den Antwortinhalt der Zielseite zu erhalten. Im Folgenden zeigen wir diesen Prozess Schritt für Schritt.
Wenn Sie die fsockopen-Funktion zum Herstellen einer Netzwerkverbindung verwenden, müssen Sie den Hostnamen und die Portnummer des Zielservers angeben und können zwischen der Verwendung des HTTP- oder HTTPS-Protokolls wählen. Das Folgende ist ein einfaches Beispiel für eine Netzwerkverbindung:
$hostname = 'example.com'; // 目标服务器主机名 $port = 80; // 目标服务器端口号 $protocol = 'tcp'; // 使用 TCP/IP 协议 $handle = fsockopen($protocol . '://' . $hostname, $port, $errno, $errstr); if (!$handle) { echo '网络连接错误'; }
In diesem Beispiel geben wir den Hostnamen des Zielservers example.com unter Verwendung des TCP/IP-Protokolls an und die Portnummer ist 80. Wenn die Verbindung erfolgreich ist, wird ein Socket-Handle $handle zurückgegeben; andernfalls wird eine Netzwerkverbindungsfehlermeldung ausgegeben.
Nach dem Herstellen der Netzwerkverbindung müssen wir die korrekten HTTP-Anfrage-Header-Informationen und Anforderungstextdaten gemäß dem HTTP-Protokoll senden. Insbesondere müssen wir die Anforderungsmethode, den Anforderungspfad, die Anforderungsheaderinformationen und die Anforderungskörperdaten definieren und diese in eine Zeichenfolge zusammenfügen, die dem HTTP-Protokoll gemäß der Spezifikation entspricht. Das Folgende ist ein Beispiel für das Senden einer HTTP-GET-Anfrage:
$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);
In diesem Beispiel definieren wir den Anforderungspfad als Stammverzeichnis / und die Anforderungsmethode als GET. Anschließend definieren wir die Anforderungsheaderinformationen, zu denen Host, Verbindung und Benutzeragent gehören. Der Einfachheit halber verwenden wir hier einen einfachen Benutzeragenten. In der tatsächlichen Entwicklung müssen Sie möglicherweise eine zufälligere und komplexere UA verwenden, um eine Blockierung durch den Server zu vermeiden. Als Nächstes haben wir die Daten des Anforderungshauptteils als leer definiert. Abschließend verketten wir die HTTP-Anfrage und senden sie über die Funktion fwrite an den Zielserver.
Wenn der Zielserver die HTTP-Anfrage empfängt, gibt er eine HTTP-Antwort zurück. Diese Antwort umfasst Antwortheader-Informationen und Antworttextdaten. Wir müssen die fread-Funktion von PHP verwenden, um den Antwortinhalt aus dem Socket-Handle zu lesen und die Antwortheader- und Antwortkörperdaten zu analysieren. Hier ist ein Beispiel:
// 接收响应 $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);
In diesem Beispiel verwenden wir eine Schleife, um den Antwortinhalt Zeile für Zeile zu lesen und ihn in der Variablen $response zu speichern. Anschließend haben wir die Netzwerkverbindung zum Zielserver geschlossen. Als nächstes verwenden wir die Explosionsfunktion, um den Antwortheader und den Antworttext zu analysieren und den Statuscode und die Antwortbeschreibung aus dem Antwortheader abzurufen. In der tatsächlichen Entwicklung müssen wir möglicherweise auch andere Antwortheaderinformationen analysieren, z. B. Content-Type, Set-Cookie usw.
Bisher haben wir einen relativ einfachen Prozess zum Senden von HTTP-Anfragen und zum Parsen von Antworten implementiert. Sie können die Funktionen und Leistung des Webcrawler-Systems weiter verbessern und an Ihre eigenen Bedürfnisse anpassen, z. B. durch die Verwendung eines Proxyservers, das Hinzufügen zufälliger Verzögerungen usw. Gleichzeitig sollten wir uns auch an die Normen und Ethik von Webcrawlern halten, Crawler-Tools nicht missbrauchen und die legitimen Rechte und Interessen der Website sowie die Privatsphäre der Benutzer nicht verletzen.
Das obige ist der detaillierte Inhalt vonDer PHP-Webcrawler verwendet fsockopen, um HTTP-Anfragen zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!