检查网站是否包含我的横幅


Check if website contain my banner

我的情况

我有一个"合作伙伴"列表,他们应该将我的横幅添加到他们的网站上,在他们网站上的某个地方......所以我需要检查它,因为它是 200+ 网站的列表,我正在用 PHP 为它编写脚本。

我的第一个想法,轻松的工作!使用get_file_contents然后搜索我的横幅,然后搜索网站上的每个链接,并在我的横幅上再次搜索每个页面。


问题所在

这需要非常非常长的时间。由于某些页面在其网站上有50 +链接,因此使用get_file_contents每个页面将获得近200 * 50


我的脚本

$banners = array(
     // All my banner names => banner url's I need to search for
);
$dealers = array(
    // all partner names => website url of partner
);
foreach($dealers as $dealer => $url) {
    $i = 0;
    echo $dealer;
    // HTML ophalen van de homepage
    $content = file_get_contents($url);
    foreach($banners as $banner => $banner_url) {
        if(preg_match("/" . $banner_url . "/", $content) == TRUE) {
            $i++;
        }
    }
    $stripped_file = strip_tags($content, "<a>");
    preg_match_all("/<a(?:[^>]*)href='"([^'"]*)'"(?:[^>]*)>(?:[^<]*)<'/a>/is", $stripped_file, $matches);
    foreach($matches[1] as $match) {
        if (strpos($match,'http') !== false) {
            $level = file_get_contents($match);
            foreach($banners as $banner => $banner_url) {
                if(preg_match("/" . $banner_url . "/", $content) == TRUE) {
                    $i++;
                }
            }
        } else {
            $match = $url . $match;
            $match = str_replace("//", "/", $match);
            $match = str_replace("http:/", "http://", $match);
            $match = str_replace("https:/", "https://", $match);
            $level = file_get_contents($match);
            foreach($banners as $banner => $banner_url) {
                if(preg_match("/" . $banner_url . "/", $content) == TRUE) {
                    $i++;
                }
            }
        }
    }
    if($i > 0) {
        echo " | Banner found <br />";
    } else {
        echo " | No banner <br />";
    }
}

我的问题

他们是否有任何其他类似 spyder 的解决方案来加速此脚本,或者我是否需要设置一个 cron 并每隔 X 秒左右运行一次才能一次只做一个网站?

抓取网站的 HTML 以查看它是否包含横幅并不是最好的方法。如果您有 2,000 个网站应该托管您的横幅,会发生什么?对于PHP脚本和执行该脚本的服务器来说,这是很多工作。

另一种解决方案是拥有一个 PHP 脚本来提供您的横幅图像,但在这样做时它会记录已实现站点的视图。因此,您可以看到您的横幅何时在网站上"最后一次看到",如果"上次看到"日期是很久以前,那么这就是值得关注和调查的原因。

一个示例 PHP 脚本:

<?php
// banner.php
// log view
// create database connection first
$sql = "INSERT INTO `banner_views` (`domain`) VALUES (:domain)";
$sth = $db->prepare($sql);
$sth->bindParam(':domain', $_SERVER['HTTP_REFERER']);
$sth->execute();
// output image
header('Content-Type: image/gif');
readfile('banner.gif');
exit(;

只需确保您的banner_views表具有TIMESTAMP数据类型的timestamp列,并将其默认值设置为 CURRENT_TIMESTAMP,以便您知道横幅何时"可见"。

对于wast解决方案,我可以建议您在递归模式下使用wget从站点下载页面并保存在磁盘上。下载后,只需检查页面中的横幅代码。这与您的解决方案相同,但可以更快