Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的Web抓取_Php_Html_Curl_Html Parsing_Web Scraping - Fatal编程技术网

PHP中的Web抓取

PHP中的Web抓取,php,html,curl,html-parsing,web-scraping,Php,Html,Curl,Html Parsing,Web Scraping,我正在寻找一种方法,从中用户提供的URL对另一个页面进行小预览 我只想检索页面的标题、图像(如网站的徽标)和一些文本或描述(如果有的话)。在没有任何外部库/类的情况下,有什么简单的方法可以做到这一点吗?谢谢 到目前为止,我已经尝试使用DOCDocument类,加载HTML并将其显示在屏幕上,但我认为这不是正确的方法。然后寻找标题和IMG标签,或者你还需要做什么。 < P>我建议你考虑一下。这将使它变得非常容易 下面是一个如何提取标题和第一个图像的工作示例 <?php require 'si

我正在寻找一种方法,从中用户提供的URL对另一个页面进行小预览

我只想检索页面的标题、图像(如网站的徽标)和一些文本或描述(如果有的话)。在没有任何外部库/类的情况下,有什么简单的方法可以做到这一点吗?谢谢

到目前为止,我已经尝试使用DOCDocument类,加载HTML并将其显示在屏幕上,但我认为这不是正确的方法。然后寻找标题和IMG标签,或者你还需要做什么。

< P>我建议你考虑一下。这将使它变得非常容易

下面是一个如何提取标题和第一个图像的工作示例

<?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;
?>

下面是第二个示例,它将在没有外部库的情况下执行相同的操作。我应该注意,在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;
?>

您可以使用这些库中的任何一个。正如您所知,每种方法都有其优点和缺点,因此您可以参考每种方法的说明,或者花点时间自己尝试:

  • :一个独立的HTTP客户端,因此无需依赖于cURL、SOAP或REST
  • :由Symfony developer在Guzzle和一些Symfony组件上构建
  • :具有缓存功能的快速刮板。在刮取大型文档时具有高性能
  • :以其用户友好的使用而闻名
  • :轻量级客户端,非常适合初学者
  • :异步刮板,带有全面的教程和示例
你最好把它们都检查一遍,在最好的场合使用每个人。

我喜欢这个图书馆。非常易于使用,有许多选项,如:

$crawler = $crawler
->filter('body > p')
->reduce(function (Crawler $node, $i) {
    // filters every other node
    return ($i % 2) == 0;
});

这个问题已经很老了,但在PHP中的网页抓取工具的谷歌搜索结果中仍然排名很靠前。自提出这个问题以来,PHP中的Web抓取在这几年中取得了长足的进步。我积极维护,这还没有提到,但比这里列出的许多其他工具都要早,除了简单的HTMLDOM

工具箱包括,我实际上更喜欢它,因为它使用状态引擎处理HTML,并使用连续流标记器进行精确的数据提取

要回答最初的问题“没有任何外部库/类,有没有简单的方法可以做到这一点?”答案是否定的。HTML相当复杂,PHP中没有任何内置的东西特别适合此任务。您确实需要一个可重用的库来正确、一致地解析通用HTML。另外,你会发现这样一个图书馆有很多用途

此外,一个真正优秀的web scraper工具包将有三个主要的、高度完善的组件/功能:

  • 数据检索。这是向服务器发出HTTP(S)请求并提取数据。一个好的web抓取库还允许在大型二进制数据块从网络上掉下来时直接写入磁盘,而不是将整个数据块加载到RAM中。动态
    表单
    提取和提交的功能也非常方便。一个真正好的库可以让您对每个服务器的每个请求的各个方面进行微调,并查看它在网络上发送和接收的原始数据。一些web服务器对输入非常挑剔,因此能够准确地复制浏览器非常方便

  • 数据提取。这是在检索到的HTML中查找内容片段并将其取出,通常将其存储到数据库中以供将来查找。一个好的web scraping库还能够正确解析抛出的任何半有效HTML,包括Microsoft Word HTML和ASP.NET输出,其中奇怪的东西显示为一个跨多行的HTML标记。能够轻松地从设计拙劣、复杂、无类的标记(如一些高薪的政府雇员制作的ASP.NET HTML表格元素)中提取所有数据也非常好(即,提取工具不仅仅提供DOM或CSS3样式的选择引擎)。此外,在您的情况下,在读取50KB的数据后或在您找到要查找的内容时提前终止数据检索和数据提取的能力是一个优势,如果有人向500MB的文件提交URL,这可能会很有用

  • 数据操纵。这是#2的倒数。一个真正好的库能够多次修改输入HTML文档,而不会对性能产生负面影响。你想什么时候做这个?清理用户提交的HTML,转换新闻稿内容或发送其他电子邮件,下载内容供脱机查看,或准备内容传输到另一个对输入要求苛刻的服务(例如发送到Apple News或Amazon Alexa)。创建自定义HTML样式模板语言的能力也是一个不错的奖励

  • 显然,Ultimate Web Scraper Toolkit可以完成上述所有功能……以及更多功能:

    我也喜欢我的工具包,因为它附带了一个WebSocket客户端类,这使得抓取WebSocket内容更容易。我已经做了好几次了


    将客户机转变为Web服务器和WebSocketServer类也相对简单。你知道你有一个很好的库,当你可以把客户机变成服务器的时候……但是后来我去用这些类。我认为它正在变成一个怪物

    看看卷发,它应该有你需要刮的所有东西information@OhCaN使用
    DOCDocument
    类,加载HTML并在屏幕上显示,但我认为这不是我使用过的最好的第三方库之一的正确方法。强烈推荐。谢谢你的回答。我想我会坚持使用简单的HTMLDOM解析器库,因为每个人都推荐它,感谢您指出插件,非常易于使用。这真令人兴奋![+1]