【问题标题】:PHP web scraper get part of pagePHP网络爬虫获取页面的一部分
【发布时间】:2018-03-08 04:35:19
【问题描述】:

我用 PHP 开发了一个网络爬虫,我遇到了数据处理速度低的问题。当我加载网页时,我收到了太多不必要的数据。 有没有办法接收不是整个页面而只接收部分?具体的 HTML 标签及其内容?

现在我有这样的代码:

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

【问题讨论】:

  • 您最终可能会收到页面的一部分,但不能保证在收到的片段中找到您要查找的内容。除非您只想要标题(或元标记),否则这似乎是一个死胡同。
  • 除非源有一些 API 可以让您获取特定数据,否则您需要下载完整页面并自己解析。我猜你理论上可以下载它块,检查你想要的元素是否在那里,如果是,停止获取更多,如果不是,获取更多,

标签: php web-scraping simple-html-dom php-curl


【解决方案1】:

数据处理速度低的问题

真的吗? IME DOM 解析器工作得很好。 假设您已确认这是您的问题的原因,那么有 3 个明显的解决方案:

  • 如果您要抓取多个页面,请将工作负载分片到所有 CPU 上
  • 使用基于偶数的解析器而不是 DOM 解析器(此时您的代码变得更加复杂)并丢弃不需要的尾随内容。
  • 升级您的硬件

虽然 HTTP 支持范围查询(即您只能获取页面的一部分),但您不知道标记块与字节流对齐的位置 - 所以您不能只获取页面的一部分。

OTOH,如果您没有费心检查问题是否与代码执行有关,那么网络延迟很可能会出现缓慢;您没有告诉我们任何有关如何获取页面的信息,也没有向我们展示任何检索内容的代码(原生 PHP 中有“file_get_html”)。

如果问题实际上是延迟,那么解决方案是运行一个批处理来一次执行多个页面的异步获取 - 使用curl_multi_exec。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多