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秒就可以了
如果您将其用于网站。
我建议将 crawling
和 display
分成两个单独的脚本,并缓存每个抓取的结果。
你可以:
- 有一个
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 以获得更好的解析速度
我的目标是从不同的新闻媒体收集标题,然后在我的页面上呼应它们。我试过使用 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秒就可以了
如果您将其用于网站。
我建议将 crawling
和 display
分成两个单独的脚本,并缓存每个抓取的结果。
你可以:
- 有一个
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 以获得更好的解析速度