※ 引述《t7yang (t7: 我认为这是一种背叛)》之铭言:
: karst10607:我不可能不用adblock plus,只能期待它们做得更好了
除了启动时adblock plus的js占用的100MB内存消耗,
每个网页adblock plus会再插入额外的css样式,
每个iframe会再增加大约4MB的使用量。
mozilla举了例子,例如 http://techcrunch.com/ 这个网页,
不开adblock plus的话,Fx使用194MB的内存,
开启adblock plus的话,内存消耗会快速增加到417MB。
只是为了隐藏几个网页的元素(广告),竟然必须付出多一倍的代价。
原来挡广告有一部份原因是为了节省显示广告的资源,
结果可能没省到资源,反而必须付出更多的代价。
mozilla举的另一个例子,下面这个网页有上百个iframe,
http://ppt.cc/2P8g
我开启adblock plus的话,Fx会吃掉超过2GB的内存,
而且网页加载速度变得会非常非常慢,Fx最后完全失去回应。
挡广告除了adblock plus,还有Bluhell Firewall套件,
http://ppt.cc/rrVC,据说比较轻量,不会消耗太多资源,
不过我没有用过。
其他还有非浏览器套件类,而是对整个系统所有浏览器
和程式都有过滤效果的本地代理去广告软件,
例如Ad Muncher、Adguard等等。
Ad Muncher有持续维护和更新的中文规则,但是主程式已经很久没有更新了,
不能过滤IE11,还有不能过滤https。
Adguard可以过滤IE11也可以过滤https,
可是程式占用的内存太夸张,
主程式要100MB,服务也要用掉100MB,加起来200MB,
没有比adblock plus省到哪里去。
比较轻量的方案是用Privoxy或Proxomitron,
原理是一个本地的代理服务器,浏览器的网络连线先进入
Privoxy程式,由Privoxy过滤后才传出传入,
大部分可以在广告下载前就先挡掉,而不是浏览器加载后再用css隐藏,
可以真正节省网络流量和浏览器使用的内存,
而且运作效率非常好,网页加载完全不会有迟钝感。
Privoxy和Proxomitron的规则写法比较复杂,
不过有把adblock plus的规则转成Privoxy规则的script,
虽然有一部份的规则不能很好的转成Privoxy用的规则,
不过大致上还可以用,也就是几乎等于使用adblock plus的挡广告效果,
可是内存使用量远远比adblock plus低。
如果觉得改写规则很麻烦,对岸有一个改写自Privoxy的挡广告程式
adbyby
http://www.adbyby.com/
目标是高效率和轻量化,可以在多种系统或路由器上配置。
adbyby可以直接使用adblock plus的规则,
到adblock plus的list网页上
https://adblockplus.org/zh_TW/subscriptions
把规则的txt抓下来复制贴上取代adbyby资料夹下原本的lazy.txt,
并且把lazy.txt设成唯读避免程式自动更新规则,
或者是把adhook.ini里面的
[update]
rule=lazy,video
这一行的lazy去掉,让程式不要自动更新lazy规则。
部分adblock plus规则直接套用会造成误杀,
不过大部分都能正常过滤,
可以自己定义过滤规则,使用adblock plus的格式写在user.txt。
adbyby没有开放程式码,请小心斟酌使用,此类软件具有极高度的风险。
Ad Muncher的主程式使用内存大概30MB,
adbyby则是14~20MB,使用adblock plus的规则的话,
过滤效果和adblock plus一样,但是开启上面那个ifrmae超多的测试网页,
Fx使用的内存从2GB失去回应,降到正常的400~500MB,
而且加载速度变快很多。
不过这些过滤软件还有一个缺点,那就是不能过滤https,
可是像youtube有登入帐号的话会强制使用https连线,
不能过滤https就会看到影片广告。
像这种https过滤,可以使用自动代理设定pac来挡掉,
像下面这样写一个pac
function FindProxyForURL(url, host) {
if (shExpMatch(host, "ads.youtube.com") ||
shExpMatch(host, "s0.2mdn.net") ||
shExpMatch(host, "s1.2mdn.net") ||
shExpMatch(host, "googleads.g.doubleclick.net") ||
shExpMatch(host, "ad.doubleclick.net") ||
shExpMatch(url, "http*://www.facebook.com/plugins/like_box.php?*") ||
shExpMatch(url, "http*://www.facebook.com/plugins/recommendations_bar.php?*"))
return "PROXY 8.8.8.8:53";
else
return "DIRECT";
}
存成例如adblock.pac,然后在Fx的网络设定选“Proxy自动设定网址”,
file:///C:/firefox/profiles/adblock.pac
就可以挡掉youtube的影片广告。
这个pac的作用是当连到上面这几个google的广告服务器时,
会经过我们设定的代理服务器,而这个代理服务器是无效的,
所以不会成功传回这些广告,广告就被我们挡掉啦。
这种故意设定的无效的代理服务器称为blackhole proxy,
可以设定为127.0.0.1:3421等等,各种不存在的代理。
上面是仿照webblock设为8.8.8.8:53,
大家知道这是google的DNS服务器,从各地连都很快,
而且这个服务器不支持http连线,所以我们的请求会立刻断线,
很快就传回断线讯息,正好符合我们blackhole proxy的需求!
除了利用google的DNS以外,也可以用blackholeproxy.exe
或类似的程式,在本地建立一个blackhole proxy,
传回一个1x1的透明gif,取代原本的断线讯息。
用pac比直接改host的好处是写法弹性比较大,
添加新规则后重起浏览器就可以更新作用。
不过像上面这种一个一个匹配规则的写法,几个几百个是没关系,
如果规则多到几千个,整个运作效率就会变得很差。
例如把adblock的list直接转成pac,多达几千行的匹配规则,
整个加载速度反而会变慢,这时需要比较好的匹配判断写法,
可以参考goagent或shadowsocks的pac写法,运作效能会比较好。
如果使用Privoxy+adblock plus list的话,就不需要几千行的pac,
因为大部分广告都会被adblock plus的规则挡掉,
只有少数https的广告需要另外写进pac里,所以不用担心这个问题。
使用这类软件还有其他缺点,例如可能ipv6无法正常连线等等,
如果系统内存不缺乏的话,其实让adblock多吃一点内存是无妨,
只是运作效率还是有很大的进步空间,只能期待adblock plus的开发团队
和Mozilla携手合作,一起改善adblock plus的执行效率和消耗的资源。