Maison > développement back-end > tutoriel php > Pratique du robot d'exploration PHP : extraire les données requises des résultats de recherche Baidu

Pratique du robot d'exploration PHP : extraire les données requises des résultats de recherche Baidu

PHPz
Libérer: 2023-06-13 10:24:01
original
2110 Les gens l'ont consulté

Avec le développement rapide d'Internet, l'ère de l'explosion de l'information est arrivée. À une époque comme celle-ci, les moteurs de recherche sont devenus notre principal outil pour obtenir des informations, et les quantités massives de données fournies par ces moteurs de recherche dépassent notre imagination. Cependant, pour les chercheurs ou les analystes de données dans certains domaines spécifiques, les informations dont ils ont besoin peuvent ne représenter qu'une petite partie des données contenues dans ces résultats de recherche. Dans ce cas, nous devons utiliser un robot pour obtenir exactement les données souhaitées.

Dans cet article, nous utiliserons PHP pour écrire un programme d'exploration simple afin d'extraire les données dont nous avons besoin à partir des résultats de recherche Baidu. Le cœur de ce programme consiste à utiliser la bibliothèque cURL de PHP pour simuler les requêtes HTTP, puis à utiliser des expressions régulières et d'autres méthodes pour analyser la page HTML.

Ideas

Avant de commencer à écrire le programme d'exploration, nous devons clarifier quelques questions :

  1. Objectif : Nous voulons commencer par Quelles données sont analysées à partir de la page de résultats de recherche Baidu ?
  2. URL : De quelle URL avons-nous besoin pour obtenir les données ?
  3. Format des données : quel est le format des données sur la page de résultats de recherche Baidu ?

Lorsque nous réfléchissons aux données que nous devons obtenir, prenons le mot-clé « PHP crawler » comme exemple. Si nous recherchons ce mot-clé sur Baidu, nous pouvons voir les informations suivantes :

  • Nombre total de résultats de recherche
  • Titre de chaque résultat de recherche#🎜 🎜## 🎜🎜#Description de chaque résultat de recherche
  • URL de chaque résultat de recherche
  • Ensuite, nous pouvons définir notre objectif à partir du titre, de la description et de l'URL de chaque résultat est extrait des résultats de recherche Baidu.

La première étape pour obtenir des données est de clarifier l'URL que nous souhaitons obtenir. Dans notre exemple, l'URL que nous devons obtenir est la suivante : https://www.baidu.com/s?wd=php%20crawler. En tapant « php crawler » dans la barre de recherche Baidu, nous pouvons automatiquement accéder à cette URL.

Ensuite, nous devons comprendre le format des données que nous allons analyser. Dans notre cas, les résultats de la recherche existent sous la forme d'un code HTML similaire au suivant : 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爬虫&amp;rsp=1&amp;f=8&amp;ie=utf-8&amp;tn=95754739_hao_pg"
            target="_blank" class="text-underline">python 爬虫</a>实现。相比于 <a
            href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_nsisbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&amp;wd=&amp;eqid=f774f5d00003a46c000000065f51fc9a"
            target="_blank" class="text-underline">PHP</a>,<a
            href="https://www.baidu.com/link?url=zdiwLoE_LR5bzae8ifgYsYXBfvatKGD0D6Yjli9c8_ns
            isbDmnS-r8l7g-5G2NI79x6yO8NnDdnLqhNuqOZtedHjiOZbhsDNwkFx3pW6yBt&amp;
            wd=&amp;eqid=f774f5d00003a46c000000065f51fc9a" target="_blank"
            class="text-underline">PHP</a> 一般用作...
    </div>
</div>
Copier après la connexion

在以上 HTML 代码片段中,可以看到每个搜索结果都嵌套在 <div class="result c-container "> 标签内。每个搜索结果都有一个标题,对应的 HTML 格式为 <h3 class="t">,其中链接地址嵌套在 <a> 标签内。每个搜索结果都有一个描述,对应的 HTML 格式为 <div class="c-abstract">。每个搜索结果还有一个网址,在 <a> 标签内含有 class="c-showurl"

现在我们已经明确了我们要获取到的数据的格式及我们需要解析的 HTML 数据的格式,我们已经可以开始编写我们的爬虫程序了。

编写代码

我们将我们的 PHP 爬虫代码分成了三个步骤:

  1. 获取百度搜索结果的 HTML 页面
  2. 解析 HTML 页面
  3. 将解析后的数据以数组形式返回

获取百度搜索结果的 HTML 页面

我们可以使用 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);
Copier après la connexion

在这个例子中,我们使用了 cURL 库提供的许多选项。例如,设置请求头来模拟浏览器发送的 HTTP 请求,设置请求方式为 GET,设置超时时间,等等。

解析 HTML 页面

在获取了百度搜索结果的 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);
Copier après la connexion

在以上代码中,我们使用了 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;
}
Copier après la connexion
Dans l'extrait de code HTML ci-dessus, vous pouvez voir que chaque résultat de recherche est imbriqué dans < div class="result c-container "> à l'intérieur de la balise. Chaque résultat de recherche a un titre et le format HTML correspondant est <h3 class="t">, où l'adresse du lien est imbriquée dans le <a> balise À l’intérieur. Chaque résultat de recherche comporte une description au format HTML <div class="c-abstract">. Chaque résultat de recherche comporte également une URL contenant class="c-showurl" dans la balise <a>.

Maintenant que nous avons clarifié le format des données que nous souhaitons obtenir et le format des données HTML que nous devons analyser, nous pouvons commencer à écrire notre programme d'exploration.

Écrire du code

Nous avons divisé notre code de robot PHP en trois étapes : #🎜🎜##🎜🎜##🎜🎜#Obtenir la page HTML des résultats de recherche Baidu #🎜 🎜##🎜🎜#Analyser la page HTML#🎜🎜##🎜🎜#Renvoyer les données analysées sous la forme d'un tableau#🎜🎜##🎜🎜##🎜🎜#Obtenir la page HTML des résultats de recherche Baidu#🎜🎜 ##🎜🎜#Nous pouvons utiliser la bibliothèque cURL de PHP pour envoyer une requête HTTP afin d'obtenir la page HTML des résultats de recherche Baidu. Dans cet exemple, nous stockons l'URL de la page de recherche dans la variable $url. Créez ensuite un handle pour cURL et définissez de nombreuses options, telles que : définir l'URL, définir les en-têtes de requête, définir le proxy, définir le délai d'attente, définir la méthode de requête sur GET, et enfin exécuter ce handle pour obtenir la page HTML. #🎜🎜#rrreee#🎜🎜#Dans cet exemple, nous utilisons de nombreuses options fournies par la bibliothèque cURL. Par exemple, définissez l'en-tête de la requête pour simuler la requête HTTP envoyée par le navigateur, définissez la méthode de requête sur GET, définissez le délai d'attente, etc. #🎜🎜##🎜🎜#Analyser la page HTML #🎜🎜##🎜🎜#Après avoir obtenu la page HTML des résultats de recherche Baidu, nous devons l'analyser pour obtenir les informations dont nous avons besoin. Dans cet exemple, nous utiliserons les expressions régulières de PHP pour analyser une page HTML. #🎜🎜##🎜🎜#Voici l'expression régulière que nous utilisons pour extraire le titre, la description et le lien de la page HTML : #🎜🎜#rrreee#🎜🎜#Dans le code ci-dessus, nous utilisons l'expression régulière de PHP pour faire correspondre tous les résultats de recherche. Nous utilisons ensuite une boucle pour parcourir tous les résultats de recherche et extraire les titres, descriptions et liens dont nous avons besoin. Étant donné que le titre et la description que nous obtenons du HTML contiendront des balises HTML, nous utilisons la fonction strip_tags pour les supprimer. #🎜🎜##🎜🎜#Renvoyer le résultat #🎜🎜##🎜🎜#Dans le code ci-dessus, nous avons obtenu les données dont nous avons besoin, et il ne nous reste plus qu'à renvoyer le résultat sous la forme d'un tableau. Nous encapsulons l'intégralité de notre programme crawler dans une fonction et renvoyons les données obtenues sous forme de tableau : #🎜🎜#rrreee#🎜🎜#Nous pouvons recevoir un mot-clé en paramètre, puis appeler cette fonction pour obtenir la clé Le titre , description et lien du mot dans les résultats de recherche Baidu. #🎜🎜#

Conclusion

Dans cet article, nous avons écrit un programme d'exploration simple utilisant PHP pour extraire les données requises des résultats de recherche Baidu. Ce programme utilise la bibliothèque cURL de PHP pour simuler les requêtes HTTP et utilise des méthodes telles que les expressions régulières pour analyser les pages HTML. Grâce à cet exemple, nous pouvons acquérir une compréhension approfondie du fonctionnement des robots d'exploration et de la manière d'écrire des robots d'exploration en utilisant PHP. Dans les projets réels, nous pouvons modifier ce programme en fonction de nos besoins pour obtenir les données dont nous avons besoin.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal