自编网页瘦身通用规则

普遍适用的规则分享、讨论

Moderator: phoenix

Post Reply
nepter
Posts: 30
Joined: Jan 14 2009, 15:36

自编网页瘦身通用规则

Post by nepter »

读了sidki后,自己又编了了个给网页“瘦身”的规则,请看怎么个瘦身法。

背景:瘦身网页是为了节省流量,用google mobile虽然流量省了但网页布局也改变了,所以想如何不改变布局的情况下把无用的信息给屏蔽了。由于网页体积大副增加的罪魁祸首是大量image、js和iframe,有时候有些广告文件名不包含adkey,px也无法判断其是否为广告;又因为有些内容虽然被隐藏了,但里面的图片仍然会被加载,并不省流量。基于这三点考虑,故我想如何编写个规则,把有用的信息留下,无用的元素挡在px之外。

基本思路:头文件判断是否是需要瘦身的网页,并定义变量。倘若网页如下所示:

Code: Select all

<body>
<div id=ad1>广告</div>
<div id=wrap>
	<div id=ad2>广告</div>
	<div id=content>正文</div>
	<div id=ad3>广告</div>
</div>
</body>
其中“正文”是需要保留的,其它广告里能删则删,能隐藏就隐藏。
那么我们可以对div进行判断来采取措施,规则中我设置了ifslim变量,当px扫描到ad1时,ifslim赋值1,即slim功能打开,从ad1开始全部删除,接着px扫描到wrap,ifslim赋值0,停止删除,接着扫描到ad2,slim功能再打开,接着扫描到content,slim功能关闭,最后扫描到ad3,slim功能打开。归纳下就是,遇到ad1、ad2、ad3时slim打开,遇到wrap、content时slim关闭。我们可以设立个blocklisk,把那些需要slim的网页和和id标志放进去。
这样我们就可以在保留content的同时,把广告全部删除。

规则如下:

Code: Select all

[HTTP headers]
In = TRUE
Out = FALSE
Key = "IF-slim:     slim web"
URL = "([^/]+//|)$LST(slim)$SET(FLT=slim)$SET(ifslim=0)$STOP()"

[Patterns]
Name = "===== slim ====="
Active = FALSE
Limit = 256
Match = "^?"

Name = ".+slim div"
Active = FALSE
Multi = TRUE
URL = "$TST(FLT=slim)"
Bounds = "<div [^>]+>"
Limit = 256
Match = "(*\s(id|class)=$AV(\0)*)\1>($TST(adk1=*.$TST(\0).*)$SET(ifslim=1)PrxFail$TST()|"
        "$TST(adk2=*.$TST(\0).*)$SET(ifslim=0)|"
        "$TST(ifslim=0))"
Replace = "\1 style="display:none !important;">"

Name = ".+slim script in div"
Active = FALSE
URL = "$TST(FLT=slim)"
Bounds = "<(/|)script[^>]+>"
Limit = 256
Match = "$TST(ifslim=0)\1script*"
Replace = "\1script>"

Name = ".+slim stuffs in div 1"
Active = FALSE
URL = "$TST(FLT=slim)"
Bounds = "<(img|iframe|embed)[^>]+>"
Limit = 256
Match = "$TST(ifslim=0)\#src=@AV(\0)\#"
Replace = "\@"

Name = ".+slim release"
Active = FALSE
URL = "$TST(FLT=slim)"
Limit = 256
Match = "^(^</html>)"
Replace = "$SET(FLT=)$SET(ifslim=)$SET(adk1=)$SET(adk2=)"
其中$LST(slim)是blocklist,下面是blocklist sample

Code: Select all

*.sina.com.cn/[^/]++/(^index).(htm|html|shtml)$SET(adk1=.wrap.content.)$SET(adk2=.ad1.ad2.ad3.)
当然要和sidki兼容,只需增加从body开始执行规则就行了
ddbb
Moderator
Posts: 425
Joined: Jan 07 2008, 13:30

Re: 自编网页瘦身通用规则

Post by ddbb »

又因为有些内容虽然被隐藏了,但里面的图片仍然会被加载,并不省流量。
这个好像是和浏览器有关的.....最少opera是不会下载display:none 里的图片的
User avatar
phoenix
Site Admin
Posts: 526
Joined: Dec 29 2007, 16:27

Re: 自编网页瘦身通用规则

Post by phoenix »

nepter wrote:

Code: Select all

Name = ".+slim div"
Active = FALSE
Multi = TRUE
URL = "$TST(FLT=slim)"
Bounds = "<div [^>]+>"
Limit = 256
Match = "(*\s(id|class)=$AV(\0)*)\1>($TST(adk1=*.$TST(\0).*)$SET(ifslim=1)PrxFail$TST()|"
        "$TST(adk2=*.$TST(\0).*)$SET(ifslim=0)|"
        "$TST(ifslim=0))"
Replace = "\1 style="display:none !important;">"
以这条规则来说,只有 ifslim=0 时才会匹配,而 $TST(adk1=*.$TST(\0).*)$SET(ifslim=1) 对后面代码的执行好像没有任何意义?换言之,我在 blocklist 中写或不写 $SET(adk1=.wrap.content.) 都可以得到相同的结果?只检查黑名单的话,sidki 的规则包已经有这个功能了吧。
Bonnie
Moderator
Posts: 165
Joined: Oct 05 2008, 01:27

Re: 自编网页瘦身通用规则

Post by Bonnie »

我觉得这样弄挺麻烦的。直接给网页加载一个inline css把需要的div都设置display:none不就可以了吗。
nepter
Posts: 30
Joined: Jan 14 2009, 15:36

Re: 自编网页瘦身通用规则

Post by nepter »

phoenix wrote:只有 ifslim=0 时才会匹配,而 $TST(adk1=*.$TST(\0).*)$SET(ifslim=1) 对后面代码的执行好像没有任何意义?换言之,我在 blocklist 中写或不写 $SET(adk1=.wrap.content.) 都可以得到相同的结果?只检查黑名单的话,sidki 的规则包已经有这个功能了吧。
我把ifslim设为0或1是为了另外两条规则服务的,ifslim就是个控制变量,0时div显示为none并且可以删除图片js和iframe,1时就不删除。网页中往往有用的信息集中在以前,广告其中在一起,这个规则的好处就是不用把每条广告的adkey都记录在blocklist里,只要记录头和尾就行。

下面是我收集的blocklist

Code: Select all

#$SET(adk1=)$SET(adk2=)#
#adk1=begin,adk2=end#
#adk=.word1.word2.#

###news website###

#sina#
(news|sports|finance|tech)*.sina.com.cn$SET(adk1=.wrap.page.Main.blkContainer.blkContainerPblk.blkContainerSblk.)$SET(adk2=.linkQuickJump.topNav.blkComment.comment_t_vb.)

#163#
(news|money).163.com$SET(adk1=.endArea.)$SET(adk2=.endYoDao.)

#tom#
*.(sports|news).tom.com$SET(adk1=.postwrap.PrintTxt.)$SET(adk2=.mix.footer.)

#Chinanews#
www.chinanews.com.cn$SET(adk1=.all.)$SET(adk2=.left_name.)

#QQ#
*.qq.com$SET(adk1=.Main-Article-QQ.)$SET(adk2=.mod-left AdBox-Article-QQ a-AdBox-Article-QQ.ft.)

#sohu#
(news|sports).sohu.com$SET(adk1=.contentA.)$SET(adk2=.baiList clear.)

#ifeng#
finance.ifeng.com$SET(adk1=.main.)$SET(adk2=.webSjzw.)

#qianlong#
*.qianlong.com$SET(adk1=.qianlong.)$SET(adk2=.Recommendation.)

#people.com.cn#
*.people.com.cn$SET(adk1=.content.)$SET(adk2=.p_editor.)

#hexun#
*.hexun.com$SET(adk1=.wrap.)$SET(adk2=.wantsay.)

#CCTV#
(news|sports|finance).cctv.com$SET(adk1=.page_body.)$SET(adk2=.title_list_box title_type_02.)

#xinhuanet#
news.xinhuanet.com$SET(adk1=.Title.)$SET(adk2=.headnews.)

###software website###
www.xdowns.com$SET(adk1=.bd3.)$SET(adk2=)

www.pconline.com.cn$SET(adk1=.wrap.content.)$SET(adk2=.adv_top.box2 mt10.)

*.skycn.com$SET(adk1=.mass.col12.downUrl.)$SET(adk2=.crumbs.ad4.reviews)

*.crsky.com$SET(adk1=.container.main page-detail.col-right.section-content.section appmirror.)$SET(adk2=.header.col-left.section appwarning.ordertools.box.)

*.(newhua.com|onlinedown.net)$SET(adk1=.wrap.content.con970.down-url.)$SET(adk2=.header.a970.hspace.ad.)

###finance website###

#caijing#
www.caijing.com.cn$SET(adk1=.centess960.)$SET(adk2=.lnewlist.)

#eastmoney#
finance.eastmoney.com$SET(adk1=.mainBox.)$SET(adk2=.tg_hot_text.)

#cfi#
www.cfi.net.cn$SET(adk1=.tdcontent.)$SET(adk2=.adbottom.)

#cs#
www.cs.com.cn$SET(adk1=.lay_985 page_bg.)$SET(adk2=.lay_258.)

#baidu stock#
stock.baidu.com$SET(adk1=.hbwrap.bh_contentLeft.)$SET(adk2=.bh_head.editor.)

#cnfol#
*.cnfol.com$SET(adk1=.main.)$SET(adk2=.Statement.)

#wsj#
cn.wsj.com$SET(adk1=.content.)$SET(adk2=.commenttext.)

#eeo#
www.eeo.com.cn$SET(adk1=.main.)$SET(adk2=.content_tool.)

#ftchinese#
www.ftchinese.com$SET(adk1=.fullbody.bodywrapper.)$SET(adk2=.topadcontainer.story_list.)
这规则也有个缺点,当网页的结构发生变化时,所记录的adk1和adk2就可能不适用当前的网页,就必须重新打开firebug找特征key,确实比较麻烦,现在我也不用了。还是用google wap比较省心, :D

这方法也是看sidki时得来的,sidki用keyword来控制各个功能的运行,其形式也是.word1.word2. ,这样好处是可以随意增减字符段来作为控制变量。我这只是个小小运用,当然繁琐是肯定的,就像我看sidki头痛一样。
Post Reply