PHP 快速抓取

PHP Fast scraping

我的目标是从不同的新闻媒体收集标题,然后在我的页面上呼应它们。我试过使用 Simple HTML DOM,然后 运行 IF 语句来检查关键字。它有效,但速度很慢!代码可以在下面找到。有没有更好的方法来解决这个问题,如果有的话;怎么写呢?

提前致谢。

<?php
require 'simple_html_dom.php';

// URL and keyword
$syds = file_get_html('http://www.sydsvenskan.se/nyhetsdygnet');
$syds_key = 'a.newsday__title';

// Debug
$i = 0;

// Checking for keyword "A" in the headtitles
foreach($syds->find($syds_key) as $element) {
   if (strpos($element, 'a') !== false || strpos($element, 'A') !== false) {
      echo $element->href . '<br>';
      $i++;
   }
} 

echo "<h1>$i were found</h1>";
?>

我们说话有多慢?

1-2秒就可以了

如果您将其用于网站。

我建议将 crawlingdisplay 分成两个单独的脚本,并缓存每个抓取的结果。

你可以:

  • 有一个 crawl.php 文件,可以 运行 定期更新您的链接。
  • 然后有一个 webpage.php 读取上次抓取的结果并根据您的网站需要显示它。

这样:

  • 每次刷新网页时,它不会从新闻站点重新请求信息。
  • 新闻站点响应时间稍长并不重要。

解耦crawling/display

您会想要 decouple,抓取并显示 100%。 在所有新闻站点上一次 "crawler.php" 比 运行s 保存原始链接到文件。这可以 运行 每 5-10 分钟保持新闻更新,被警告 不到 1 分钟并且一些新闻站点 可能 得到生气了!

crawler.php

<?php
// Run this file from cli every 5-10 minutes
// doesn't matter if it takes 20-30 seconds

require 'simple_html_dom.php';

$html_output = ""; // use this to build up html output

$sites = array(
    array('http://www.sydsvenskan.se/nyhetsdygnet', 'a.newsday__title')
    /* more sites go here, like this */
    // array('URL', 'KEY')
);

// loop over each site
foreach ($sites as $site){
   $url = $site[0];
   $key = $site[1];
   // fetch site
   $syds = file_get_html($url);

   // loop over each link
   foreach($syds->find($key) as $element) {
     // add link to $html_output
     $html_output .= $element->href . '<br>\n';
   }
}
// save $html_output to a local file
file_put_contents("links.php", $html_output);
?>

display.php

/* other display stuff here */
<?php
// include the file of links
include("links.php");
?>

还想要更快?

如果您不想更快,我建议您查看 node.js,它在 tcp 连接和 html 解析方面要快得多。

瓶颈是:

  • 阻塞 IO - 你可以切换到像 guzzle

  • 这样的异步库
  • 解析 - 您可以切换到 different parser 以获得更好的解析速度