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

时间:2013-12-11 12:33:29

标签: php file-get-contents

我的情况

我有一个“合作伙伴”列表,他们应该将我的横幅添加到他们的网站上,在他们网站的某个地方...所以我需要检查它,因为它是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秒左右执行一次运行才能一次只做一个网站?

2 个答案:

答案 0 :(得分:4)

抓取网站的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,以便您知道横幅广告的时间是“看到”。

答案 1 :(得分:0)

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