开始抓yixun.com的商品信息,开始很开心,但一下子来了问题。
http请求回来的商品分类条目用<a href=>, 但这个href不能直接使用,因为页面加载之后会启动js程序(一般都是jquery)对页面element进行配置和处理,例如:设置风格、事件等等。
yixun玩了个防页面过期的小技巧:
>每个请求page在server都会产生一个有效期变量XY(具体算法不详),
>如果获取商品<a>直接请求,server将返回失败,因为<a href>并未包含XY
>page加载完成之后js代码设置<a>被点击时触发事件E,E将XY添加到<a href>内
>然后可以正确请求了
易迅防止请求页面过期,在主页中设置了一下参数:
<script type="text/javascript"> window.yPageId = '17384560'; window.yPageLevel = '2';</script>
在页面内容中显示
<a ytag="40037" href="http://searchex.yixun.com/705938t705942-1-/" target="_blank">路由器</a>
注意: 返回的html就是如此
但如果用户点击(左键或者右键)此 node对象时,js代码会动态插入一个YTAG的变量
未点击:
<a ytag="40037" href="http://searchex.yixun.com/705938t705942-1-/" target="_blank">路由器</a>
点击:
<a ytag="40037" href="http://searchex.yixun.com/705938t705942-1-/?YTAG=2.1738456040037" target="_blank">路由器</a>
变量生成方式在这个js中实现:
此js 使用了jquery,页面完成加载之后,将配置页面元素的onclick行为,如果点击了页面元素,将YTAG属性加入到商品<a href=""/>中去
js代码凌乱可以使用:
进行格式化观察
js代码:
G.header.search = { init: function() { G.header.search.event(); G.header.search.setInputStyle(); G.header.search.autoComplete(); },G.header.search.init();query: function() { var input = $("#q_show"), v = $.trim(input.val()), c = $("#cate_show").val(), ret = true, href = input.attr("_href"); if (v === G.header._Q_SHOW_DEF_TEXT && href) { window.location.href = href; ret = false; } else if (v === "" || v === G.header._Q_SHOW_DEF_TEXT) { if (!c || (c && c == "")) { input.focus(); ret = false;
} } if ($('#q_show').parents("form").find('input[name="YTAG"]').length === 0) { var ytag = $('#q_show').parents("form").find('input[type="submit"]').attr("ytag"); var YTAG = (window.yPageLevel || 0) + '.' + (window.yPageId || 0) + ytag; $('#q_show').parents("form").append($('<input type="hidden" name="YTAG" value="' + YTAG + '" />')); } return ret; }
程序定义了G.header.search对象,并进行初始化init() ,query()是用户点击查询时触发使用
init()内部配置了query函数,用于鼠标点击时候生成YTAG属性
看代码就很简单了
YTAG生成方式就是 window.yPageLevel+'.'+window.yPageId + <a ytag="40037">
这样一个商品条目的href就获得了