与可信的代理网站合作进行数据收集的 PHP

image

文章内容:

您正在阅读的这篇文章总结了我们在网页抓取这一具有挑战性的领域中的漫长旅程。Dexodata 可信代理网站,具有先进和灵活的设置已经探索了 Python、JavaScript 和 Java 的潜力。我们现在邀请读者关注另一个受欢迎的方向来收集信息。我们指的是老牌的 PHP 助手。

如果用户打算抓取网页内容并将使用我们的地理目标代理来实现这一目的,为什么他们应该尝试呢?这里有一个答案。基本上,PHP 可以被描述为一种通用的服务器端脚本语言,早在 1995 年就诞生了。因此,它本质上是为了网页开发而设计的(最新的 PHP 版本是 8.4)。PHP 所赢得和保持的市场份额仍然是巨大的。

任何对互联网技术方面有一定了解的人都知道 WordPress 是什么。基于 PHP 的内容管理系统(CMS)支持和维护大约 40% 的现有网站。并不是所有这些网站都那么受欢迎,40% 的网站并不一定等于 40% 的流量或 40% 的数据。但这一事实不言而喻。

  1. 除了所有与内容管理相关的内容,大约 80% 的网站依赖于 PHP(当其服务器端属性可以被识别时)。
  2. 最后,真正需求旺盛的先进产品可以用 PHP 开发。例如,那些请求我们付费代理免费试用的新用户,应该知道 Slack 是基于 PHP 代码构建的。是的,它并不是最纯粹的社交媒体,但仍然如此。

作为一种“倾向于”网络的语言,PHP 是低到中等复杂场景的不错选择。通过它,程序员可以:

  • 发起请求以转发到指定页面;
  • 获取信息;
  • 以有序的形式保存信息,例如 CSV、JSON 或 XML 等格式。

总之:PHP 绝对是一个可以用于抓取任务的资源,因为它能够与网站进行交互,并理解和处理 HTML,以及通过一系列合适的函数和库抓取信息。在这方面,PHP 并不是那么先进和灵活,不应选择用于动态内容,尽管如此,它仍然是一个可行且在某种程度上可用的选项。我们这样说是因为作为一个拥有 用于网页抓取的地址 的可信代理网站,对这一数据收集行业非常了解。

使用 PHP 进行网页抓取:基础知识和前提条件

在进一步深入之前,请验证您是否了解以下内容。

  1. HTTP 请求。这里我们指的是服务器用于发送和获取信息的协议。为了从某个网页获取数据,用户需要向负责托管该页面的服务器发出 HTTP 查询。PHP 具有内置函数,如 cURLfile_get_contents()fopen(),使用户能够发出 HTTP 查询并从页面获取信息。
  2. HTML 解析。作为一种旨在“构建”网页的语言,PHP 提供了内置的 DOMDocumentSimpleXMLElement,使用户能够解析 HTML 以获取信息。
  3. 正则表达式 是一种可行且强大的工具,用于匹配模式和操作文本。同样,PHP 提供了内置函数,例如 preg_match()preg_replace(),使用户能够使用正则表达式从网站抓取信息。

即使这些基本概念也足以让用户制作一个简单的 PHP 程序,能够向某个网页发出 HTTP 查询,“拯救” HTML,最终解析代码并抓取所需的信息,使用 Dexodata 的道德地理目标代理生态系统(包括社交媒体的付费代理免费试用)。

 

PHP 网络数据收集:示例场景

 

假设需要抓取某个网页上包含的商品列表信息(我们将展示一个非常基本的案例,后续部分将有更高级的案例)。必须抓取每个商品的名称、价格和图片,并将这些信息保存为 CSV 文件。这里是最简单的方法,即在没有复杂场景和障碍的情况下。只需遵循 Dexodata 白名单地理目标代理生态系统的步骤。

<?php

$url = 'https://sample.com/items';

$html = file_get_contents($url);

$dom = new DOMDocument();

$dom->loadHTML($html);

$products = $dom->getElementsByTagName('article');

$data = [];

foreach ($items as $items) {

    $name = $item->getElementsByTagName('h2')[0]->textContent;

    $price = $item->getElementsByTagName('span')[0]->textContent;

    $image = $item->getElementsByTagName('img')[0]->getAttribute('src');

    $data[] = [$name, $price, $image];

}

$fp = fopen('items.csv', 'w');

foreach ($data as $fields) {

    fputcsv($fp, $fields);

}

fclose($fp);

?>

没有什么比这更简单的了!

读者在这里看到的是我们首先通过 file_get_contents() 向网页发出 HTTP 查询。随后,我们通过 DOMDocument 类解析 HTML 内容,并通过 getElementsByTagName() 方法抓取一些相关信息。然后,我们可以将抓取到的信息保存到一个多维数组中,随后通过 fputcsv() 将其写入 CSV 文件。

如果您觉得一切都很清楚,那就让我们继续前进。Dexodata 可信代理网站将为您展示数据的获取路径。

 

演变。库和工具

 

自其诞生以来,PHP 已经发生了显著的演变。可能,它的库看起来并不那么“时尚”和“花哨”(它不是 Python),然而,这种语言拥有一个庞大的社区支持可用的库。让我们在网页抓取的背景下来审视它们。作为一个运行地理目标代理生态系统的可信代理网站(包括 社交媒体的代理,如 Instagram),我们提出以下梯级,从简单选项到更高级的选项。

 

1. Goutte

 

Goutte 是一个功能齐全的库,可以与 PHP 框架一起使用。即使是新手也可以掌握它,以抓取 HTML 中的数据。由于其易于理解的面向对象设计,学习曲线也不具挑战性。至于其他优点,包括可见的社区、丰富的文档以及速度。由于它依赖于 HTTP 1.1 持久连接,这意味着浏览器只需要与服务器建立一次连接。之后,所有请求都将使用第一次的连接。

当然也有一些缺点。在某些项目中,可能会面临与动态内容相关的不可逾越的限制。让我们尝试 Goutte 和 PHP 的实际操作,点击感兴趣的页面(像往常一样,在抓取网页上的任何内容时,请不要忘记 Dexodata 的住宅、数据中心和移动网络 地理目标代理,价格优惠)。

首先,您需要 安装 Composer。后者用于管理 PHP 的依赖关系。它使用户能够声明对项目重要的库。

只需在终端中执行以下命令:

composer require fabpot/goutte

然后为该项目生成一个 PHP 脚本。给它任何您想要的名称。然后打开您的新脚本,并添加以下代码行以启动 Goutte:

require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

太好了,Goutte 已经完全启动并初始化!之后,提供以下几行代码以通过 client->request() 函数获取 URL。

$url = "http://instance.com/";

$crawler = $client->request('GET', $url);

// 点击“更多信息...”链接

$link = $crawler->selectLink('更多信息…')->link();

$crawler = $client->click($link);

只需几行代码,我们就能顺利导航到网页并完成点击操作。现在是与 Dexodata 可信代理网站进行第二轮的时间。

 

2. 简单 HTML DOM

 

作为一个解析器,该程序旨在处理任何 HTML 文档,包括那些被相应 HTML 规范定义为无效的文档。它的一个主要优点是易于掌握,并且没有外部 JS 相关的内容需要在开始工作之前单独加载。其他优点包括速度(用户无需将整个页面加载到内存中,因此可以同时处理多个 HTML 页面,而不会影响性能)以及轻量级(即无需安装任何额外的软件或库,仅使用 PHP 即可)。

毫无疑问,也存在一些限制。您对页面组件的访问将受到限制:可以对页面的结构进行操作,但其内容将无法触及。值得注意的是,简单 HTML DOM 相当严格,因此除非您是 HTML 的高手,否则潜力将受到限制。

理论部分已经足够,让我们进入实践。

首先,通过访问这个 简单 HTML DOM 文档 页面获取最新版本。那将为您提供所需的一切。

首先,复制 simple_html_dom.php 文件。之后,只需将其粘贴到您的活动项目中。

生成您的 PHP 文件(名称无关紧要)。例如,webscrapingstuff.php。

现在,打开该文件并通过添加以下代码来“武装”您的项目,使用 Dexodata 可信代理网站提供的代码:

include('simple_html_dom_php');

输入这行代码。这很重要,因为它将引导您访问页面本身:

$html = file_get_html('http://instance.com/')

作为简单 HTML DOM 的一部分,file_get_html 能够检索与指定 URL 相关的 HTML。随后,它会提供一个 DOM 对象,存储我们的 $html 变量。

假设您需要主要标题。要获取第一个 H1 标题,请应用以下代码:

echo $html->find('h1', 0)->plaintext;

如果您在您的网络服务器上打开此结果文件,您会发现您所需的内容。

 

3. PHP 抓取器

 

作为一个专注于数据收集的白名单和道德来源 IP 地址的生态系统,我们不能忽视 PHP 抓取器。后者是一个工具,使抓取者能够通过 PHP 脚本抓取信息。这种方法意味着无需自己编写大量代码。所需的只是应用一些简单的命令,如 find_element_by_classfind_element_by_id。它们将足以针对任何特定网页的特定组件,通过输入其类或 ID 号。

有问题吗?当然,存在一些问题。PHP 抓取器可能不适用于每种可能的用例,因为它自然是基于 PHP 的。因此,它与与 Apache 或 Nginx 相关的服务器兼容,并通过默认启用的 mod_rewrite 进行配置。如果您打算从 API 抓取信息或解析复杂的 HTML 页面,PHP 抓取器并不是您的方向。

无论如何,让我们运行一个基本场景。

我们的读者必须安装 Composer,就像我们在 Goutte 部分所做的那样。之后,通过 Composer 使用以下代码将讨论中的库添加到您的项目中:

composer require spekulatius/phpscraper

一旦安装阶段结束,Composer 的自动加载器将接管该包。如果某人使用 VanillaPHP 库,则必须在其脚本中包含自动加载器,如下所示:

require 'vendor/autoload.php'

作为练习,生成一个脚本,访问某个网页并列出其中的链接数量。启动程序并给它一个变量,如下所示:

$web = new \spekulatius\phpscraper();

给程序一个访问 URL 的命令:  

$web->go(' [http://instance.com/](http://instance.com/) ');

补充这一段代码,负责获取网页中包含的每个链接并打印它们的数量。

// 打印链接的数量。

echo "此页面包含 " . count($web->links) . " 个链接。 ";

// 遍历链接

foreach ($web->links as $link) {

echo " - " . $link . " ";

}

/**

* 此代码将打印:

*

* 此页面包含 1 个链接。

*

* - https://www.iana.org/domains/instance

*/

请记住:我们使用的是一个虚拟地址。

 

4. 用于抓取操作的 PHP cURL

 

在回顾了一系列 PHP 提供的抓取选项后,我们的 Dexodata 可信代理网站为您提供了一个额外方便且广泛使用的选项。我们当然指的是 cURL,一个库和命令行工具(通常默认随语言提供),使用户能够通过 HTTP 和 FTP 发送和获取文件。在使用它时,可以应用地理目标代理(包括我们提供的付费代理免费试用),通过 SSL 连接传输数据,定义 cookies 等。让我们在实践中试试。

生成一个新的 PHP 脚本,并补充以下代码:

// 初始化 curl

$ch = curl_init();

// 用于抓取的 URL

curl_setopt($ch, CURLOPT_URL,

'https://dexodata.com/en/blog');

// 返回传输为真

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$output = curl_exec($ch);

// 关闭 cURL

curl_close($ch);

CURLOPT_RETURNTRANSFER 定义为 TRUE 会将页面作为字符串提交,而不是直接输出。因此,我们的代码获取了我们需要从网站抓取的信息。

可以通过 echo 和数据存储变量查看这些数据:

echo $output

我们的下一步是将这些信息放入一个 DOM 文档中,这将使我们能够访问它以进行抓取。

$dom = new DOMDocument;

$dom->loadHTML($output);

目前,我们的信息以 HTML 结构的形式存储在一个变量中。生成一些额外的代码以打印 HTML 页面提供的每个链接:

$tags = $dom->getElementsByTagName('a');

for($I=0; $I < $tags->length; $I++){

$link = $tags->item($i);

echo " - " . $link . " ";

}

顺便提一下,作为一个拥有付费代理免费试用机会的地理目标代理来源,我们提醒用户不要忘记使用我们提供的地址来保护他们的抓取活动(例如,我们的 顶级住宅 IP 来自 ISP 或者我们的高质量移动代理)。Dexodata 生态系统将向读者展示如何通过 cURL 实现这一点。他们所需做的就是遵循语法。

curl --proxy <proxy-ip>:<proxy-port> <url>

首先,<proxy-ip> 部分是插入 IP,第二个 <proxy-port> 部分则是用于端口号。最终,它将看起来像:

curl --proxy 193.191.56.12:7070 -k https://dexodata.com/en/blog

只要地址有效,查询成功,我们的脚本将显示网页的内容,然后退出。

 

构建抓取器:示例场景

 

让我们想象一个电子商务网站,里面有我们想通过 PHP 抓取的商品列表。我们该怎么做?我们应该使用什么替代方案?请遵循我们的可信代理网站,并查看这个示例场景。

首先,通过 PHP 的潜力和老牌的 cURL 下载整个电子商务网站的 HTML,如下所示:

// 初始化 cURL 请求 

$curl = curl_init(); 

// 设置要通过 GET HTTP 请求访问的 URL 

curl_setopt($curl, CURLOPT_URL, "https://scrapeme.live/shop/"); 

// 将 cURL 请求返回的数据作为字符串 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

// 使 cURL 请求遵循最终的重定向,并到达感兴趣的最终页面 

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

// 执行 cURL 请求并获取页面的 HTML 作为字符串 

$html = curl_exec($curl); 

// 释放 cURL 资源 

curl_close($curl);

与 Dexodata 的 HTML 相关内容完全可用,存储在 $html 变量中。您的下一步是将 $html 加载到具有 str_get_html() 函数的 HtmlDomParser 实例中。请参见下面如何完成:

require_once __DIR__ . "../../vendor/autoload.php";

use voku\helper\HtmlDomParser; 

$curl = curl_init(); 

curl_setopt($curl, CURLOPT_URL, "https://scrapeme.live/shop/"); 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

$html = curl_exec($curl); 

curl_close($curl); 

// 初始化 HtmlDomParser 

$htmlDomParser = HtmlDomParser::str_get_html($html);

您和我们的可信代理网站现在处于正确的位置,可以使用 HtmlDomParser 浏览 HTML 网站的 DOM,并有效地启动数据收集过程。

这就是 Dexodata 即将实现的目标。为了实现这一目标,“拯救”我们场景中所有与分页相关的链接列表。在我们的例子中,这将使我们能够抓取整个网页部分。右键单击与分页数字相关的 HTML 组件,选择“检查”。之后,我们的开发者工具将向我们展示 DOM 元素。

如何使用可信的代理网站在 PHP 中收集数据

让我们继续使用 Dexodata 的地理目标代理生态系统。可以预期,.page-numbers 作为 CSS 类,将识别与分页相关的 HTML 组件。然而,我们的可信代理网站团队会提醒我们,CSS 类不一定唯一地标识 HTML 组件。多个节点实际上可能与同一个类相关。

因此,如果您的意图是应用 CSS 选择器来抓取 DOM 中的组件,必然需要将 CSS 类与其他选择器结合使用。具体来说,用户可以使用 HtmlDomParser 助手,使用 .page-numbers 作为 CSS 选择器,选择所有与分页相关的 HTML 组件。然后,我们的地理目标代理生态系统建议您迭代它们,以从 href 属性中抓取每个所需的 URL。

请查看以下内容:

// 使用 

// “.page-numbers a” CSS 选择器检索 HTML 分页元素 

$paginationElements = $htmlDomParser->find(".page-numbers a"); 

$paginationLinks = []; 

foreach ($paginationElements as $paginationElement) { 

// 用 URL 填充 paginationLinks 集合 

// 从 HTML 分页元素的 href 属性中提取 

$paginationLink = $paginationElement->getAttribute("href"); 

// 避免 URL 列表中的重复项 

if (!in_array($paginationLink, $paginationLinks)) { 

$paginationLinks[] = $paginationLink; 

}

// 打印 paginationLinks 数组 

print_r($paginationLinks);

请注意,find() 使用户能够 根据 CSS 选择器抓取 DOM 组件。此外,在 Dexodata 的假设场景中,分页相关的组件在电子商务网站的每个页面上都出现两次。当 $paginationLinks 数组面临时,需要提供一个独特且调整过的技巧来处理重复组件的问题。

如果我们尝试运行我们的脚本以实现该场景,以下是我们将看到的内容:

Array ( 

[0] => https://scrapeme.live/shop/page/2/ 

[1] => https://scrapeme.live/shop/page/3/ 

[2] => https://scrapeme.live/shop/page/4/ 

[3] => https://scrapeme.live/shop/page/46/ 

[4] => https://scrapeme.live/shop/page/47/ 

[5] => https://scrapeme.live/shop/page/50/ 

)

请注意,所有地址都具有相同的结构。也就是说,它们都由负责分页的最后数字标记。如果读者打算迭代每个链接,他们所需的唯一内容是与最后一页相关的标识数字。

可以通过以下方式获取:

// 删除 $paginationLinks 数组最后一个元素中的所有非数字字符,以获取最高的分页数字 

$highestPaginationNumber = preg_replace("/\\D/", "", end($paginationLinks));

假设我们的 $highestPaginationNumber 将是 "50"。

因此,现在是时候与 Dexodata 团队一起抓取描述特定产品的信息。我们需要右键单击某个商品并激活开发者工具窗口,然后选择“检查”。可以预期,商品将由一个 li.product HTML 元素组成,包含一个 URL、一张图片、一个标题和一个价格标签。这些信息分别来自 amgh2span HTML 组件。

Dexodata 可信代理网站建议通过 HtmlDomParser 抓取这些信息:

$productDataLit = array(); 

// 检索页面上的产品列表 

$productElements = $htmlDomParser->find("li.product"); 

foreach ($productElements as $productElement) { 

// 提取产品数据 

$url = $productElement->findOne("a")->getAttribute("href"); 

$image = $productElement->findOne("img")->getAttribute("src"); 

$name = $productElement->findOne("h2")->text; 

$price = $productElement->findOne(".price span")->text; 

// 将产品数据转换为关联数组 

$productData = array( 

"url" => $url, 

"image" => $image, 

"name" => $name, 

"price" => $price 

); 

$productDataList[] = $productData; 

}

一旦我们的逻辑成功抓取了单个页面上的所有商品信息块,并随后将其保存为 $productDataList 数组。将此逻辑应用于每一页。

// 遍历所有“/shop/page/X”页面并获取所有产品数据 

for ($paginationNumber = 1; $paginationNumber <= $highestPaginationNumber; $paginationNumber++) { 

$curl = curl_init(); 

curl_setopt($curl, CURLOPT_URL, "https://scrapeme.live/shop/page/$paginationNumber/"); 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

$pageHtml = curl_exec($curl); 

curl_close($curl); 

$paginationHtmlDomParser = HtmlDomParser::str_get_html($pageHtml); 

// 抓取逻辑... 

}

太好了!我们已经到达可以按计划提取数据的情况。

 

最后的备注 

 

作为一个运行地理目标代理生态系统的网站,我们希望以几条备注结束本指南。尽量避免被检测和限制为抓取者。为此,我们提醒您使用我们已经提到的代理。

以下是如何添加代理标识符的另一个提醒:

curl_setopt($curl, CURLOPT_PROXY, "<PROXY_URL>"); 

curl_setopt($curl, CURLOPT_PROXYPORT, "<PROXY_PORT>"); 

curl_setopt($curl, CURLOPT_PROXYTYPE, "<PROXY_TYPE>");

1. 额外的保护层可以通过用户代理 HTTP 头来构成。根据定义,cURL 总是会设置类似 curl/XX.YY.ZZ 的内容。使用这样的头部捕捉用户并不难。相反,尝试在这里“玩弄”头部。

curl_setopt($curl, CURLOPT_USERAGENT, "<USER_AGENT_STRING>");

因此,您将放置类似于互联网找到的示例:

curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")

2. Dexodata 的第二条备注集中在动态内容上。我们强调,常规的 GET cURL 查询无法帮助您实现这一点,需要更高级的技术。返回我们的 专门针对 JS 的指南,了解更多关于无头浏览器的信息,即没有用户界面的浏览软件包。这将帮助您构建一个像真实用户一样与网页交互并同时提取动态内容的抓取器。

3. 我们的第三条备注专注于并行抓取。PHP 中的多线程是具有挑战性的,但有时是不可避免的。以下是如何与 Dexodata 可信代理网站一起解决这个挑战。我们的概念是使您的抓取脚本能够通过应用 HTTP GET 参数在多个实例上执行。

修改脚本,使其不遍历所有页面,而是关注较小的并行部分。以下是如何修改脚本并设置“片段”的限制。只需设置几个 GET 参数,如下所示:

$from = null; 

$to = null; 

 

if (isset($_GET["from"]) && is_numeric($_GET["from"])) { 

$from = $_GET["from"]; 

if (isset($_GET["to"]) && is_numeric($_GET["to"])) { 

$to = $_GET["to"]; 

if (is_null($from) || is_null($to) || $from > $to) { 

die("无效的 from 和 to 参数!"); 

// 仅抓取编号从 "$from" 到 "$to" 的分页页面 

for ($paginationNumber = $from; $paginationNumber <= $to; $paginationNumber++) { 

// 抓取逻辑... 

}

// 将抓取的数据写入数据库/文件

这将使您准备好通过在浏览器中激活多个链接来启动多个实例:

https://instance.com/scripts/scrapeme.live/scrape-products.php?from=1&to=5 

及类似的链接。

它们将并行执行并抓取网页。这就是了。感谢您与 Dexodata 一起,您的道德移动、数据中心和住宅 代理,符合所有 KYC 和 AML 标准

Back

我们吃Cookies。 阅读更多关于Cookies政策