Mit der rasanten Entwicklung des Internets ist das Zeitalter der Informationsexplosion angebrochen. In einer Zeit wie dieser sind Suchmaschinen zu unserem wichtigsten Instrument zur Informationsbeschaffung geworden, und die riesigen Datenmengen, die diese Suchmaschinen bereitstellen, übersteigen unsere Vorstellungskraft. Für Forscher oder Datenanalysten in bestimmten Bereichen stellen die benötigten Informationen jedoch möglicherweise nur einen kleinen Teil der Daten in diesen Suchergebnissen dar. In diesem Fall müssen wir einen Crawler verwenden, um genau die Daten zu erhalten, die wir wollen.
In diesem Artikel werden wir PHP verwenden, um ein einfaches Crawler-Programm zu schreiben, um die benötigten Daten aus den Baidu-Suchergebnissen zu extrahieren. Der Kern dieses Programms besteht darin, die cURL-Bibliothek von PHP zu verwenden, um HTTP-Anforderungen zu simulieren, und dann reguläre Ausdrücke und andere Methoden zum Parsen der HTML-Seite zu verwenden.
Bevor wir mit dem Schreiben des Crawler-Programms beginnen, müssen wir einige Fragen klären:
Bei der Überlegung, welche Daten wir beschaffen müssen, nehmen wir als Beispiel das Schlüsselwort „PHP-Crawler“. Wenn wir dieses Schlüsselwort auf Baidu suchen, können wir die folgenden Informationen sehen:
Dann haben wir Unser Ziel kann darin bestehen, den Titel, die Beschreibung und die URL jedes Ergebnisses aus den Baidu-Suchergebnissen zu extrahieren.
Der erste Schritt zur Datenbeschaffung besteht darin, die URL zu klären, die wir erhalten möchten. In unserem Beispiel ist die URL, die wir benötigen, diese: https://www.baidu.com/s?wd=php%20crawler
. Durch Eingabe von „php crawler“ in die Baidu-Suchleiste können wir automatisch zu dieser URL springen. https://www.baidu.com/s?wd=php%20爬虫
。通过在百度搜索栏中输入“php 爬虫”,我们可以自动跳转到这个 URL。
接着,我们需要了解我们将要解析的数据的格式。在我们的例子中,搜索结果以类似下面的 HTML 代码的形式存在:
<div class="result c-container "> <h3 class="t"> <a href="http://www.example.com/" target="_blank" class="c-showurl"> www.example.com </a> <em>PHP</em> 爬虫是什么? - PHP 入门教程 - 极客学院 </h3> <div class="c-abstract"> <span class=" newTimeFactor_before_abs">2天前 - </span> <em>PHP</em> 爬虫是一种方便快捷的数据采集方式 ... 目前的爬虫主要是通过<a href="https://www.baidu.com/s?wd=python%20爬虫&rsp=1&f=8&ie=utf-8&tn=95754739_hao_pg" target="_blank" class="text-underline">python 爬虫</a>实现。相比于 <a href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_nsisbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&wd=&eqid=f774f5d00003a46c000000065f51fc9a" target="_blank" class="text-underline">PHP</a>,<a href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_ns isbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt& wd=&eqid=f774f5d00003a46c000000065f51fc9a" target="_blank" class="text-underline">PHP</a> 一般用作... </div> </div>
在以上 HTML 代码片段中,可以看到每个搜索结果都嵌套在 <div class="result c-container ">
标签内。每个搜索结果都有一个标题,对应的 HTML 格式为 <h3 class="t">
,其中链接地址嵌套在 <a>
标签内。每个搜索结果都有一个描述,对应的 HTML 格式为 <div class="c-abstract">
。每个搜索结果还有一个网址,在 <a>
标签内含有 class="c-showurl"
。
现在我们已经明确了我们要获取到的数据的格式及我们需要解析的 HTML 数据的格式,我们已经可以开始编写我们的爬虫程序了。
我们将我们的 PHP 爬虫代码分成了三个步骤:
我们可以使用 PHP 的 cURL 库发送 HTTP 请求,从而获取百度搜索结果的 HTML 页面。在这个例子中,我们将搜索页面的 URL 存在 $url
变量中。然后创建一个 cURL 的句柄,并设置许多选项,例如:设置 URL、设置请求头、设置代理、设置超时、设置请求方式为 GET,最后执行这个句柄,获取 HTML 页面。
<?php $url = "https://www.baidu.com/s?wd=php%20爬虫"; // 创建curl句柄 $ch = curl_init(); // 设置curl选项 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt( $ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Referer: https://www.baidu.com/', 'Connection: keep-alive', ] ); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); //执行curl句柄 $result = curl_exec($ch);
在这个例子中,我们使用了 cURL 库提供的许多选项。例如,设置请求头来模拟浏览器发送的 HTTP 请求,设置请求方式为 GET,设置超时时间,等等。
在获取了百度搜索结果的 HTML 页面之后,我们需要解析它来获取我们需要的信息。在这个例子中,我们将使用 PHP 的正则表达式来解析 HTML 页面。
以下是我们使用正则表达式来从 HTML 页面中提取标题、描述和链接:
<?php $result = curl_exec($ch); // 匹配所有搜索结果 preg_match_all( '/<div.*?class="result.*?">.*?<h3.*?>.*?<a.*?href="(.*?)".*?>s*(.*?)s*</a>.*?</h3>.*?<div.*?class="c-abstract.*?">(.*?)</div>.*?</div>/', $result, $matches ); // 提取搜索结果中的标题、描述和链接 $data = []; for ($i=0; $i<count($matches[0]); $i++) { $data[] = [ 'title' => strip_tags($matches[2][$i]), // 去除标题中的 HTML 标签 'description' => strip_tags($matches[3][$i]), // 去除描述中的 HTML 标签 'link' => $matches[1][$i] ]; }; // 关闭curl句柄 curl_close($ch);
在以上代码中,我们使用了 PHP 的正则表达式来匹配所有的搜索结果。然后,我们使用一个循环来遍历所有的搜索结果,从中提取出我们需要的标题、描述和链接。由于我们从 HTML 中获取到的标题和描述中会含有 HTML 标签,我们使用 strip_tags
<?php function spider_baidu($keyword) { $url = "https://www.baidu.com/s?wd=" . urlencode($keyword); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt( $ch, CURLOPT_HTTPHEADER, [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Referer: https://www.baidu.com/', 'Connection: keep-alive', ] ); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); $result = curl_exec($ch); preg_match_all( '/<div.*?class="result.*?">.*?<h3.*?>.*?<a.*?href="(.*?)".*?>s*(.*?)s*</a>.*?</h3>.*?<div.*?class="c-abstract.*?">(.*?)</div>.*?</div>/', $result, $matches ); $data = []; for ($i=0; $i<count($matches[0]); $i++) { $data[] = [ 'title' => strip_tags($matches[2][$i]), 'description' => strip_tags($matches[3][$i]), 'link' => $matches[1][$i] ]; }; curl_close($ch); return $data; }
<div class="result" verschachtelt ist c -container ">
-Tag. Jedes Suchergebnis hat einen Titel und das entsprechende HTML-Format ist <h3 class="t">
, wobei die Linkadresse im <a>
verschachtelt ist Tag innen. Jedes Suchergebnis verfügt über eine Beschreibung im HTML-Format <div class="c-abstract">
. Jedes Suchergebnis hat auch eine URL, die class="c-showurl"
innerhalb des <a>
-Tags enthält. $url
. Erstellen Sie dann ein Handle für cURL und legen Sie viele Optionen fest, z. B. URL festlegen, Anforderungsheader festlegen, Proxy festlegen, Zeitlimit festlegen, Anforderungsmethode auf GET festlegen und schließlich dieses Handle ausführen, um die HTML-Seite abzurufen. 🎜rrreee🎜In diesem Beispiel verwenden wir viele der Optionen, die von der cURL-Bibliothek bereitgestellt werden. Legen Sie beispielsweise den Anforderungsheader fest, um die vom Browser gesendete HTTP-Anforderung zu simulieren, legen Sie die Anforderungsmethode auf GET fest, legen Sie das Zeitlimit fest usw. 🎜🎜HTML-Seite analysieren🎜🎜Nachdem wir die HTML-Seite der Baidu-Suchergebnisse erhalten haben, müssen wir sie analysieren, um die benötigten Informationen zu erhalten. In diesem Beispiel verwenden wir die regulären Ausdrücke von PHP, um eine HTML-Seite zu analysieren. 🎜🎜Hier sind die regulären Ausdrücke, die wir verwenden, um Titel, Beschreibungen und Links aus HTML-Seiten zu extrahieren: 🎜rrreee🎜Im obigen Code verwenden wir die regulären Ausdrücke von PHP, um alle Suchergebnisse abzugleichen. Anschließend gehen wir in einer Schleife alle Suchergebnisse durch und extrahieren die benötigten Titel, Beschreibungen und Links. Da der Titel und die Beschreibung, die wir aus HTML erhalten, HTML-Tags enthalten, verwenden wir die Funktion strip_tags
, um diese zu entfernen. 🎜🎜Ergebnisse zurückgeben🎜🎜Im obigen Code haben wir die benötigten Daten erhalten, jetzt müssen wir nur noch die Ergebnisse in Form eines Arrays zurückgeben. Wir kapseln unser gesamtes Crawler-Programm in eine Funktion und geben die erhaltenen Daten in Form eines Arrays zurück: 🎜rrreee🎜 Wir können ein Schlüsselwort als Parameter empfangen und dann diese Funktion aufrufen, um das Schlüsselwort im Titel und in der Beschreibung der Baidu-Suchergebnisse abzurufen und verlinken. 🎜In diesem Artikel haben wir ein einfaches Crawler-Programm mit PHP geschrieben, um die erforderlichen Daten aus Baidu-Suchergebnissen zu extrahieren. Dieses Programm verwendet die cURL-Bibliothek von PHP, um HTTP-Anfragen zu simulieren, und verwendet Methoden wie reguläre Ausdrücke, um HTML-Seiten zu analysieren. Durch dieses Beispiel können wir ein tiefgreifendes Verständnis dafür erlangen, wie Crawler funktionieren und wie man Crawler mit PHP schreibt. In tatsächlichen Projekten können wir dieses Programm entsprechend unseren Anforderungen ändern, um die benötigten Daten zu erhalten.
Das obige ist der detaillierte Inhalt vonPHP-Crawler-Praxis: Erforderliche Daten aus Baidu-Suchergebnissen extrahieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!