首先科普一下目前互联网广告的类型,大体都有CPC,CPM,CPA,CPS,CPV这几种。
CPC就是按点击(Click)计算,CPM就是按弹窗(Mxxx?)计算,CPA/CPS一个是按注册一个是按销售计算,CPV则是按显示次数计算。于是CPC,CPA,CPS这种根据网站访客行为来获得收益的是一类,而CPM和CPV这种只和网站流量相关的则是另一类。
可想而知,CPC,CPA,CPS的效果要分析访客群体,点击习惯等诸多要素来进行调整,非一蹴而就,这篇文章中我主要想研究怎么从流量上做文章,在不作弊的情况下获取尽可能多的收益;等广告联盟用得多了,时间长了,也会给一点不同广告联盟的评价。
1. 最基本的投放
以A5联盟(貌似是站长网的直属联盟,应该比较可信,所以还是拿它来做例子吧)为例,直接在网页任意地方嵌入类似代码就能生成在右下角悬浮的展示广告了。
<script type="text/javascript"> u_a_client="20326"; u_a_width="270"; u_a_height="200"; u_a_zones="37972"; u_a_type="1" </script> <script src="http://www.admin6.com/i.js"></script>
2. 不同广告联盟的同类广告轮播
因为CPV/CPM是按IP计算浏览量的,那么同一用户反复浏览同一广告是不会增加收入的,所以引入轮播机制。
通常情况下,如果是同一个联盟,那么是自动随机轮播的,但是如果想在不同的联盟的CPV广告之间进行轮播,又该如何呢。
其实可以自己来搞随机,通过javascript脚本,在相应位置随机产生代码。可以定义文件 dynamic.js,然后在相应位置引入
<script type="text/javascript" src="dynamic.js"></script>
然后dynamic.js利用document.write以及Math.random函数来实现动态展示不同网站的广告,这里我用了另一个广告联盟太极圈(这个联盟我看playsc.com在用所以也申请了)的广告。代码如下:
var choice = Math.random()*2; if (choice<=1){ document.write('<script type="text/javascript">u_a_client="20685";u_a_width="270";u_a_height="200";u_a_zones="63336";u_a_type="1";<\/script><script src="http://js.tjq.com/i.js"><\/script>'); }else{ document.write('<script type="text/javascript">u_a_client="20326";u_a_width="270";u_a_height="200";u_a_zones="37972";u_a_type="1";<\/script><script src="http://www.admin6.com/i.js"><\/script>'); }
显然,如果有3个需要展示的,那么random*3,并且放上三个分支就行了,以此类推。这只是一种形式,如果有很多广告的话,可以定义一个dynamic.js文件,把上述代码放在函数cpv里面,然后在相应的地方调用cpv函数也可。这样方便统一管理广告。
另外这样做的另一个好处是,静态化的页面不用重新生成,只用修改dynamic.js的内容,即可以修改广告内容。
使用中发现,javascript的随机数生成并不太靠谱,所以也可以摒弃Math.random方法,改用奇偶时间法:奇数分钟显示A广告,偶数分钟显示B广告,甚至可以按秒数来分,最多支持60个广告轮播(好变态-.-)。这个方法的基本思想是,只要浏览网页超过时间片的长度(我这里用的是分钟),那么必然会同时浏览到两个广告。dynamic.js的代码修改如下
var now = new Date(); var minutes = now.getMinutes(); if (minutes%2==0){ document.write('<script type="text/javascript">u_a_client="20685";u_a_width="270";u_a_height="200";u_a_zones="63336";u_a_type="1";<\/script><script src="http://js.tjq.com/i.js"><\/script>'); }else{ document.write('<script type="text/javascript">u_a_client="20326";u_a_width="270";u_a_height="200";u_a_zones="37972";u_a_type="1";<\/script><script src="http://www.admin6.com/i.js"><\/script>'); }
奇偶时间法的另一个优势在于可以比较哪个广告联盟量比较足,因为可想而之奇偶时间分配的话,一般来说两个联盟分配到的点击数都应该差不多的,然而根据我的测试,太极圈似乎比A5联盟的CPV次数会多上10%。这可能只是个别现象,仅作参考,不做为推荐。
3. 终极轮播绝招
使用2的那些方法以后,比起单联盟来说,广告投放效果立刻*1.5,但是这还是不够。我们应该更贪心一点:要压榨光每一个IP的用户流量。
怎样才能压榨干净呢?试想一下这个算法:
- 用户当天第一次来访,显示广告1
- 用户当天第二次来访,显示广告2
- ……
只要用户访问次数小于现存广告的个数,那么他每次访问都会显示不一样的广告,点几次页面就显示几次广告!CPV广告就真正名副其实地是Cost Per View了。(但是这么做会不会被误认为是作弊?因为明显展示数和统计数比例太高了,看上去像假的,这个需要衡量)
还有一个问题是,怎么确定用户第几次访问,从而显示第几个广告呢?最朴素的想法莫过于建立一个本机的流量统计系统,例如piwik系统,然后查询本地数据库,我一开始的确想这么实现,但是可想而知这会多么拖累主机的性能。想想看,javascript有没有办法自己来保存那些访问信息呢?
其实是有的,那就是本机cookies,只要自动记录cookie,那么用户是第几次来那就显而易见了;而且由于cookie有自动超时机制,我们只要让它把超时设为24小时,那么第二天就可以自动重新统计了。
首先,需要有set_cookie以及get_cookie函数
function set_cookie(name,value,expires){ var today = new Date(); today.setTime( today.getTime() ); expires = expires*1000; var expires_date = new Date(today.getTime()+(expires)); document.cookie=name+"="+escape(value)+";expires="+expires_date.toGMTString()+";domain=simplecd.org"; } function get_cookie(name){ var i,x,y,ARRcookies=document.cookie.split(";"); for (i=0;i<ARRcookies.length;i++){ x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("=")); y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1); x=x.replace(/^\s+|\s+$/g,""); if (x==name){ return unescape(y); } } }
然后,我们可以稍微修改一下算法,简化代码:为各个广告建立自己的cookie,值为访问次数
新算法如下:
- 遍历各广告位的cookie
- 如果有不存在的cookie,则显示该广告位,并且设置cookie
- 如果cookie全部存在则显示任意广告或者不显示,同时更新所显示广告的cookie
更进一步地,为了那个悬浮窗不要那么扰民,也可以再加上一条:
- 如果用户已显示广告总次数大于6次,那么今天就不显示该类广告。
整个接下来的代码如下:
var total_ad = 3; var max_show = 6; var cookie_pre = 'cpvad_counter_'; var cookie_time = 60*60*8; var show = -1; // show ad id var show_counter = 0; // first pass, round robin for (var i=0;i<total_ad;i++) { var cookie_name = cookie_pre+i; var counter = get_cookie(cookie_name); if ( counter ){ show_counter += parseInt(counter); }else{ show = i; break; } } // show if not showed more than max_show times if (show_counter < max_show){ // second pass, random show if (show == -1){ show = Math.floor(Math.random()*total_ad); } // handle cookie var cookie_name = cookie_pre+show var cookie_value = get_cookie(cookie_name); if (cookie_value){ set_cookie(cookie_name,''+(parseInt(cookie_value)+1),cookie_time); }else{ set_cookie(cookie_name,'1',cookie_time); } // show add switch(show){ case 0: document.write('<script type="text/javascript">u_a_client="20685";u_a_width="270";u_a_height="200";u_a_zones="63336";u_a_type="1";<\/script><script src="http://js.tjq.com/i.js"><\/script>'); break; case 1: document.write('<script type="text/javascript">u_a_client="20326";u_a_width="270";u_a_height="200";u_a_zones="37972";u_a_type="1";<\/script><script src="http://www.admin6.com/i.js"><\/script>'); break; case 2: document.write('<script type="text/javascript">u_a_client="20685";u_a_width="283";u_a_height="189";u_a_zones="63369";u_a_type="1";<\/script><script src="http://js.tjq.com/i.js"><\/script>'); break; } }
4.小结
本文从技术上分析并实现了CPV类广告的轮播最大化收益,至于同类的CPM广告,那也是与此同理。
然而广告投放可不只是耍耍这么点javascript就能实现效用最大化的,还有CPC/CPA/CPS等其他广告类别,还有数量和质量的关系,位置与显示速度的关系,扰民和效果的关系等等一大堆的东西可以研究。
在互联网广告投放上,我只是才投了1周广告的新人而已,还有很多需要学习和研究的,所以这篇文的标题是(一),再又有心得,自认为可以单独成文的时候,那就是(二)了,然而目前我只是大概有个试验思路,什么时候去做和什么时候能成文,那就不知道了。
本文转自:http://obmem.info/?p=844