fed*_*o-t 16 html php curl html-parsing web-scraping
我正在寻找一种方法,用PHP中的用户提供的URL进行另一个页面的小预览.
我只想检索页面的标题,图像(如网站的标识)和一些文字或描述(如果可用).没有任何外部库/类,有没有简单的方法可以做到这一点?谢谢
到目前为止,我已经尝试使用DOCDocument类,加载HTML并在屏幕上显示它,但我不认为这是正确的方法
Jor*_*ack 31
我建议你考虑simple_html_dom.这将使它变得非常容易.
这是一个如何拉动标题和第一张图像的工作示例.
<?php
require 'simple_html_dom.php';
$html = file_get_html('http://www.google.com/');
$title = $html->find('title', 0);
$image = $html->find('img', 0);
echo $title->plaintext."<br>\n";
echo $image->src;
?>
Run Code Online (Sandbox Code Playgroud)
这是第二个没有外部库的情况.我应该注意在HTML上使用正则表达式并不是一个好主意.
<?php
$data = file_get_contents('http://www.google.com/');
preg_match('/<title>([^<]+)<\/title>/i', $data, $matches);
$title = $matches[1];
preg_match('/<img[^>]*src=[\'"]([^\'"]+)[\'"][^>]*>/i', $data, $matches);
$img = $matches[1];
echo $title."<br>\n";
echo $img;
?>
Run Code Online (Sandbox Code Playgroud)
这个问题相当古老,但在 PHP 网络抓取工具的 Google 搜索结果中仍然排名很高。自从提出这个问题以来,PHP 中的 Web 抓取在这几年中取得了长足的进步。我积极维护Ultimate Web Scraper Toolkit,它尚未被提及,但早于此处列出的许多其他工具,除了 Simple HTML DOM。
该工具包包括TagFilter,我实际上比其他解析选项更喜欢它,因为它使用状态引擎通过连续流标记器处理 HTML,以实现精确的数据提取。
回答最初的问题,“有没有任何简单的方法可以在没有任何外部库/类的情况下做到这一点?” 答案是不。HTML 相当复杂,而且 PHP 中没有任何内容特别适合该任务。您确实需要一个可重用的库来正确且一致地解析通用 HTML。此外,您会发现此类库有很多用途。
此外,一个真正优秀的网络爬虫工具包将具有三个主要的、高度完善的组件/功能:
数据检索。这是向服务器发出 HTTP(S) 请求并拉取数据。一个好的网页抓取库还允许将大型二进制数据 blob 直接写入磁盘,因为它们从网络上下来,而不是将整个内容加载到 RAM 中。动态form提取和提交的能力也很方便。一个真正好的库可以让您微调每个服务器的每个请求的各个方面,并查看它在线路上发送和接收的原始数据。一些 Web 服务器对输入非常挑剔,因此能够准确地复制浏览器非常方便。
数据提取。这是在检索到的 HTML 中查找内容并将其拉出,通常将其存储到数据库中以备将来查找。一个好的 Web 抓取库还能够正确解析抛出的任何半有效 HTML,包括 Microsoft Word HTML 和 ASP.NET 输出,其中奇怪的东西显示为跨越多行的单个 HTML 标记。能够从设计糟糕、复杂、无类别的标签中轻松提取所有数据的能力,例如某些支付过高的政府雇员制作的 ASP.NET HTML 表格元素,这也非常好(即提取工具不仅仅是一个 DOM 或 CSS3 样式的选择引擎可用)。此外,在您的情况下,能够在读取 50KB 后或在找到所需内容后立即终止数据检索和数据提取是一个加分项,
数据操作。这是#2 的倒数。一个真正好的库将能够多次修改输入的 HTML 文档而不会对性能产生负面影响。你什么时候想这样做?清理用户提交的 HTML,为时事通讯转换内容或发送其他电子邮件,下载内容以供离线查看,或准备将内容传输到其他对输入要求严格的服务(例如发送到 Apple News 或 Amazon Alexa)。创建自定义 HTML 样式模板语言的能力也是一个不错的奖励。
显然,Ultimate Web Scraper Toolkit 可以完成上述所有操作……以及更多:
我也喜欢我的工具包,因为它带有一个 WebSocket 客户端类,这使得抓取 WebSocket 内容更容易。我不得不这样做了几次。
将客户端翻转过来并创建 WebServer 和 WebSocketServer 类也相对简单。当您可以将客户端转换为服务器时,您就知道您拥有了一个很好的库......但后来我使用这些类制作了PHP App Server。我觉得它变成了怪物!