10款不错的PHP网页爬虫库

10款不错的PHP网页爬虫库

使用 PHP 网络抓取库构建抓取器可帮助您节省时间并提高成功率。无论您是提取数据用于监控股票价格、为营销团队提供数据,还是分析电子商务趋势,它们都将是有价值的。

我们测试了许多关于 JavaScript 渲染、代理支持和其他技术因素的 PHP 库,然后得出了最令人惊奇的一个。我们将讨论它们并通过每个快速编码示例来了解它们是如何工作的。

哪些库用于 PHP 中的网页抓取?

网上有很多 PHP 包,但只有少数几个可靠、实用且易于使用。以下是我们发现的十个最有效的 PHP 网络抓取库,它们将有助于抓取不同类型的网站,如 Amazon、TikTok、Google 等。

PHP Library HTML解析 JavaScript呈现 代理支持 反机器人 文档
ZenRows
Simple HTML DOM
cURL
Goutte
Guzzle
Panther
DiDOM
PHP-Webdriver
HTTPful
hQuery

1.ZenRows

ZenRows是一个一体化的 PHP 抓取库,可帮助您避免在抓取. 它包括旋转代理、无头浏览器、JavaScript 渲染和其他任何认真从网页获取数据的人的基本功能。您可以获得免费的 API 密钥。

👍优点:

  • 一个易于使用的 PHP 数据抓取库。
  • 低费用的快速智能代理服务,避免机器人检测。
  • 地理定位配置允许您绕过基于位置的限制。
  • 反机器人和验证码旁路。
  • 它支持并发以及 HTTP 和 HTTPS 协议。
  • 为谷歌和亚马逊等流行网站准备的抓取工具。
  • 它支持 JavaScript 呈现的网页。

👎缺点:

  • 它不提供代理浏览器扩展。
  • 您将需要另一个用于 HTML 解析的库。

如何使用 ZenRows 抓取网页

第 1 步:登录 ZenRows 并生成 PHP 代码

要使用 ZenRows 抓取网页,请创建一个免费帐户并登录到 ZenRows 仪表板。

zenrows_dashboard

粘贴要抓取的 URL,选择Plain HTML,然后在右侧选择PHP作为我们的语言。这是我们将使用的代码。

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://api.zenrows.com/v1/?apikey=YOUR_API_KEY&url=https%3A%2F%2Ffreecodecamp.org%2Fnews"); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$response = curl_exec($ch); 
curl_close($ch);

第 2 步:解析 HTML

由于我们需要解析 HTML,因此让我们使用流行且简单的 Simple HTML DOM 作为补充工具。

要安装 Simple HTML DOM,请从SourceForge下载它并将simple_html_dom.php文件解压缩到您的编码环境。

为此,将生成的 PHP 代码从 ZenRows 复制到您的编码环境,并使用该include()方法添加 Simple HTML DOM。这将介绍用于对文章标题、作者和标签进行分组的 HTML 解析。

// Make use of the plain HTML obtained via ZenRows 
// together with Simple HTML DOM library to allow for proper data grouping 
 
// Include the Simple HTML DOM library to have access to all the functions 
include("simple_html_dom.php"); 
 
$html = str_get_html($response);

下一步是使用该find()方法查找元素,然后使用以下方法将提取的数据映射到数组array_map()

// Find elements by descendants and class names 
$titles = $html->find("h2.post-card-title"); 
$tags = $html->find("span.post-card-tags"); 
$authors = $html->find("a.meta-item"); 
 
// Iterate over the arrays contain the elements 
// and make use of the plaintext property to access only the text values 
$data = array_map(function ($a1, $a2, $a3) { 
    $new = array( 
        "title" => trim($a1->plaintext), 
        "tag" => trim($a2->plaintext), 
        "author" => trim($a3->plaintext) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

继续并运行代码以抓取目标 URL。您的输出应如下所示:

zenrows_output

恭喜,您已成功使用 ZenRows 抓取网页。万一你错过了一步,这里是完整的 PHP 脚本:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://api.zenrows.com/v1/?apikey=YOUR_API_KEY&url=https%3A%2F%2Ffreecodecamp.org%2Fnews"); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$response = curl_exec($ch); 
curl_close($ch); 
 
// Make use of the plain HTML obtained via ZenRows 
// together with Simple HTML DOM library to allow for proper data grouping 
 
// Include the Simple HTML DOM library to have access to all the functions 
include("simple_html_dom.php"); 
 
$html = str_get_html($response); 
 
// Find elements by descendants and class names 
$titles = $html->find("h2.post-card-title"); 
$tags = $html->find("span.post-card-tags"); 
$authors = $html->find("a.meta-item"); 
 
// Iterate over the arrays contain the elements 
// and make use of the plaintext property to access only the text values 
$data = array_map(function ($a1, $a2, $a3) { 
    $new = array( 
        "title" => trim($a1->plaintext), 
        "tag" => trim($a2->plaintext), 
        "author" => trim($a3->plaintext) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

2. Simple HTML DOM

Simple HTML DOM库是一个流行的 PHP DOM 库,它提供了一种使用 CSS 选择器访问和操作 HTML 元素的简单方法。它易于使用,可以从简单的网站上抓取数据。

👍优点:

  • 易于从 HTML 中解析和提取数据,因为它只需要基本知识。
  • 使用熟悉的 PHP 语法的简单直观的 API。
  • 轻巧高效。

👎缺点:

  • 不如其他 PHP 网络抓取库强大或灵活。
  • 它可能不支持较新的 HTML 功能和标准。
  • 不适合解析复杂或格式繁多的 HTML 页面。

如何使用简单的 HTML DOM 库进行抓取

无需思考:使用 Simple HTML DOM 的第一步是安装它。为此,从SourceForge下载 PHP 爬虫库并将simple_html_dom.php文件解压缩到您的编码环境。

使用该file_get_html()方法获取页面内容,解析它并返回一个 DOM 对象。该对象提供访问和操作内容的方法。

// Include the Simple HTML DOM library to have access to all the functions 
include("simple_html_dom.php"); 
 
// Create DOM object using the file_get_html method 
$html = file_get_html("https://www.freecodecamp.org/news");

下一步是使用该find()方法在 HTML 文档中定位元素,就像我们所做的那样:

// Find elements by descendants and class names 
$titles = $html->find("h2.post-card-title"); 
$tags = $html->find("span.post-card-tags"); 
$authors = $html->find("a.meta-item");

find()方法用于搜索三组不同的元素:

  • 标题h2元素同级post-card-title
  • 标记span带有类的元素post-card-tags
  • 作者:锚元素同类meta-item

匹配的元素存储在变量$titles,$tags和 中$authors

要抓取上面的内容,请使用该array_map()函数将回调函数应用于每个元素,以返回包含转换后元素的新数组。

$data = array_map(function ($a1, $a2, $a3) { 
    $new = array( 
        "title" => trim($a1->plaintext), 
        "tag" => trim($a2->plaintext), 
        "author" => trim($a3->plaintext) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

您已经使用 Simple HTML DOM PHP 网络爬虫库成功抓取了一个网页。完整代码如下所示:

// Include the Simple HTML DOM library to have access to all the functions 
include("simple_html_dom.php"); 
 
// Create DOM object using the file_get_html method 
$html = file_get_html("https://www.freecodecamp.org/news"); 
 
// Find elements by descendants and class names 
$titles = $html->find("h2.post-card-title"); 
$tags = $html->find("span.post-card-tags"); 
$authors = $html->find("a.meta-item"); 
 
// Iterate over the arrays contain the elements 
// and make use of the plaintext property to access only the text values 
$data = array_map(function ($a1, $a2, $a3) { 
    $new = array( 
        "title" => trim($a1->plaintext), 
        "tag" => trim($a2->plaintext), 
        "author" => trim($a3->plaintext) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

3.cURL

cURL是一个 PHP 爬虫库,支持各种协议,包括 HTTP、HTTPS 和 FTP。它旨在发出 HTTP 请求,但它可以用作网络抓取库

👍优点:

  • 对 HTTP 请求的高度控制和灵活性。
  • 它支持广泛的功能,如代理、SSL/TLS、身份验证和 cookie。

👎缺点:

  • 它具有低级接口,使用起来可能具有挑战性。
  • 它不提供许多内置的便利功能,如自动重试和错误处理。
  • 没有基于属性、类或标识符查找元素的方法。
  • 它无法解析 HTML。

如何使用 cURL 抓取页面

首先,您需要初始化一个 cURL 会话并为其设置一些选项,然后将 HTTP 请求发送到指定的 URL。服务器的响应随后存储在一个变量中,之后您可以关闭 cURL 会话。这是它的样子:

// Initialize curl 
$ch = curl_init(); 
 
// URL for Scraping 
curl_setopt( 
    $ch, 
    CURLOPT_URL, 
    "https://www.freecodecamp.org/news" 
); 
 
// Return Transfer True 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
 
$output = curl_exec($ch); 
 
// Closing cURL 
curl_close($ch);

由于 cURL 不支持 HTML 解析,因此您需要使用一个库来实现该功能。让我们再次使用 Simple HTML DOM。您可以使用此 PHP 脚本解析从 cURL 会话获得的 HTML 响应:

// include the SIMPLE HTML DOM library to introduce 
// HTML parsing support 
include("simple_html_dom.php"); 
 
$html = str_get_html($output); 
 
// Find elements by descendants and class names 
$titles = $html->find("h2.post-card-title"); 
$tags = $html->find("span.post-card-tags"); 
$authors = $html->find("a.meta-item"); 
 
// Iterate over the arrays contain the elements 
// and make use of the plaintext property to access only the text values 
$data = array_map(function ($a1, $a2, $a3) { 
    $new = array( 
        "title" => trim($a1->plaintext), 
        "tag" => trim($a2->plaintext), 
        "author" => trim($a3->plaintext) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

那里有使用 cURL PHP 爬虫库的 freeCodeCamp 的新闻数据。完整代码如下所示:

// Initialize curl 
$ch = curl_init(); 
 
// URL for Scraping 
curl_setopt( 
    $ch, 
    CURLOPT_URL, 
    "https://www.freecodecamp.org/news" 
); 
 
// Return Transfer True 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
 
$output = curl_exec($ch); 
 
// Closing cURL 
curl_close($ch); 
 
// include the SIMPLE HTML DOM library to introduce 
// HTML parsing support 
include("simple_html_dom.php"); 
 
$html = str_get_html($output); 
 
// Find elements by descendants and class names 
$titles = $html->find("h2.post-card-title"); 
$tags = $html->find("span.post-card-tags"); 
$authors = $html->find("a.meta-item"); 
 
// Iterate over the arrays contain the elements 
// and make use of the plaintext property to access only the text values 
$data = array_map(function ($a1, $a2, $a3) { 
    $new = array( 
        "title" => trim($a1->plaintext), 
        "tag" => trim($a2->plaintext), 
        "author" => trim($a3->plaintext) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

4.Goutte

Goutte是一个 PHP 网络抓取程序库和HTTP 客户端,可以轻松抓取支持各种协议(包括 HTTP、HTTPS 和 FTP)的网站,以及从 HTML 和 XML 响应中提取数据。Goutte 使用DomCrawler 组件快速有效地从网页中爬取数据。

👍优点:

  • 便于使用。
  • 它提供了一个方便的 DOM 风格的接口,用于从 HTML 文档中提取数据。

👎缺点:

  • 不如其他 PHP 抓取库灵活。
  • 它可能不适合更高级的网络抓取场景,比如处理大量使用 JavaScript 的网站或大量数据。
  • 它专为网页抓取和 HTML 解析而设计,因此可能不适合其他类型的 HTTP 任务或用例。
  • 文档组织不当。

如何用Goutte

首先安装 Goutte PHP scraper 库:

composer require fabpot/goutte

现在,GET向 freeCodeCamp 的新闻首页发出请求,并将响应存储在一个crawler对象中。

require "vendor/autoload.php"; 
 
// reference the Goutte library 
use GoutteClient; 
 
// Create a Goutte Client instance 
$client = new Client(); 
 
// Make requests to obtain the freecodecamp news page 
$crawler = $client->request("GET", "https://www.freecodecamp.org/news");

下一步是从网页的 HTML 中抓取数据,这可以通过使用 方法filter()在页面上查找与特定选择器匹配的元素来完成。

// Use the filter method to obtain the <h2> element 
// which corresponds to the article titles 
$titles = $crawler->filter("h2")->each(function ($node) { 
    return $node->text(); 
}); 
 
// Filter <span> elements with the class corresponding to article tags 
$tags = $crawler->filter("span.post-card-tags")->each(function ($node) { 
    return $node->text(); 
}); 
 
// Filter link elements corresponding to authors 
$authors = $crawler->filter("a.meta-item")->each(function ($node) { 
    return $node->text(); 
});

继续将抓取的数据存储在一个数组中,以便使用与上一节中类似的方法轻松遍历。

这就是如何使用 Goutte PHP 网页抓取框架来抓取网页。这是完整的 PHP 代码:

require "vendor/autoload.php"; 
 
// reference the Goutte library 
use GoutteClient; 
 
// Create a Goutte Client instance 
$client = new Client(); 
 
// Make requests to obtain the freecodecamp news page 
$crawler = $client->request("GET", "https://www.freecodecamp.org/news"); 
 
// Use the filter method to obtain the <h2> element 
// which corresponds to the article titles 
$titles = $crawler->filter("h2")->each(function ($node) { 
    return $node->text(); 
}); 
 
// Filter <span> elements with the class corresponding to article tags 
$tags = $crawler->filter("span.post-card-tags")->each(function ($node) { 
    return $node->text(); 
}); 
 
// Filter link elements corresponding to authors 
$authors = $crawler->filter("a.meta-item")->each(function ($node) { 
    return $node->text(); 
});

5.Guzzle

Guzzle是一个 PHP 网络抓取库,它使连接在线服务和提交 HTTP 查询变得简单。它使用 PHP 流包装器发送 HTTP 请求。

Guzzle 是一个框架,其中包含创建强大的 Web 服务客户端所需的工具,例如用于定义 API 输入和输出的服务描述、用于验证 API 调用是否正确形成的参数验证以及用于处理 API 错误的错误处理。

👍优点:

  • 用于发送 HTTP 请求和处理响应的简单易用的界面。
  • 它支持并行请求、缓存、中间件和错误处理。
  • 它可以通过使用插件和事件订阅者来扩展和定制。

👎缺点:

  • 它有一个陡峭的学习曲线。
  • 它有大量的依赖项,会增加项目的复杂性。

如何使用 Guzzle 抓取网页

首先,通过 composer 安装 Guzzle:

composer require guzzlehttp/guzzle

安装 Guzzle 后,使用 Symfony DomCrawler 和 Guzzle 库从目标网页中提取数据。然后,GET向freeCodeCamp 的新闻URL 发出请求,并将网页的HTML 绑定到该$html变量。然后可以将该变量与该类一起使用Crawler以从 HTML 中提取数据。好的,让我们简单点,这是它的样子:

require "vendor/autoload.php"; 
 
use SymfonyComponentDomCrawlerCrawler; 
use GuzzleHttpClient; 
 
$url = "https://www.freecodecamp.org/news/"; 
 
// Create the Client instance 
$client = new Client(); 
 
// Create a request to the FreeCodeCamp URL 
$response = $client->request("GET", $url); 
 
// Bind the Body DOM elements to the html variable using the Guzzle method 
$html = $response->getBody();

接下来,使用 Symfony DomCrawler 实例Crawler()从网页的 HTML 中提取数据。使用该filter()方法在页面上找到匹配特定选择器的元素,然后使用匿名函数提取每个匹配元素的文本内容。

// Create a Crawler instance using the html binding 
$crawler = new Crawler($html->getContents()); 
 
// Filter the Crawler object based on the h2 element and return only the inner text 
$titles = $crawler->filter("h2")->each(function (Crawler $node, $i) { 
    return $node->text(); 
}); 
 
// Filter the Crawler object based on the span element 
// and the corresponding class and return only the inner text 
$tags = $crawler->filter("span.post-card-tags")->each(function (Crawler $node, $i) { 
    return $node->text(); 
}); 
 
// Filter the Crawler object based on the anchor element 
// and the corresponding class and return only the inner text 
$authors = $crawler->filter("a.meta-item")->each(function (Crawler $node, $i) { 
    return $node->text(); 
});

与之前看到的其他库类似,使用该array_map()函数将数组数据呈现和分组在一起。有了这个,恭喜!您刚刚使用了 Guzzle PHP 网络抓取库来抓取目标 URL。如果你迷路了,下面是完整脚本的样子:

require "vendor/autoload.php"; 
 
use SymfonyComponentDomCrawlerCrawler; 
use GuzzleHttpClient; 
 
$url = "https://www.freecodecamp.org/news/"; 
 
// Create the Client instance 
$client = new Client(); 
 
// Create a request to the FreeCodeCamp URL 
$response = $client->request("GET", $url); 
 
// Bind the Body DOM elements to the html variable using the Guzzle method 
$html = $response->getBody(); 
 
// Create a Crawler instance using the html binding 
$crawler = new Crawler($html->getContents()); 
 
// Filter the Crawler object based on the h2 element and return only the inner text 
$titles = $crawler->filter("h2")->each(function (Crawler $node, $i) { 
    return $node->text(); 
}); 
 
// Filter the Crawler object based on the span element 
// and the corresponding class and return only the inner text 
$tags = $crawler->filter("span.post-card-tags")->each(function (Crawler $node, $i) { 
    return $node->text(); 
}); 
 
// Filter the Crawler object based on the anchor element 
// and the corresponding class and return only the inner text 
$authors = $crawler->filter("a.meta-item")->each(function (Crawler $node, $i) { 
    return $node->text(); 
});

6.Panther

Panther是一个无头 PHP 包,它提供了一个易于使用的界面,用于访问和操作来自各种来源的数据。它使用您 PC 上的现有浏览器作为无头浏览器,无需安装新软件。

由于 Panther PHP 网络抓取库与 headless 配合得很好,它可以抓取动态和非动态站点。

👍优点:

  • 您可以跨多个网络浏览器自动化网络抓取过程和潜在客户生成。
  • 它提供了一组丰富的与网页交互的功能,例如填写表单、单击按钮和提取元素。
  • 它有详细的文档记录和积极维护,拥有庞大且支持的社区。

👎缺点:

  • 它可能无法绕过某些类型的反抓取措施,例如验证码或 IP 阻止。

如何在Panther的帮助下爬坡

首先使用以下 composer 命令安装 Panther PHP 网络抓取库、ChromeDrivers 和 gecko 驱动程序:

composer require symfony/panther 
composer require --dev dbrekelmans/bdi

安装后,使用 Symfony Panther 库模拟 Web 浏览器并GET使用该方法向目标 URL 发出请求get(),并使用该takeScreenshot()方法截取页面截图:

use SymfonyComponentPantherClient; 
 
require __DIR__ . "/vendor/autoload.php"; // Composer's autoloader 
 
// Use the chrome browser driver 
$client = Client::createChromeClient(); 
 
// get response 
$response = $client->get("https://www.freecodecamp.org/news/"); 
 
// take screenshot and store in current directory 
$response->takeScreenshot($saveAs = "zenrows-freecodecamp.jpg");

继续使用 Panther 从目标 URL 中提取特定信息,如标签、作者姓名和文章标题:

// let's bind article tags 
$tags = $response->getCrawler()->filter("span.post-card-tags")->each(function ($node) { 
    return trim($node->text()) . PHP_EOL; 
}); 
 
// let's bind author names 
$authors = $response->getCrawler()->filter("a.meta-item")->each(function ($node) { 
    return trim($node->text()) . PHP_EOL; 
}); 
 
// let's bind article titles 
$titles = $response->getCrawler()->filter("h2")->each(function ($node) { 
    return trim($node->text()) . PHP_EOL; 
});

之后,您可以使用与上述部分中使用的映射函数类似的映射函数。这样,您终于使用 Panther 抓取了一个网页!

这是完整的代码:

use SymfonyComponentPantherClient; 
 
require __DIR__ . "/vendor/autoload.php"; // Composer's autoloader 
 
// Use the chrome browser driver 
$client = Client::createChromeClient(); 
 
// get response 
$response = $client->get("https://www.freecodecamp.org/news/"); 
 
// take screenshot and store in current directory 
$response->takeScreenshot($saveAs = "zenrow-freecodecamp.jpg"); 
 
// let's bind article tags 
$tags = $response->getCrawler()->filter("span.post-card-tags")->each(function ($node) { 
    return trim($node->text()) . PHP_EOL; 
}); 
 
// let's bind author names 
$authors = $response->getCrawler()->filter("a.meta-item")->each(function ($node) { 
    return trim($node->text()) . PHP_EOL; 
}); 
 
// let's bind article titles 
$titles = $response->getCrawler()->filter("h2")->each(function ($node) { 
    return trim($node->text()) . PHP_EOL; 
}); 
 
// Use the array_map to bind the arrays together into one array 
$data = array_map(function ($title, $tag, $author) { 
    $new = array( 
        "title" => trim($title), 
        "tag" => trim($tag), 
        "author" => trim($author) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

7. DiDOM

DiDOM包是用于 PHP简单轻量级 HTML 解析器和文档生成器。它为创建和操作 HTML 文档和元素提供了流畅的界面。

DiDOM 的一些功能包括对 XPath 表达式的支持、干净且易于使用的 API、对自定义回调的支持以及用于微调抓取过程的各种选项。它是开源的,并在 MIT 许可下发布。

👍优点:

  • 易于使用的 PHP 网页抓取库。
  • 简单直观的 API。
  • 它允许您从 HTML 页面解析和提取数据。
  • 轻巧高效。

👎缺点:

  • 不如其他 PHP 爬虫库灵活。
  • 不适合解析复杂或格式繁多的 HTML 页面。

如何使用 DiDOM 进行抓取

在您的环境中使用 composer 命令安装 DiDOM PHP 网络抓取库。

composer require imangazaliev/didom

下一步是Document根据目标 URL 创建一个实例,然后使用 DiDom 的内置find()方法在页面中搜索相关的 HTML 元素。

// Composer's autoloader 
require __DIR__ . "/vendor/autoload.php"; 
 
use DiDomDocument; 
 
// Create a Document instance based on the FreeCodeCamp News Page 
$document = new Document("https://www.freecodecamp.org/news/", true); 
 
// Search for the article title using the <h2> element 
// and its corresponding class 
$titles = $document->find("h2.post-card-title"); 
 
// Search for the article tags using the <span> element 
// and its corresponding class 
$tags = $document->find("span.post-card-tags"); 
 
// Search for the author using the <a> element 
// and its corresponding class 
$authors = $document->find("a.meta-item");

使用array_map()函数来组织提取的数据。这将创建一个新数组,其中包含每个输入数组的值,该数组存储在$data变量中并打印出来。

// Use the array_map to bind the arrays together into one array 
$data = array_map(function ($title, $tag, $author) { 
    $new = array( 
        "title" => trim($title->text()), 
        "tag" => trim($tag->text()), 
        "author" => trim($author->text()) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

这就是如何使用 DiDOM 库来抓取网页。最终代码如下所示:

// Composer's autoloader 
require __DIR__ . "/vendor/autoload.php"; 
 
use DiDomDocument; 
 
// Create a Document instance based on the FreeCodeCamp News Page 
$document = new Document("https://www.freecodecamp.org/news/", true); 
 
// Search for the article title using the <h2> element 
// and its corresponding class 
$titles = $document->find("h2.post-card-title"); 
 
// Search for the article tags using the <span> element 
// and its corresponding class 
$tags = $document->find("span.post-card-tags"); 
 
// Search for the author using the <a> element 
// and its corresponding class 
$authors = $document->find("a.meta-item"); 
 
// Use the array_map to bind the arrays together into one array 
$data = array_map(function ($title, $tag, $author) { 
    $new = array( 
        "title" => trim($title->text()), 
        "tag" => trim($tag->text()), 
        "author" => trim($author->text()) 
    ); 
    return $new; 
}, $titles, $tags, $authors); 
 
print_r($data);

8. PHP-webdriver

Php-webdriver是一个 PHP 的抓取包,它为 WebDriver 协议提供了一个客户端,它允许你从你的 PHP 脚本控制一个网络浏览器。该框架旨在与 Selenium 一起使用,Selenium 是一种用于自动化 Web 浏览器的工具。

使用 php-webdriver,您可以编写脚本来自动执行诸如填写表单、单击按钮和导航到网站上的不同页面等任务。

👍优点:

  • 易于设置和使用,因为它需要最少的配置才能开始。
  • 它与其他 Symfony 组件和库很好地集成。
  • 提供用于运行动态站点的无头浏览器。

👎缺点:

  • 它需要一些设置和配置,包括安装包及其依赖项、实施 Selenium 和运行 Web 驱动程序。
  • 当它在后台运行网络浏览器时,它可能会占用大量资源。
  • 它可能不适合某些类型的网络抓取,例如使用复杂的 JavaScript 或验证码来防止机器人的网站。

如何使用 php-Webdriver 抓取网页

要使用 php-webdriver,您需要安装该库及其依赖项以将其导入您的 PHP 脚本。您还需要在您的机器上运行 Selenium 或访问 Selenium 服务器。

首先使用以下 composer 命令安装 php-webdriver 库:

composer require php-webdriver/webdriver

从 php-webdriver 包中导入必要的类。DesiredCapabilities()然后,使用我们要使用的 Web 浏览器的方法设置所需的功能。在本例中,我们使用的是 Chrome。如果您无法访问 Selenium ( ) ,您可能需要下载 ChromeDriver并运行它chromedriver --port=4444

require_once("vendor/autoload.php"); 
 
// Import the WebDriver classes 
use FacebookWebDriverRemoteDesiredCapabilities; 
use FacebookWebDriverRemoteRemoteWebDriver; 
use FacebookWebDriverWebDriverBy; 
 
// Set up the desired capabilities 
$caps = DesiredCapabilities::chrome(); 
$caps->setCapability("acceptInsecureCerts", true)

接下来,使用该方法创建一个新的 Web 驱动程序create()并导航到要使用该get()方法抓取的 URL。

// Create a new web driver 
$driver = RemoteWebDriver::create("http://localhost:4444/", $caps); 
 
// Navigate to the URL you want to scrape 
$driver->get("https://www.freecodecamp.org/news/");

使用 CSS 选择器通过方法在页面上定位三组元素:标签、作者和标题findElements()。这些元素分别存储在名为$tags$authors和 的变量中$titles。然后可以使用映射函数将结果映射在一起。

// Extract the elements you want to scrape 
$tags = $driver->findElements(WebDriverBy::cssSelector("span.post-card-tags")); 
$authors = $driver->findElements(WebDriverBy::cssSelector("a.meta-item")); 
$titles = $driver->findElements(WebDriverBy::cssSelector("h2.post-card-title"));

您已经使用 php-webdriver 包成功抓取了一个网页。

这是完整的代码:

require_once("vendor/autoload.php"); 
 
// Import the WebDriver classes 
use FacebookWebDriverRemoteDesiredCapabilities; 
use FacebookWebDriverRemoteRemoteWebDriver; 
use FacebookWebDriverWebDriverBy; 
 
// Set up the desired capabilities 
$caps = DesiredCapabilities::chrome(); 
$caps->setCapability("acceptInsecureCerts", true); 
 
// Create a new web driver 
$driver = RemoteWebDriver::create("http://localhost:4444/", $caps); 
 
// Navigate to the URL you want to scrape 
$driver->get("https://www.freecodecamp.org/news/"); 
 
// Extract the elements you want to scrape 
$tags = $driver->findElements(WebDriverBy::cssSelector("span.post-card-tags")); 
$authors = $driver->findElements(WebDriverBy::cssSelector("a.meta-item")); 
$titles = $driver->findElements(WebDriverBy::cssSelector("h2.post-card-title")); 
 
// Close the web driver 
$driver->quit();

9.HTTPful

HTTPful是一个简单的、可链接的、可读的 PHP 库,旨在使发送 HTTP 请求变得容易。它为构建它们提供了一个干净的接口,包括GETPOSTPUT,DELETEHEAD, 并且还可以用于发送自定义 HTTP 方法。

👍优点:

  • 易于使用。
  • 用于创建复杂 HTTP 请求的干净且可链接的方法和接口。
  • 您可以使用 cURL 和套接字发送请求,让您可以灵活地制作它们。
  • 该包将响应解析为 XML、JSON 或纯文本,从而可以轻松处理不同类型的数据。
  • 它提供了用于发送多部分表单数据的辅助方法。

👎缺点:

  • 它不像其他一些 PHP HTTP 库那样功能丰富。例如,它不支持异步请求或高级身份验证方法。
  • 不如其他一些图书馆维护得好。最新版本是在 2020 年,该项目似乎处于非活动状态。

如何与 HTTPful 携手抓取

使用以下 composer 命令安装软件包:

composer require nategood/httpful

包含 HTTPful 库并使用该request::get()方法将 GET 请求发送到指定的 URL。这将获得页面的 HTML 响应。之后,通过代码属性检查响应的状态代码以确保请求成功。

require_once("vendor/autoload.php"); 
 
// Next, define the URL you want to scrape 
$url = "https://www.freecodecamp.org/news/"; 
 
// Send a GET request to the URL using HTTPful 
$response = HttpfulRequest::get($url)->send(); 
 
// Check the status code of the response to make sure it was successful 
if ($response->code == 200) { 
    // code to be executed 
} else { 
    // If the request was not successful, you can handle the error here 
    echo "Error: " . $response->code . "n"; 
}

如果请求成功,我们访问响应的主体(使用 body 属性)并使用 Simple HTML DOM Parser 库通过该方法解析 HTML 响应str_get_html()

使用 方法通过其后代和类名在页面上查找元素find(),然后将元素存储在变量中:$titles,$tags$authors。正如在 cURL 部分中一样,您可以使用映射功能将标题、标签和作者组合在一起。

// If the request was successful, 
// you can access the body of the response like this: 
$html = $response->body; 
 
// You can then use the Simple HTML DOM Parser to 
// parse the HTML and extract the data you want. 
include("simple_html_dom.php"); 
 
// Create DOM object using the str_get_html method 
$html = str_get_html($html); 
 
// Find elements by descendants and class names 
$titles = $html->find("h2.post-card-title"); 
$tags = $html->find("span.post-card-tags"); 
$authors = $html->find("a.meta-item");

这是完整的代码:

require_once("vendor/autoload.php"); 
 
// Next, define the URL you want to scrape 
$url = "https://www.freecodecamp.org/news/"; 
 
// Send a GET request to the URL using HTTPful 
$response = HttpfulRequest::get($url)->send(); 
 
// Check the status code of the response to make sure it was successful 
if ($response->code == 200) { 
    // If the request was successful, 
    // you can access the body of the response like this: 
    $html = $response->body; 
 
    // You can then use the Simple HTML DOM Parser to 
    // parse the HTML and extract the data you want. 
    include("simple_html_dom.php"); 
 
    // Create DOM object using the str_get_html method 
    $html = str_get_html($html); 
 
    // Find elements by descendants and class names 
    $titles = $html->find("h2.post-card-title"); 
    $tags = $html->find("span.post-card-tags"); 
    $authors = $html->find("a.meta-item"); 
 
    // Iterate over the arrays contain the elements 
    // and make use of the plaintext property to access only the text values 
    $data = array_map(function ($a1, $a2, $a3) { 
        $new = array( 
            "title" => trim($a1->plaintext), 
            "tag" => trim($a2->plaintext), 
            "author" => trim($a3->plaintext) 
        ); 
        return $new; 
    }, $titles, $tags, $authors); 
 
 
    print_r($data); 
} else { 
    // If the request was not successful, you can handle the error here 
    echo "Error: " . $response->code . "n"; 
}

10. hQuery

hQuery用于解析和操作 HTML 文档。它基于 jQuery API,因此如果您熟悉 jQuery,您应该会发现 hQuery 易于使用。这个网络抓取库使用 DOM 解析器来解析 HTML 并提供一个简单的类似 jQuery 的界面来导航和操作文档。

您可以使用 hQuery 查找文档中的元素、修改它们的属性或内容以及执行其他常见任务。

👍优点:

  • 易于使用的 PHP 网络抓取库,特别是如果您熟悉 jQuery。
  • 用于导航和操作 HTML 文档的出色界面

👎缺点:

  • 它可能不如其他选项高效或高性能,尤其是对于非常大的 HTML 文档。

使用 hQuery 抓取页面的步骤

让我们通过 composer 将 hQuery 添加到我们的编码环境中:

composer require duzun/hquery

在文件顶部包含 hQuery 库和自动加载器。接下来,定义要抓取的 URL。然后,下载该网站的 HTML 内容,并$doc使用名为 的 hQuery 方法将其存储在一个名为 的变量中fromUrl()。这将直接从我们传递的 URL 加载 HTML。

// Require the autoloader 
require "vendor/autoload.php"; 
 
// Define the URL to scrape 
$url = "https://www.freecodecamp.org/news/"; 
 
// Download the HTML content of the URL 
$doc = hQuery::fromUrl($url);

此外,这允许我们使用其他 hQuery 的方法来导航和操作 HTML 文档。一种方法是find()在文档中搜索三种类型的元素:h2with class post-card-titlespanwith classpost-card-tagsaelements with meta-item。这些包含我们要从页面中提取的数据。

// Find all the paragraphs in the body and print their text 
$titles = [...$doc->find("h2.post-card-title")]; 
$tags = [...$doc->find("span.post-card-tags")]; 
$authors = [...$doc->find("a.meta-item")];

此代码下载并解析网页并使用 hQuery 从中提取特定数据。

// Require the autoloader 
require "vendor/autoload.php"; 
 
// Define the URL to scrape 
$url = "https://www.freecodecamp.org/news/"; 
 
// Download and parse HTML content of the URL 
$doc = hQuery::fromUrl($url); 
 
// Find all the paragraphs in the body and print their text 
$titles = [...$doc->find("h2.post-card-title")]; 
$tags = [...$doc->find("span.post-card-tags")]; 
$authors = [...$doc->find("a.meta-item")];

结论

如果使用正确的库和技术正确完成,使用PHP 进行 Web 抓取可以是一个顺利的过程,为此我们讨论了 2023 年使用的 10 个最佳 PHP Web 抓取库。回顾一下,它们是:

  1. ZenRows。
  2. simple HTML DOM。
  3. cURL。
  4. goutte。
  5. guzzle。
  6. panther。
  7. DiDOM。
  8. PHP-Webdriver。
  9. HTTPful。
  10. hQuery。

PHP 网络抓取工具面临的一个常见挑战是难以在不触发反机器人的情况下抓取网页

常见问题

什么是好的 PHP 抓取库?

一个好的 PHP 抓取库是一个快速高效的库,易于使用,支持使用代理,可以抓取动态内容并且有很好的文档。此外,兼容性、维护、安全和支持也是需要注意的特性。使用 PHP 进行网页抓取的一些流行选项包括 Goutte、ZenRows、Panther 和 Simple HTML DOM。

用于网络抓取的最流行的 PHP 库是 Simple HTML DOM。它是一个简单高效的 HTML 解析库。此外,它还提供了不同的方法来创建 DOM 对象、查找元素和遍历 DOM 树,此外它还支持自定义解析行为。

类似文章