使用 PHP 进行网络搜刮的完整指南

作者 :

反应 :

评论

PHP 不仅用于创建动态网站。它还可成为 在线收集数据.

借助专业图书馆,您可以轻松地 设置刮板 有效。让我们来看看如何做到这一点。

PHP 可方便地进行网络搜刮,直接从网站上快速检索和分析数据。
PHP简化了网页抓取过程,能够快速从网站直接获取并分析数据。©Christina 供稿 Alucare.fr

使用 PHP 进行刮擦的先决条件

在开始之前,请确保 :

  • ✅ 拥有 使用 PHP 进行基本编程.
  • ✅ 拥有 HTML 和 CSS 知识 来锁定要提取的数据。
  • 了解如何使用 拨号这是一个用于管理PHP依赖项的工具,用于安装诸如Guzzle、Symfony DomCrawler或Goutte等抓取库。
  • ✅ 拥有一个 本地网络服务器 来运行您的代码(XAMPP、WAMP 或 MAMP)。
  • ✅ 拥有一个 代码编辑器 来编写 PHP 脚本。

哪些工具是使用 PHP 进行网络搜索的必备工具?

仅靠 PHP 是不够的。以下是 图书馆 使刮擦快速高效。

1.Guzzle:HTTP 客户端

喷嘴 是最广泛使用的 发送 HTTP 请求. 要安装它,请使用 拨号打开终端,进入项目文件夹,键入命令 :

composer require guzzlehttp/guzzle

Composer 会下载库,并直接在代码中使用。

下面是一个简单的代码示例 获取URL的内容 :

request('GET', $url);

    // 读取 HTTP 代码
    $statusCode = $response->getStatusCode();

    // 读取页面内容
    $content = $response->getBody()->getContents();

    echo "HTTP Code : " .$statusCode .PHP_EOL;
    echo "页面内容:" .PHP_EOL;
    echo $content;

} catch (\Exception $e) {
    echo "Error: " .$e->getMessage();
}

2. Symfony DomCrawler 与 Goutte:数据提取

有两个库被广泛用于浏览和分析 HTML:

  • Symfony DomCrawler 可让你使用 CSS 选择器浏览 HTML 并锁定特定元素。
  • 下降 是对 Guzzle 和 DomCrawler 的封装,大大简化了搜索过程。

使用 Symfony DomCrawler 的示例:

request('GET', 'https://exemple.com');

$html = $response->getBody()->getContents();
$crawler = new Crawler($html);

// 按类选择
$crawler->filter('.my-class')->each(function ($node) {
    echo $node->text() .PHP_EOL;
});

// 按 ID 选择
$crawler->filter('#mon-id')->each(function ($node) {
    echo $node->text() .PHP_EOL;
});

// 按标签选择
$crawler->filter('h1')->each(function ($node) {
    echo $node->text() .PHP_EOL;
});

使用 Goutte 的示例

request('GET', 'https://exemple.com');

// 按类选择
$crawler->filter('.ma-class')->each(function ($node) {
    echo $node->text() .PHP_EOL;
});

// 按 ID 选择
$crawler->filter('#mon-id')->each(function ($node) {
    echo $node->text() .PHP_EOL;
});

// 按标签选择
$crawler->filter('p')->each(function ($node) {
    echo $node->text() .PHP_EOL;
});

3.其他图书馆和工具

要进一步了解,以下是其他选项:

  • 🔥 PHP-Scraper 这是一个PHP库,通过管理HTML和选择器的复杂性,简化了从网页中提取信息的过程。开发者常通过Composer在项目中使用它。
使用 Composer 安装 #
compose require fabpot/goutte
  

request('GET', 'https://example.com');
$title = $crawler->filter('title')->text();

echo "Page title: " .$title;
  
  • 🔥 亮数据 这是一个专业的大规模数据采集平台,内置代理功能。
Bright Data:最全面的网络搜刮工具。
Bright Data:最全面的网页抓取工具。©Christina为Alucare.fr提供
  • 🔥 ScraperAPI 这是一款基于云的网页抓取服务,可通过API访问。您无需使用本地库完成所有工作,只需向ScraperAPI的API发送一个简单请求,并指定要抓取的页面URL即可。

如何用 PHP 创建一个简单的网络搜索器?

下面是用 PHP 创建功能性刮板的教程:

步骤 1:安装依赖项

使用 拨号 安装 下降 感谢


compose require fabpot/goutte

步骤2:获取页面内容

做一个 HTTP GET 请求 和 r浏览HTML内容 使用 Goutte 命令 :

request('GET', $url);

// 如果需要,读取原始 HTML
$html = $crawler->html();
echo substr($html, 0, 500) .'...'; // 预览

步骤 3:提取数据

一旦获取了页面的HTML内容,目标就是提取特定数据。

👉下面是一个 PHP 代码示例,用于 抓取页面标题 博客,使用 CSS 选择器针对 <h2> 在元素中 <文章.

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();
$url = 'https://exemple.com/blog'; // Remplacez par l'URL de votre page cible

// Faire une requête GET pour récupérer la page
$crawler = $client->request('GET', $url);

// Sélectionner les éléments <h2> dans <article> avec le sélecteur CSS
$titres = [];

$crawler->filter('article h2')->each(function ($node) use (&$titres) {
    // Récupérer le texte du titre
    $titres[] = trim($node->text());
});

// Afficher les titres extraits
print_r($titres);
?>

在本例中 :

  • 我们使用 CSS 选择器 项目 h2 标签,在 <h2> 在标签内部 <文章.
  • 每个标题的文本都是使用 text(),并将其添加到表格中 $itles.
  • 然后,标题会显示为 print_r($itles);.

CSS 选择器 (或 XPath)也可用于 摘录 属性 HTML元素。例如,如果每个博客标题都是一个链接,位于 <a>我们可以提取属性 href 来获取文章的 URL。

👉下面是一个使用 Goutte 的示例,用于 提取 链接 文章 :

request('GET', $url);

// 选择标题中的链接
$itles = [];

$crawler->filter('article h2 a')->each(function ($node) use (&$itles) {
    $itle = trim($node->text());
    $link = $node->attr('href'); // 提取属性 href

    // 将标题和 URL 添加到表格中
    $itles[] = [
        title' => $itle、
        url' => $lien、
    ];
});

// 显示结果
print_r($itles);
?>

在本例中 :

  • 我们选择 <a> 在标签内部 <h2> 在元素中 <文章.
  • 我们获取该属性 href 每个链路的 attr('href').
  • 标题及其 URL 已添加到表格中 $itles然后显示 print_r($itles);.

画作 $itles 将包含同时具有 标题关联 的数据。下面是返回数据格式的示例:

数组
(
    [0] => Array
        (
            [title] => 文章 1 标题
            [url] => /article1
        )

    [1] => Array
        (
            [title] => 文章 2 标题
            [url] => /article2
        )
)

在本例中 :

  • 数组的每个元素都是一个关联数组,有两个键: 标题 用于文章标题和 网址 对应的URL。
  • 提取的数据以两级表格的形式呈现,每个条目包含标题和相关链接。

第 4 阶段:构建和存储数据

提取数据后,正确组织数据非常重要。为此,我们将以 PHP 表格然后以结构化格式导出,例如 JSON 在哪里 CSV.

request('GET', $url);

// 在结构化表格中提取标题和 URL
$data = [];
$crawler->filter('article h2 a')->each(function ($node) use (&$data) {
    $data[] = [
        title' => trim($node->text()), // 提取标题
        url' => $node->attr('href'), // 提取 href 属性(URL)
    ];
});

// 显示提取的数据
print_r($data);
?>

整理好数据后,您可以将其导出为以下格式 JSON这对应用程序接口或网络应用非常有用:

<?php
// Exporter les données en JSON
file_put_contents('export.json', json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));

echo "Les données ont été exportées en JSON dans 'export.json'.";
?>

文件 export.json 将以可读格式创建,可能如下所示:

[
    {
        "title":"第 1 条标题"、
        "url":"/article1"
    },
    {
        "title": "Article 2 title"、
        "url": "/article2" }.
    }
]

如果想将数据导出为 CSV 表格,可以使用 fputcsv 将数据写入 CSV 文件:

<?php
// Exporter les données en CSV
$fp = fopen('export.csv', 'w');

// Ajouter l'en-tête (titres des colonnes)
fputcsv($fp, ['title', 'url']);

// Ajouter chaque ligne de données
foreach ($data as $row) {
    fputcsv($fp, [$row['title'], $row['url']]);
}

// Fermer le fichier
fclose($fp);

echo "Les données ont été exportées en CSV dans 'export.csv'.";
?>

文件 export.csv 会是这样

标题,url
文章标题 1,/article1
文章标题 2,/article2

如何处理 PHP 中常见的网络搜索问题?

在一次操作中 用 PHP 进行网络搜刮不过,也有可能遇到问题。以下是最常见问题的解决方案。

1.管理错误

  • 连接错误

有时,请求甚至无法到达服务器。您可能会遇到 “无网络”, “无效URL”, “服务器不可用”等等。在这种情况下,一个 try/catch 以避免脚本突然停止运行。

下面是一个使用 Guzzle 的示例:

request('GET', 'https://example.com/api/data');
        
        // 检查请求是否成功
        if ($response->getStatusCode() === 200) { // 如果请求成功,则处理响应。
            // 如果成功,则处理响应
            $body = $response->getBody();
            echo "Data received : " .$body;
        }
        
    } catch (RequestException $e) {
        // 捕捉连接和请求错误
        if ($e->hasResponse()) { // 显示错误代码(如果有)。
            // 显示错误代码(如果有的话
            echo "Request error: " .$e->getResponse()->getStatusCode();
        } else {
            // 如果连接失败(例如服务器无法访问)
            echo "Connection error: " .$e->getMessage();
        }
    }
}

// 调用函数
make_request_with_guzzle();
?>
  • HTTP 状态代码

即使连接成功,服务器也可能响应错误 (404 = 找不到页面, 500 = 互联网错误等)。您可以使用 getStatusCode().

request('GET', 'https://example.com/api/data');
        
        // 检查响应的状态代码
        $status_code = $response->getStatusCode();
        
        // 检查请求是否成功
        if ($status_code === 200) { // 如果请求成功,则处理响应。
            // 如果成功,则处理响应
            $body = $response->getBody();
            echo "Response successful with code: " .$status_code ."
";
            echo "收到数据: " .$body;
        } elseif ($status_code === 404) {
            echo "Error 404 : Page not found
";
        } elseif ($status_code === 500) {
            echo "Error 500 : Internal server error
";
        } else {
            echo "Status code: " .$status_code ."
";
        }
        
    } catch (RequestException $e) { // 捕捉连接和请求错误。
        // 捕捉连接和请求错误
        if ($e->hasResponse()) { // 显示 HTTP 错误代码(如果有的话)。
            // 显示 HTTP 错误代码(如果有的话
            echo "HTTP error: " .$e->getResponse()->getStatusCode() ."
";
        } else {
            // 在连接失败的情况下(例如,服务器无法访问)
            echo "Connection error: " .$e->getMessage();
        }
    }
}

// 调用函数
make_request_with_guzzle();
?>
  • 解析错误 

解析是指您的爬虫对HTML进行分析的过程。如果页面格式错误,DomCrawler或Goutte可能会崩溃或无法返回任何结果。

要处理此类错误,必须在尝试提取内容之前始终验证内容是否存在。使用条件语句。 (count(), filter()...) 确保目标元素确实存在。然后,将解析包裹在 try/catch 以防止脚本崩溃。

request('GET', 'https://example.com');

        // 在尝试提取目标元素之前,检查该元素是否存在
        $elements = $crawler->filter('div.target-element');
        
        如果($elements->count() > 0){
            // 元素存在,我们可以提取它
            $content = $elements->first()->text();
            echo "提取的内容: " .$content;
        } else {
            // 未找到元素
            echo "页面上未找到目标元素;
        }
        
    } catch (Exception $e) { // Catch parsing errors.
        // 捕捉解析错误
        echo "Error while parsing the page: " .$e->getMessage();
    }
}

// 调用函数
scrape_website() 函数;
?>

2.绕过限制

有些网站会使用保护措施来增加搜索难度。

  • 通过 IP 进行阻断 您可以使用代理,如 Bright Data 平台上的代理。
  • JavaScript 默认情况下,PHP 无法 运行 JavaScript为此,需要使用无头浏览器(headless browser)。
  • Robots.txt 报废前,请务必检查此文件,以便您可以合法、负责任地行事。

常见问题

网络搜索合法吗?

📌了 网络搜索的合法性 是一个复杂的问题。在法国和其他地方一样,一切都取决于法律框架、收集的数据以及使用数据的方式。

网络搜刮和网络爬行有什么区别?

  • 网络搜刮 是指从某个网站提取精确数据的行为。
  • 网络抓取 是浏览网页以编制索引的行为。
网络爬行包括自动探索和发现多个网站,而网络刮擦则侧重于使用专用软件从特定目标中提取精确数据。
网络爬行是指自动探索和发现多个网站,而网络抓取则侧重于使用专用软件从特定目标中提取精确数据。©Christina 供稿 Alucare.fr

如何抓取需要验证(登录)的网站?

要抓取需要验证的网站,您需要 模拟连接.对于 PHP,最常见的解决方案是 喷嘴.

您可以通过 POST 请求发送标识符,然后保持会话打开以检索受保护的页面。

如何管理对使用 AJAX 加载动态页面的网站的搜索?

⚠ 需要提醒的是,PHP 不能执行客户端 JavaScript 代码。

要使用 PHP 抓取此类页面,您可以 使用 浏览器拍摄是一个在后台使用真实浏览器(无头 Chrome/Chromium)加载页面并执行 JavaScript 的库。

另一个解决方案是 将 PHP 与基于 Node.js 的工具集成如 Puppeteer 生成渲染的 HTML,然后从 PHP 获取数据。

对于所有类型的动态页面网络搜刮,您还可以使用专门的工具,称为 无头浏览器.

有什么方法可以替代 PHP 进行网络搜索吗?

是的,有几种语言很流行:

  • Python 及其功能强大的库,如 BeautifulSoup 和 Scrapy。
  • Node.js 这对使用 Puppeteer 或 Cheerio 等库搜索动态网站非常有效。
使用 Python 进行网络搜刮时,需要使用 BeautifulSoup 或 Scrapy 等库来浏览网页并自动提取所需数据。
使用 Python 进行网络搜刮时,需要使用 BeautifulSoup 或 Scrapy 等库浏览网页并自动提取所需数据。Cristina for Alucare.fr

如何以道德和负责任的方式编程一个“抓取器”?

要想符合道德标准,您需要 :

  1. ✔ 检查 robots.txt 文件 以了解规则。
  2. 限制请求的频率 以免网站服务器超载。
  3. 尊重条件 网站使用条款。
  4. 不收集个人数据 未经授权。

总之 网络搜刮 是一种强有力的做法,但必须有条不紊、负责任地使用。

还有你,你有没有创建过一个 PHP 中的刮板 或其他语言?请在评论区分享您的经验。

喜欢吗?分享它!

这些内容最初是 法语 (请参见下面的编辑器)。为了向尽可能多的国家提供帮助,我们使用 Deepl 和/或谷歌翻译 API 对该网站进行了多种语言的翻译和校对。我们每月的翻译费用高达数千欧元。如果它不是 100 % 完美,请给我们留言,以便我们进行修正。如果您对校对和提高翻译文章的质量感兴趣,请使用联系表格向我们发送电子邮件!
我们感谢您的反馈意见,以改进我们的内容。如果您想提出改进建议,请使用我们的联系表或在下面留言。 您的意见有助于我们提高网站质量 Alucare.fr


Alucare 是一家独立媒体。请将我们添加到您的谷歌新闻收藏夹,以支持我们:

在讨论区发表评论