是谁害死了小布托?

12月 28th, 2007 by kyfwcn

是谁害死了小布托?
如果透过种种表象,我们最终可以发现是美国。
美国从最开始的阿富汗战争培养(资助)了塔利班,为了对付当时的苏联。苏联解体,塔利班成了麻烦,而美国不是采到政治手段化解,坚持以武力解决,从后来的阿富汗战争到伊拉克战争,美国穷兵黩武,但塔利班和基地组织没有得到削弱,反而加强了。为了打击恐怖组织,美国向巴基斯坦施压,不考虑巴国的现状,甚至威胁如果巴基斯坦不配合,要把巴基斯坦炸回石器时代,还不断叫嚣着要亲自派美军进入巴境内打击恐怖组织,激起了巴国人民普遍的反感和反对,巴国人民对美国是憎恶的。
在巴大选来临之际,美国又用其扶植的小布托与巴总统、陆军参谋长分权,逼穆脱下军装,名曰增强民主,其实就是扶植亲美势力,以期保证美国的利益。
小布托是一个悲情的人物,投入美国的怀抱,却成了美国利益的牺牲品。

Posted in 新闻, 评论 | No Comments »

如何看待巴基斯坦这个国家?

12月 28th, 2007 by kyfwcn

吉戈/最近巴基斯坦的国内政治引发了国际社会的极大关注,局势复杂多变。如何看待巴基斯坦这个国家,我认为应从几个侧面解剖。
巴基斯坦像六个伊斯兰教国家:像中东的埃及,有一位带有军人背景的总统,埃及总统穆巴拉克过去是军人,而巴基斯坦总统穆沙拉夫不久前还是四星上将和陆军参谋长;巴基斯坦像土耳其,有比较成熟的世俗社会,军队在国家政治中有比较大的影响力和权力;巴基斯坦像伊朗,有比较强大的宗教极端势力和宗教政党,而且宗教政党在国家中的地位也很特殊;巴基斯坦像伊拉克,历来有什叶派和逊尼派的伊斯兰教派冲突;巴基斯坦像阿富汗,有非常强大的部落武装和部落矛盾;巴基斯坦还像沙特阿拉伯,遍地都是宗教学校,宗教教育在许多地区的影响力远远超过世俗教育。
此外,它又与四个非伊斯兰教国家相像。巴基斯坦像印度,百分之七十五的巴基斯坦人接受了印度文化,乌尔都语实际上与印地语同出一源;巴基斯坦像英国,所有的政治制度都是仿照英国的,这大概是旧殖民主义的残余;巴基斯坦像(向)美国,它是美国的非北约盟国,巴基斯坦像(向)中国,与中国的关系可谓是比喜马拉雅山高、比阿拉伯海深全天候战略合作关系。
其次,巴基斯坦国内有五大政治势力和五大矛盾。所谓五大政治势力是指军队势力、宗教势力(宗教政党联盟)、人民党势力(代表信德省大地主阶级的利益和旁遮普省以及其他两省的中产阶级和专业人员利益)、穆盟(谢里夫派)(代表旁遮普大工商资产阶级利益)、穆盟(领袖派)(代表巴基斯坦旁遮普省工商资产阶级利益,是执政党,也是穆沙拉夫总统的主要依靠力量)。巴基斯坦政治基本上是围绕着上述五大政治集团之间的角逐运行和演变的。此外,还有类似像移民运动(代表印度移民)、普什图人民党等小党,这些小党不具备全国影响力。
所谓五大矛盾就是宗俗(宗教与世俗)、军民(军队与民选政府)、朝野(执政党与反对党)、司政(司法与行政)、中地(联邦政府与地方政府或部落)矛盾。往往一个时期,一种矛盾上升为影响全国政治的主要矛盾。比如今年一月和六七月,由于红色清真寺事件,所以宗俗矛盾一度为主要矛盾,三月和八月,由于大法官被软禁后又被平反,所以司政矛盾为主要矛盾,而九月份谢里夫的无功而返,则最集中地体现了朝野和军民矛盾,而现在贝·布托回国遭遇恐怖袭击,则既体现了宗俗矛盾激化,也侧面地反映了朝野矛盾和军民矛盾。
巴基斯坦与美国的关系“从辈分”上讲要低,美国一直对巴基斯坦不信任,既把巴基斯坦当作反恐盟友,同时也把巴基斯坦当作恐怖策源地,而且美国对巴基斯坦有点像“后娘”对继子的味道,一方面利用,另一方面又限制和改造。巴基斯坦一方面要“听美国的教导”,一方面又要“挨美国的棒槌”。
(《新京报》,原标题为《巴基斯坦多重政治矛盾待决》)

Posted in 新闻, 网摘 | No Comments »

恋爱中的女人是瞎子 最著名的12个失身女子

12月 24th, 2007 by kyfwcn

 

例一:不过如此——祝英台

梁祝可谓是中国历史上最凄美的爱情故事,

因为它不是墓穴阴森森地合上,故事就带着凛冽之气地结束,它化了蝶,象征着高尚的爱情挣脱封建主义牢笼,以另外的方法获得自由,双宿双飞去。这个开放式的尾巴使整个故事变得抒情而唯美,无限开拓了想象空间。

整个梁祝的故事,其实是祝英台一人在独撑,而梁山伯更像是芭蕾舞中的男伴,起的是烘托作用。要么是祝英台演技太好,要么是梁山伯实在迟钝。三年来,对于祝英台的性别从不怀疑,十八里相送时,祝英台的种种借物喻人,都像是对牛弹琴,搞不好,梁山伯还以为祝英台有断袖之癖。

其实马文才也很委屈,他连面都没露,就成了第三者,在他人生中最美好的一天,妻子竟跳进了别人的坟墓,叫他怎么不郁闷。

梁祝这样的悲剧是肯定不会再有了,现在的女子有了更多的自由,求学的,工作的,婚嫁的,想要嫁给男子,也没有封建主义这座大山压着,而父母的权威性也沦落为参考意见。可我们这些祝英台真的如愿以偿嫁给了梁山伯,却苍凉地发现,其实梁兄不过如此。

案例二:燕子楼的悲剧——关盼盼

关盼盼原是徐州名妓,后被徐州守帅张愔纳为妾氏。白居易远游徐州,张愔设宴款待他,席间,还让宠妾关盼盼歌舞助兴,白居易大为赞赏关盼盼才艺,写下了“醉娇胜不得,风嫋牡丹花”一诗。

两年后张愔病逝,姬妾们作猢狲散,只有关盼盼难忘恩情,移居旧宅燕子楼,矢志守节,过着与世隔绝的生活,一晃,十年过去了。

白居易听闻了关盼盼守节一事,认为她既已坚持这么久,何不索性以死殉夫,留下贞节烈妇的名声,成就千古美谈呢。于是提笔作诗,托人转交关盼盼——黄金不惜买娥眉,拣得如花四五枚,歌舞教成心力尽,一朝身去不相随。

关盼盼看到这首诗,立刻大哭一场。她之所以不死,是唯恐别人误会张愔自私,让爱妾殉身,反辱没了张愔名声,所以苛延残喘,偷生了这些年,而白居易竟以诗作讽,逼她殉夫,怎不悲愤?性情贞烈的关盼盼在十天后绝食身亡。

关盼盼也是死于扼杀过阮玲玉的那四个字——人言可畏。随着时代的发展,女人已经越来越不惧流言袭击,比如璩美凤、木子美。

走我的路,让白居易说去.

案例三:找到那棵树——红拂

仅有一双妙目是不够的,须得像红拂那样,目光如矩,一抬眼就能识辨庸才与英雄。红拂,隋末唐初的奇女子,出身风尘,却身居一品诰命,这般的直上青云,恐怕泱泱数千年,只有她一人做到了。

当然,红拂的美丽也功不可没,如果不是美女,深更半夜去敲陌生男子的门,他怎么肯冒着被杨素追杀的风险收留?如果不是美女,大丈夫虬髯客怎么会惊艳一场,以致于不能自拔,还对李靖爱屋及乌?

一个女人,既美丽又聪明仍然不够,像柳如是,那么的人秀于群,还是不得善终。她也曾像红拂那样大胆追求真爱,走到钱谦益面前去。从某种程度上说,嫁人,就是嫁给了一种命运。

一个有智慧的美女,如果不想下半辈子太凄凉,那么,她的最大任务就是找到那棵树。

案例四:红杏出墙——步非烟

唐朝美人也不尽是丰满型,也有步非烟这样轻盈纤弱的,步非烟工于音律,精通琵琶,更敲得一手好筑,堪称当时一绝。

步非烟由父母作主,嫁给了河南府功曹参军武公业。武公业身为武将,虎背熊腰,性情骠悍。与心思细腻的步非烟完全是两种人,根本无从沟通。故而,步非烟经常郁郁。

有一日,她在院中赏花,神情萧索,柳眉微蹙,正好被隔壁舞剑时腾跃而起的赵象瞥见,赵象年方二十,长相俊秀,正在家里攻读科举课业——他的朗朗读书声,也曾掠过步非烟的心波,使她伫足墙下,凝神细听。

惊鸿一瞥后,赵象再不能忘记步非烟,他重金买通武家的守门人,恳求转达渴慕之情。守门人让自己的妻子去试探步非烟口风。赵步两人经仆人之手,对诗数首,定了情分。终于,机会来了,武公业在公府值宿,赵象逾墙而过,自此之后,武公业不在家过夜,赵象便与步非烟欢会。

就这么过了两年,事情再也瞒不住了,风声传到了武公业的耳中,他拷打守门人妻子,逼她道出始末。强压怒火,佯称值宿,伏于墙下,于二更时分抓住了赵象一片衣角,赵象本人跌回自家院落。武公业冲回房内,对正在梳妆打扮的步非烟怒吼,步非烟见事情败露,淡淡说了句,生既相爱,死亦何恨。武公业扬起马鞭,活活打死了步非烟。最后,以暴疾而亡的名义葬了她。

整整两年,作为一个男人,满足于这样的偷情之中,无所作为,甚至连私奔的念头都没有,私奔是要付出代价的。

他不知,那女子淡定从容,不置一辩,任凭毒打,始终不开口求饶,承担了这场孽情所有的悲哀与不幸,她用自己的生命赎了罪。

案例五:永不原谅——霍小玉

霍小玉是唐朝的歌舞伎,那年,十六岁,喜欢上了李益的诗,李益状元及弟,正在等待官职。长安城中,才子佳人初初邂逅,一见钟情,说不尽的缠绵,道不尽的缱绻。

而后李益负心,霍小玉将死,长安城人人皆知,有一黄衫客,路见不平,将李益架到了霍小玉门口。霍小玉抱病起身,泼酒在地,以示覆水难收,然后,说出了那句凄厉的诅咒——我死之后,必成厉鬼,使君妻妾,终日不安。

历来弃妇总是悄无声息的死,比如苏小小,崔莺莺,就算杜十娘,也不过是抱了一大堆金银珠宝自寻短见,不曾想过要报复谁。

霍小玉不是,她以命相酬,但绝不自认倒霉,善罢干休。亦没有像三流小说那样,见到情郎来了,回光返照之际,头上笼一层圣洁的光,原宥他的背叛,体恤他的难处,十指交握,约定来生再聚,凄美地死去——比如张国荣最后一部电影《异度空间》,正是女鬼念及旧情,放弃了索命。

原谅,这么一个高尚伟大的词,不是那么廉价的,比如《被侮辱的与被损害的》一书中,有原谅,也有永不原谅,这与自尊有关。

案例六:识人不明——杜十娘

杜十娘是一个美丽而工于心计的女人,不然,无法在七年货腰生涯中悄然积下如此巨资。她本来就是京中名妓,怎样骗男人是她的拿手好戏,当她有本钱从良时,将终身托付给了老实人李甲,可偏偏就是这个怯懦无能的男人,给了她最狠的一刀。在孙富的几句浮言下,就客串了人贩子,把刚刚获取自由的她,重新推向火坑。

这是她平生最看错的一个人,也是最致命的。这场怒沉百宝箱的悲剧,本可以避免,只消她打开箱子,李甲的嘴脸马上会转变。可是她没有,她选择了玉石俱焚的结局,因为心碎,因为绝望,不想再活了。

杜十娘曾经如此接近过幸福,她计划浮居苏杭,逍遥度日,她什么都有了,金钱,自由,青春,爱情——只可惜,她的爱情是假象。面对李甲的背叛与残忍,已不愿抗争,洞悉了人性的丑陋与自私,曾经步步为营小心谨慎的杜十娘选择了死亡。

遇人不淑是女人最大的不幸,而识人不明更是主动犯下的错。无论时代怎么进步,,依然会看错人,选错郎,因为,恋爱中的女人是瞎子。

案例七:嫁与富贵——绿珠

一直以来,晋代的梁绿珠都得到了很高的评价。石崇为她得罪了孙秀,四面楚歌之际,她纵身一跃,以酬石崇。这样的贞烈,连士大夫也不一定能做到,比如洪承畴、钱谦益。

绿珠是白州人,石崇去越南出差途中,带回了她,身价明珠十斛,擅吹笛。彼时石崇已是微微发福的中年人了,当然,他也非碌碌之辈,二十多岁就当上县令,在荆州做刺史时,瞅准机会,靠劫掠富商而暴发。从此过上了挥霍糜烂的生活,天天开PARTY,纵情声色,结交权贵,是上流社会的中坚分子。

但后来,石崇的靠山陆续倒了,而敌人司马伦却掌握了实权。在那么关键的时候,司马伦的心腹孙秀反复索要绿珠,石崇仍然坚拒。

整个故事里,最无辜的就是绿珠本人,她什么也没有做过,只是天生丽质,天姿聪颖,随石崇来到长安,死心踏地伺奉主人。她是一只金谷园里的笼中鸟,没有自由,连死都是石崇所暗示的。他们都说,这是以死报答石崇之恩,有什么恩呢?享了几年福,然后香消玉殒,倒不如在白州无拘无束,嫁一个人,过平静安稳的日子。

嫁与富贵权势,不一定是幸事,比如戴安娜王妃。

案例八:只羡鸳鸯不羡仙——白素贞

故事发生了苏杭,西湖,断桥,烟雨。百年修得同船渡,然后,以一柄伞延续了邂逅,再然后,做了人间夫妻。

白素贞的梦想很简单,只不过是做一个寻常的人,她本是妖,如果努力,是有可能修炼成仙的。成仙,是多少妖精梦寐以求的事,但白素贞对许仙一见钟情,竟摒弃了光明大道委身做人。

但最终素贞死在心爱男人的手里,现出原形时,兀自昂头看着许仙——是什么样的眼神呢?在这桩传奇里,雷峰塔起先只是法海令人搬砖运石所砌,后来,许仙化缘,砌成七层宝塔,将白素贞永镇塔底。

不过是爱一个人,却被他亲自修理。曾对他百依百顺,温柔体贴,一心做他贤淑的妻,在其他版本里,甚至怀了身孕,白素贞的付出是勇往直前的,便为他冒犯天条又如何?

可许仙,犹豫,惊慌,防范,最后终于要躲避了,也许并不能一味指责许仙,换作任何男人,都不能明知是妖,仍恩爱如常。比如《聊斋》里那些书生与妖,相爱一场,但从来就没有结局,所谓道不同不相为谋,只可视作午夜艳遇,天亮说分手。

除非爱得很深,很深,深到不忌讳非我族类,深到无论你是什么都一样,深到恨不得我亦是妖,与你共背了罪。

妖不知道,想得到一个男人的真心,是多么困难,纵然给了他全世界,他还是会嫌你出身不好。

那一日,在断桥,白素贞选错了人,或者说,错的是她自己,她没有妖的决绝,竟有人的痴缠。

案例九:鱼玄机的杀气——鱼玄机

鱼玄机,字幼微,晚唐女诗人,出身寒微,十六岁嫁与李亿为妾,为其原配裴氏所不容,只得入咸宜观修行。李亿携裴氏转赴扬州任官后,鱼玄机在墙上贴一纸公告,鱼玄机诗文候教。从此大开艳帜,咸宜观车水马龙,她本人从弃妇变成了荡妇,过上了半娼式的生活。

鱼玄机在诗的名义下,结交权贵名士,如温庭筠、李郢,艳名远播,但命运随即出现悲剧性的转变,她怀疑侍婢绿翘与情夫陈韪私通,笞杀绿翘,埋于后院的紫藤花下。

在某个夏夜,有人发现苍蝇聚于花下浮土,暗召官衙勘查,事情败露,二十四岁的鱼玄机亦被处死。

女诗人不过廖廖几位,而手染血迹以身试法的只有鱼玄机。是什么使一位曾饱受正室欺凌的弱女子,变成对侍婢痛下杀手的悍妇,是什么使才貌双全的鱼玄机,一瞬间血脉贲张,理智全失?

遭受了个人生活的种种不幸,鱼玄机性情中的恶已经被激发,她残忍,狂暴,压抑——诚然,开门纳客,看上去更自由,但女人真正想要的,绝不是频换舞伴的自由。她不甘心长伴孤灯,无声无息地过,于是,走上烟花路。

鱼玄机短短一生并没有很好的爱情,李亿已老,且惧内,裴氏虐待鱼玄机时,他并没有挺身佑护,鱼玄机甚至无法在丈夫的羽翼下,做一个面目模糊的女人——像大多数妾氏那样。

女人,特别是鱼玄机这样美丽且聪明的,一旦感情受挫,难免会偏激,乖戾,对生命充满了憎恶,这是极端的自暴自弃,也是带有自毁性质的怨恨,一经触碰,便转化成腾腾的杀气。

案例十:十八春——王宝钏

女人能有几个十八年呢,最好的时光怎么过的呢?

王宝钏,唐代的著名牌坊,被男权社会用虚无的光环,借以掩饰自私与卑劣。

隐隐有一种声音在浮现——女人要像王宝钏那样,十八年保持同样的姿势,一定会有苦尽甘来的那一天。

王宝钏的结局是传统式的大团圆,与薜平贵夫妻相认,和代战公主共事一夫,简直就是千古美谈——可惜,十八天后,王宝钏死了,没能将这种虚伪的美满进行得更为天长地久。

而这十八天的荣华富贵,对薜平贵来说,是卸下了良心上的一个枷锁,如果他还有良心的话。

他们都说,王宝钏挣脱了封建牢笼,反抗家长权威,追求自由爱情,可歌又可泣。我觉得,歌就不必了,泣倒是必然的。怎么不哭呢,以为自己找到了良人,却误了终生,他确实成了气候,但不属于她,她牺牲了自己,到头来,不过是场梦。

她的死,绝对不是愿望得偿后的含笑合眼,而是,发现自己坚守的信仰可笑地碎了。

现在,仍然有留守女士的悲剧,赠了钱财送情郎去他国求学,一年半载后,那边捎话来,对不起,我有了新欢,你不必再等。

案例十一:始乱终弃——莺莺

写下“曾经沧海难为水,除却巫山不是云”这一名句的是才子元稹。我要说的是以元稹为原型的《莺莺传》,与王实甫改写的才子佳人大团圆的喜剧不同,这是一出元稹始乱终弃的悲剧,更让人不齿的是,元稹还在文章里为自己开脱。他说莺莺是尤物,不祸害自己,定祸害别人。我只有克服自己的感情,跟她断绝关系。

莺莺并没有挽救自己注定成灰的爱情,她知道自己一着不慎,满盘皆输,不该抱枕而去,以至再不能光明正大做人妻,但她没有露出恨意,甚至去信,嘱元稹好好生活,不用牵挂她。

这是一种悲凉的清醒,她愿赌服输,另嫁他人,终身不再见张生,她看着自己的爱情成了废墟,掩埋了这些,淡出了。倒是元稹还很无耻地追忆着,因为这个女子没有纠缠他,很安静地走开了。有一些类似于张爱玲对胡兰成的态度。

无论是封建社会的唐朝,还是公元2003年的今天,同居对于女子始终弊大于益,除非一开始就不想要结果,否则,最好还是不要在没有任何保障的情况下,与一个男子演绎现代版西厢记。

案例十二:芸娘的胸襟——芸娘

将《浮生六记》译成英文版的林语堂说,芸娘是中国文学中最可爱的女人。

芸娘姓陈,夫君沈复,字三白。芸娘自幼丧父,擅女红,全家生计都凭她一双巧手。生性聪颖,自学诗文,亦能写出“秋侵人影瘦,霜染菊花肥”这种句子来。削肩长颈,瘦不露骨,牙齿有微瑕,更有缠绵之态——沈复说的,估计是情人眼里的西施。

沈复是一个寒士,做过幕僚,经过商,会一些风花雪月的东西,写写诗,赏赏画,还有爱花癖。封建社会向来是父母之命媒妁之言,真有什么伉俪情深,也属于瞎猫逮着死老鼠的侥幸,而且,就算一见钟情,也会有《孔雀东南飞》这样的惨剧。

芸娘因为男扮女装随夫君出游,失去了公婆的欢心,乃至于闹到分家,其实就是逐出家门。好在夫妻感情甚笃,于苦中作乐,依然和和美美,竟然没有应了贫贱夫妻百事哀的套路。

芸娘之所以为人称道,更重要的一个原因是,她实在太大度了,也不知中了什么邪,绞尽脑汁想给沈复纳一个妾,而且要求还很高,美而有韵。

在两人生活水平只是温饱的情况下,芸娘竟主动考虑沈复的其他需求,纵然沈复谢绝,她依然微笑着物色。

听闻名妓温冷香,便拉沈复去看,结果认为冷香已老,其女憨园正中她意,送了个翡翠钏给憨园,后来憨园给有权有势者夺去,芸娘便大病一场,最后,竟死了。

越听越觉得不对劲,这是中国历史上唯一一个强烈要求夫君纳妾的正室,而且她看上去极为真诚,即使没有钱,也宁缺勿滥。是对自己与沈复的感情太有信心,不怕失宠,还是因为太爱沈复,恨不得将天下最好的东西都拿来给他?

无论是唐朝宁死不让丈夫纳妾的房玄龄老婆,还是写下《白头吟》的卓文君——闻君有二意,故来相决绝。译成口语就是你如果讨小老婆,我们就玩完。

对比这些态度强硬的原配,再看温柔的芸娘,怎不叫男人怦然心动神往之。但芸娘始终是一个奇特的个案,或者说,她的爱已经超脱了男欢女爱的狭窄桎梏,到了那种你好我也好的高尚境界。

芸娘的情操其实是不真实的,爱,说到底不能与人分享,允许我阴暗地猜测一把,这类似于一种强迫症,我就是要找个比我好的女子,看看你会不会变心——仅仅是考验。

芸娘要替夫君纳妾,是一种姿态,还是确有其心,值得商榷,总之,男人还是不要对女人的胸襟抱有太多幻想。

Posted in 网摘 | No Comments »

ASP中使用XMLHTTP读取远程数据1

12月 16th, 2007 by kyfwcn

ASP中使用XMLHTTP读取远程数据1

这几个月我们的商城建设起来了,“哈尔滨购物网”成了名副其实的购物网。
这时间里相关部门就开始研究其他的购物网,比如当当,卓越。他们想要一份以excel形式存储的包含上述网站的商品信息以便统计、分析。当然卓越、当当没有什么理由把数据都给我们,于是我开始了抓去远程数据的旅程.

一切从www.baidu.com开始,在搜索的文本框里输入“asp 小偷”很多的信息就被检索出来了。我进入了一个叫“ASP小偷(远程数据获取)程序入门教程”的标题:
http://www.pconline.com.cn/pcedu/empolder/wz/asp/0505/628553.html

总结了文章的内容得出结论,“偷”其实就是通过微软的XMLHTTP这个COM组件进行的。还好XMLHTTP这个词并不陌生。

我又在baidu上检索到“xmlHTTP技术资料”这条信息。
http://www.youren.com/Article/programme/xml/200505/4768.html

XMLHTTP能干很多事情,但是在这里我们要它干的只是:将指定的网页的HTML代码读出。
如果通过程序读出对方(当当、卓越)的相应HTML代码就好办了,因为商品数据就存储在那庞杂的代码中。

这很简单,我接着写了如下函数:

function getBody(infopageurl)
‘功能:取得指定网址的html代码
‘参数:infopageurl 网页地址
if infopageurl<>”" then
dim xmlHttp
set xmlHttp=server.createobject(”MSXML2.XMLHTTP”)‘声明XMLHTTP对象
xmlHttp.open “GET”,infopageurl,false
xmlHttp.send’上面这两就句就是调用的形式,调用后程序会堵塞在send这句,直到内容被返回。
getBody=BytesToBstr(xmlhttp.responsebody,”GB2312″)‘然后通过xmlhttp.responsebody属性将返回内容读出,这里用到一个BytesToBstr函数将在后面说明。
set xmlHttp=nothing
end if
end function

关于BytesToBstr,开始返回的结果没有经过这个函数处理,结果返回的汉字是一堆乱码。什么原因就不用深究了。我到www.chinaz.com下载了几个”小偷’的程序,发现里面不约而同的都含有这个函数。大概就是用adodb.stream对结果字符进行了转换。我把它加到我的函数里结果就正常了。

Function BytesToBstr(body,Cset)
dim objstream

set objstream = Server.CreateObject(”adodb.stream”)

objstream.Type = 1

objstream.Mode = 3

objstream.Open

objstream.Write body

objstream.Position = 0

objstream.Type = 2

objstream.Charset = Cset

BytesToBstr = objstream.ReadText

objstream.Close

set objstream = nothing
End Function

html代码取回来了,我们怎么从中取得需要的数据?答案是正则表达式。
这里是关于正则表达式的参考
http://www.51windows.net/pages/vbscript/html/reconIntroductionToRegularExpressions.htm

正则表达达式就象是一种简单的语言。它用一些特殊的字符模糊地描述一个字符串。然后可以通过程序去检查一个字符串中是否包含你描述的那种字符串,还可以将你描述的字符从一个字符串中取出,这里我们就是利用这个功能来获取需要的数据。

举起例子比较容易理解:
* 匹配前面的子表达式零次或多次。例如,zo*(正则表达式) 能匹配 z 、 zoo、zooooo、zoooooooooo
+ 匹配前面的子表达式一次或多次。例如,zo+ 能匹配 zo 以及 zoo,但不能匹配 “z”。
\d 匹配一个数字字符。等价于 [0-9]。 例如, \d+ 可以匹配 1,123,9876
. 匹配除 “\n” 之外的任何单个字符。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,’o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。

下面要做的就是分析商品数据在html代码中存放的特征,然后写出正则表达式将其取出。
例如,joyo商品的市场价格数据在html代码中是这样存储的“市场价:15.00元”,要做的是把以“市场价:”开头,“元”结尾之间的数值取出。下面函数就实现了这个功能:

function Topic(sHtmlcode)
‘功能:返回joyo.com商品页面的市场价格数值
‘参数:shtmlcode 商品页的html代码
Set regEx = New RegExp’建立使用正则表达式的对象
regEx.IgnoreCase =true
regEx.Global = True
regEx.Pattern =”市场价:(.+?)元”设置表达式
Set Matches = regEx.Execute(shtmlcode)’执行表达式将所有符合描述的字符传存放到一个集合里。
for each sMatch in Matches
Topic=sMatch.SubMatches(0)’submatches(0)带表第一个子匹配,既小括号中的数值
exit for
next
set regEx=nothing
end function

其他的数据也用同样的方法取得。写正则表达式是一个很有趣而且很复杂的工作。期间我遇到写不出来的,就去CSDN.net的论坛去提问,总是可以得到帮助。

还有一点要思考的是:是不是这个表达式对所有的商品页面都适用。如果所有的商品都是用一个asp程序显示那就可以,但是joyo.com不是,它的不同分类中html代码的格式是不同的,所以我们要写几个正则表达式来分别匹配不同形式的数据(比如有些页面中市场价格是这样存储的“市场价:15.00元”)。

有了这些函数我们就可以用给定的商品网页地址取得相应的数据了。但是这些网站的商品一般都有万余种,如何获取这些地址就不是那么容易了。这个过程因站而异,这也是真正需要“小偷”智慧的工作之一。

拿joyo.com进行分析。进入首页之后我发现里面有个”产品搜索“,选择“所有类别”,关键字置空,点击那个”GO!”检索出了21684条记录。这应该就是joyo.com的所有商品信息了,来的太容易我简直不敢相信。

检索页上包含有10条商品的连接,用正则取得后,再取得转向后10条记录(即下一页)的连接。如此循环就会得出所有商品信息。我用access建了一个表来存放它们。编好了程序挂到机器上就睡觉去了。

这是一个检索结果页的连接:
http://www.joyo.com/ProdSearch/prodsearch.asp?kind=&limitBefore=10&vname=&sorttype=undefined&uid=u5swcqykpzsis0qaiwg79sg5u
其中limitBefore=10 当前页第一条记录前有10条记录,即这一页的第一条是总的第11条记录。

第二天兴奋地来到机器上一看,发现记录只有700多条。很郁闷,程序我没加容错处理因为我发现vbscript的错误处理比vb中的还要简略。似乎连on error goto LABEL都不可以使用。我在检索页点来点去希望找出错误的根源,结果发现当其中limitBefore大于750的时候后面就没有记录了。原来是这样。joyo.com的程序员没有让我们这么容易的得到所有数据。这条路是不能走了。

下面我开始分析检索结果中商品信息页面的连接:
http://www.joyo.com/shop/shop_product.asp?uid=u5swcqykpzsis0qaiwg79sg5u&prodid=bkbk507440
经分析 prodid=bkbk507440 是这个产品的唯一标识,bkbk表示该产品的所属分类“图书”

这是一些其他的主要分类标识:
bkbk 图书
bkmu 音乐
itit 数码
bkbh 日用
itrj 数码产品
bkgm 游戏
bkys 影视

只要我遍历所有的prodid然后找出存在的商品页面就可以了。然而怎么判断该prodid是否存在呢,我在地址栏上胡乱打了一个prodid返回了出错结果页面。

http://www.joyo.com/errormsg.asp?uid=u5swcqykpzsis0qaiwg79smuw&err=GET%C7%EB%C7%F3%B5%C4%C9%CC%C6%B7ID%B2%BB%B4%E6%D4%DA%A3%AC%B2%D9%D7%F7%CE%DE%B7%A8%BC%CC%D0%F8%A3%A1

出错页上有一张红色的“警钟”图案,我估计正常的页面上是不可能包含此图片的。于是以此作为判断prodid是否存在的依据。遍历所有prodid,如果在返回结果html中发现“警钟”图片则不做处理,否则就从页面中取出需要的信息。

遍历6位的prodid是个漫长的过程,粗略的估算,如果每个操作用时1秒的话,则最少需要999999次循,环即999999秒(999999/3600=277多小时)。这显然是太长了,于是我又做了一些优化,发现第一位数字只在0-5之间变化,第二为数字只在0-1之间变化。这样大大的缩短了时间(519999/3600=144多小时),实际的时间更乐观。

Posted in 技术, 网摘 | No Comments »

ASP生成静态HTML文件的几种方法比较

12月 16th, 2007 by kyfwcn

ASP生成静态HTML文件的几种方法比较_再跨一步

将动态页面转换生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录(特别是对接受动态参数的页面).前台访问时,脱离了数据访问,减轻对数据库访问的压力,加快网页打开速度.

当然,凡事有利必有弊,生成HTML页面无形中也耗费大量的磁盘空间以存放这些静态文件,在编辑页面过程中除读写数据库外,也要读写服务器磁盘,页面样式的改动必须重新生成全部HTML文件,等等。

像很多搜索引擎,都可以提交网站的页面地址列表,动态文件的收录问题已经不算是个问题了(如Google sitemap)。得失就要自己衡量把握了,但无论如何,我们还是要懂得如何操作的。这里就引用一下别人的文章说明几种常见的生成思路,供大家参考参考。

1,下面这个例子直接利用FSO把html代码写入到文件中然后生成.html格式的文件 。这是最原始的,优点是简单,缺点是页面的修改不方便,我一般用到的地方是利用它生成整站参数文件。(通常网站如标题,名称等配置保存在数据库,我将它生成config.ASP保存这些变量调用,避免频繁访问数据库)

<%
filename=”test.htm”
if request(”body”)<>”" then
set fso = Server.CreateObject(”Scripting.FileSystemObject”)
set htmlwrite = fso.CreateTextFile(server.mappath(”"&filename&”"))
htmlwrite.write “<html><head><title>” & request.form(”title”) & “</title></head>”
htmlwrite.write “<body>输出Title内容: ” & request.form(”title”) & “<br /> 输出Body内容:” & request.form(”body”)& “</body></html>”
htmlwrite.close
set fout=nothing
set fso=nothing
end if
%>
<form name=”form” method=”post” action=”">
<input name=”title” value=”Title” size=26>
<br>
<textarea name=”body”>Body</textarea>
<br>
<br>
<input type=”submit” name=”Submit” value=”生成html”>
</form>

2,但是按照上面的方法生成html文件非常不方便,第二种方法就是利用模板技术,将模板中特殊代码的值替换为从表单或是数据库字段中接受过来的值,完成模板功能;将最终替换过的所有模板代码生成HTML文件.这种技术采用得比较多,大部分的CMS都是使用这类方法.

template.htm ‘ //模板文件
<html>
<head>
<title>$title$ by webjx.com</title>
</head>
<body>
$body$
</body>
</html>
TestTemplate.asp ‘// 生成Html
<%
Dim fso,htmlwrite
Dim strTitle,strContent,strOut
‘// 创建文件系统对象
Set fso=Server.CreateObject(”Scripting.FileSystemObject”)
‘// 打开网页模板文件,读取模板内容
Set htmlwrite=fso.OpenTextFile(Server.MapPath(”Template.htm”))
strOut=f.ReadAll
htmlwrite.close
strTitle=”生成的网页标题”
strContent=”生成的网页内容”
‘// 用真实内容替换模板中的标记
strOut=Replace(strOut,”$title$”,strTitle)
strOut=Replace(strOut,”$body$”,strContent)
‘// 创建要生成的静态页
Set htmlwrite=fso.CreateTextFile(Server.MapPath(”test.htm”),true)
‘// 写入网页内容
htmlwrite.WriteLine strOut
htmlwrite.close
Response.Write “生成静态页成功!”
‘// 释放文件系统对象
set htmlwrite=Nothing
set fso=Nothing
%>

3,第三种方法就是用XMLHTTP获取动态页生成的HTML内容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html文件。找到一段XMLHTTP生成Html的代码参考一下.

<%
‘常用函数
‘1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
function getHTTPPage(url)
dim Http
set Http=server.createobject(”MSXML2.XMLHTTP”)
Http.open “GET”,url,false
Http.send()
if Http.readystate<>4 then
exit function
end if
getHTTPPage=bytesToBSTR(Http.responseBody,”GB2312″)
set http=nothing
if err.number<>0 then err.Clear
end function

‘2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换

Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject(”adodb.stream”)
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
txtURL=server.MapPath(”../index.asp”)
sText = getHTTPPage(txtURL)
Set FileObject=Server.CreateObject(”Scripting.FileSystemObject”)
filename=”../index.htm”
Set openFile=FileObject.OpenTextfile(server.mapPath(filename),2,true) ‘true为不存在自行建立
openFile.writeline(sText)
Set OpenFile=nothing
%>
<script>
alert(”静态网页生成完毕”);
history.back();
</script>

小偷程序原理和简单示例 - 中国站长在线网

现在网上流行的小偷程序比较多,有新闻类小偷,音乐小偷,下载小偷,那么它们是如何做的呢,下面我来做个简单介绍,希望对各位站长有所帮助。
(一)原理
小偷程序实际上是通过了XML中的XMLHTTP组件调用其它网站上的网页。比如新闻小偷程序,很多都是调用了sina的新闻网页,并且对其中的html进行了一些替换,同时对广告也进行了过滤。用小偷程序的优点有:无须维护网站,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省服务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。缺点有:不稳定,如果目标网站出错,程序也会出错,而且,如果目标网站进行升级维护,那么小偷程序也要进行相应修改;速度,因为是远程调用,速度和在本地服务器上读取数据比起来,肯定要慢一些。
(二)示例

下面就XMLHTTP在ASP中的应用做个简单说明
<%
‘常用函数

‘1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
function getHTTPPage(url)
    dim Http
    set Http=server.createobject(”MSXML2.XMLHTTP”)
    Http.open “GET”,url,false
    Http.send()
    if Http.readystate<>4 then
        exit function
    end if
    getHTTPPage=bytesToBSTR(Http.responseBody,”GB2312″)
    set http=nothing
    if err.number<>0 then err.Clear
end function

‘2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换
Function BytesToBstr(body,Cset)
        dim objstream
        set objstream = Server.CreateObject(”adodb.stream”)
        objstream.Type = 1
        objstream.Mode =3
        objstream.Open
        objstream.Write body
        objstream.Position = 0
        objstream.Type = 2
        objstream.Charset = Cset
        BytesToBstr = objstream.ReadText
        objstream.Close
        set objstream = nothing
End Function

‘下面试着调用http://www.3doing.com/earticle/的html内容
Dim Url,Html
Url=”http://www.3doing.com/earticle/”
Html = getHTTPPage(Url)
Response.write Html
%>

Posted in 技术, 网摘 | No Comments »

ASP生成静态HTML文件的几种方法比较_再跨一步

12月 16th, 2007 by kyfwcn

ASP生成静态HTML文件的几种方法比较_再跨一步

将动态页面转换生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录(特别是对接受动态参数的页面).前台访问时,脱离了数据访问,减轻对数据库访问的压力,加快网页打开速度.

当然,凡事有利必有弊,生成HTML页面无形中也耗费大量的磁盘空间以存放这些静态文件,在编辑页面过程中除读写数据库外,也要读写服务器磁盘,页面样式的改动必须重新生成全部HTML文件,等等。

像很多搜索引擎,都可以提交网站的页面地址列表,动态文件的收录问题已经不算是个问题了(如Google sitemap)。得失就要自己衡量把握了,但无论如何,我们还是要懂得如何操作的。这里就引用一下别人的文章说明几种常见的生成思路,供大家参考参考。

1,下面这个例子直接利用FSO把html代码写入到文件中然后生成.html格式的文件 。这是最原始的,优点是简单,缺点是页面的修改不方便,我一般用到的地方是利用它生成整站参数文件。(通常网站如标题,名称等配置保存在数据库,我将它生成config.ASP保存这些变量调用,避免频繁访问数据库)

<%
filename=”test.htm”
if request(”body”)<>”" then
set fso = Server.CreateObject(”Scripting.FileSystemObject”)
set htmlwrite = fso.CreateTextFile(server.mappath(”"&filename&”"))
htmlwrite.write “<html><head><title>” & request.form(”title”) & “</title></head>”
htmlwrite.write “<body>输出Title内容: ” & request.form(”title”) & “<br /> 输出Body内容:” & request.form(”body”)& “</body></html>”
htmlwrite.close
set fout=nothing
set fso=nothing
end if
%>
<form name=”form” method=”post” action=”">
<input name=”title” value=”Title” size=26>
<br>
<textarea name=”body”>Body</textarea>
<br>
<br>
<input type=”submit” name=”Submit” value=”生成html”>
</form>

2,但是按照上面的方法生成html文件非常不方便,第二种方法就是利用模板技术,将模板中特殊代码的值替换为从表单或是数据库字段中接受过来的值,完成模板功能;将最终替换过的所有模板代码生成HTML文件.这种技术采用得比较多,大部分的CMS都是使用这类方法.

template.htm ‘ //模板文件
<html>
<head>
<title>$title$ by webjx.com</title>
</head>
<body>
$body$
</body>
</html>
TestTemplate.asp ‘// 生成Html
<%
Dim fso,htmlwrite
Dim strTitle,strContent,strOut
‘// 创建文件系统对象
Set fso=Server.CreateObject(”Scripting.FileSystemObject”)
‘// 打开网页模板文件,读取模板内容
Set htmlwrite=fso.OpenTextFile(Server.MapPath(”Template.htm”))
strOut=f.ReadAll
htmlwrite.close
strTitle=”生成的网页标题”
strContent=”生成的网页内容”
‘// 用真实内容替换模板中的标记
strOut=Replace(strOut,”$title$”,strTitle)
strOut=Replace(strOut,”$body$”,strContent)
‘// 创建要生成的静态页
Set htmlwrite=fso.CreateTextFile(Server.MapPath(”test.htm”),true)
‘// 写入网页内容
htmlwrite.WriteLine strOut
htmlwrite.close
Response.Write “生成静态页成功!”
‘// 释放文件系统对象
set htmlwrite=Nothing
set fso=Nothing
%>

3,第三种方法就是用XMLHTTP获取动态页生成的HTML内容,再用ADODB.Stream或者Scripting.FileSystemObject保存成html文件。找到一段XMLHTTP生成Html的代码参考一下.

<%
‘常用函数
‘1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
function getHTTPPage(url)
dim Http
set Http=server.createobject(”MSXML2.XMLHTTP”)
Http.open “GET”,url,false
Http.send()
if Http.readystate<>4 then
exit function
end if
getHTTPPage=bytesToBSTR(Http.responseBody,”GB2312″)
set http=nothing
if err.number<>0 then err.Clear
end function

‘2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换

Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject(”adodb.stream”)
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
txtURL=server.MapPath(”../index.asp”)
sText = getHTTPPage(txtURL)
Set FileObject=Server.CreateObject(”Scripting.FileSystemObject”)
filename=”../index.htm”
Set openFile=FileObject.OpenTextfile(server.mapPath(filename),2,true) ‘true为不存在自行建立
openFile.writeline(sText)
Set OpenFile=nothing
%>
<script>
alert(”静态网页生成完毕”);
history.back();
</script>

Posted in 技术, 网摘 | No Comments »

如何写ASP入库小偷程序_很爱过

12月 16th, 2007 by kyfwcn

如何写ASP入库小偷程序_很爱过

最近大家都对小偷程序感兴趣,尤其是入库类的,在这里我简单的介绍一下。希望大家对这个能有所了解,如果您还不知道什么叫小偷,请参考我写的另外一片文章《小偷程序原理和简单示例》

个人认为小偷只是一个很通俗的说法,也给很多人带来了误解,认为小偷是什么不好的东西,其实不然,用数据采集程序来形容应该更准确些。

在这里我简单介绍一下:

入库小偷的原理也很简单,就是用XMLHTTP远程读取网页的内容,然后根据需要,对读到的内容进行加工(过滤、替换、分类),最后得到自己需要的数据,加入到数据库中。

首先:我们先用XMLHTTP读取远程网页(我的另一片文章中有介绍)。

其次:对内容进行过滤,这个是比较关键的步骤,比如说,我要从远程网页上提取出所有url连接,我应该怎么做呢?

‘这里用的是正则式 Set objRegExp = New Regexp ‘建立对象 objRegExp.IgnoreCase = True ‘大小写忽略 objRegExp.Global = True ‘全局为真 objRegExp.Pattern = “http://.+?” ‘匹配字段 set mm=objRegExp.Execute(str) ‘执行查找,str为输入参数 For Each Match in mm ‘进入循环 Response.write(Match.Value) ‘输出url地址 next

然后,我们需要根据需要做一些替换功能,把不必要的数据替换掉,这个比较简单,用Replace函数即可。

最后,进行数据库操作,这个我想大家应该都会,就不做介绍了。

Posted in 技术 | No Comments »

小偷程序和采集入库

12月 16th, 2007 by kyfwcn

<html> 
<% 
‘声明取得目标信息的函数,通过XML组件进行实现 
Function GetURL(url) 
Set Retrieval = CreateObject(”Microsoft.XMLHTTP”) 
With Retrieval 
.Open ”GET”, url, False 
.Send 
GetURL = bytes2bstr(.responsebody) 
‘对取得信息进行验证,如果信息长度小于100则说明截取失败 
if len(.responsebody)<100 then 
response.write ”获取远程文件 <a href=”&url&” target=_blank>”&url&”</a> 失败。” 
response.end 
end if 

End With 
Set Retrieval = Nothing 
End Function 
‘ 二进制转字符串,否则会出现乱码的! 
function bytes2bstr(vin) 
strreturn = ”" 
for i = 1 to lenb(vin) 
thischarcode = ascb(midb(vin,i,1)) 
if thischarcode < &h80 then 
strreturn = strreturn & chr(thischarcode) 
else 
nextcharcode = ascb(midb(vin,i+1,1)) 
strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode)) 
i = i + 1 
end if 
next 
bytes2bstr = strreturn 
end function 
‘声明截取的格式,从Start开始截取,到Last为结束 
Function GetKey(HTML,Start,Last) 
filearray=split(HTML,Start) 
filearray2=split(filearray(1),Last) 
GetKey=filearray2(0) 
End Function 

Dim Softid,Url,Html,Title,typeid,where,content,domurl,name,movietype,murl 

‘获取要取页面的ID 

Softid=Request(”Id”) 

Url=”http://www.bb60.com/moviehtm/“&SoftId&”.htm” 

Html = GetURL(Url) 

‘以截取天空软件的软件名为例子 

Title = GetKey(Html,”><b><font color=”"#FF0000″”>”,”</font></b></font>”) 
typeid = GetKey(Html,”影片分类: ”,”</TD>”) 
content = GetKey(Html,”0000 size=3>”,”</font></P>”) 
domurl = GetKey(Html,”../softimg/”,”"”><br>”) 
name = GetKey(Html,”主 演: ”,”</TD>”) 
murl = GetKey(Html,”onClick= Play(’../”,”‘)>播放1″) 

set rs=server.createobject(”adodb.recordset”) 
sql=”select * from learning where (articleid is null)” 
rs.open sql,conn,1,3 
rs.addnew 
rs(”serverip”)=”122″ 
rs(”typeid”)=typeid 
rs(”softlevel”)=”5″ 
rs(”title”)=title 
rs(”content”)=content 
rs(”onlinelook”)=”1″ 
rs(”canlook”)=”0″ 
rs(”howlong”)=”90″ 
rs(”url”)=murl 
rs(”domurl”)=”http://www.bb60.com/softimg/“&murl&”" 
rs(”name”)=name 
rs(”count”)=”0″ 
rs(”movietype”)=”mov” 
rs.update 
articleid=rs(”articleid”) 
rs.close 

set rs=server.createobject(”adodb.recordset”) 
sql1=”select * from movieurl where (id is null)” 
rs.open sql1,conn,1,3 
for i=1 to no 
rs.addnew 
url=trim(murl) 
rs(”nameid”)=articleid 
rs(”url”)=url 
rs.update 
next 

rs.close 
set rs=nothing 
conn.close 
set conn=nothing 

%>

Posted in 技术, 网摘 | No Comments »

一段比较完整的采集程序和入库程序

12月 16th, 2007 by kyfwcn
一段比较完整的采集程序和入库程序

<%
‘声明取得目标信息的函数,通过XML组件进行实现。
Geturl(/url)
Set Retrieval = CreateObject(”Microsoft.XMLHTTP”)
With Retrieval
.Open “GET”, url, False
.Send
GetURL = bytes2bstr(.responsebody)
‘对取得信息进行验证,如果信息长度小于100则说明截取失败
if len(.responsebody)<100 then
response.write “获取远程文件 <a href=”&url&” target=_blank>”&url&”</a> 失败。”
response.end
end if

End With
Set Retrieval = Nothing
End
‘ 二进制转字符串,否则会出现乱码的!
bytes2bstr(vin)
strreturn = “”
for i = 1 to lenb(vin)
thischarcode = ascb(midb(vin,i,1))
if thischarcode < &h80 then
strreturn = strreturn & chr(thischarcode)
else
nextcharcode = ascb(midb(vin,i+1,1))
strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode))
i = i + 1
end if
next
bytes2bstr = strreturn
end
‘声明截取的格式,从Start开始截取,到Last为结束
GetKey(HTML,Start,Last)
filearray=split(HTML,Start)
filearray2=split(filearray(1),Last)
GetKey=filearray2(0)
End

Dim Softid,Url,Html,Title

‘获取要取页面的ID

SoftId=Request(”Id”)

Url=”http://www3.skycn.com/soft/“&SoftId&”.html”

Html = Geturl(/Url)

‘以截取天空软件的软件名为例子

Title = GetKey(Html,”<font color=’#004FC6′ size=’3′>”,”</font></b></td></tr>”)

‘打开数据库,准备入库

dim connstr,conn,rs,sql

connstr=”DBQ=”+server.mappath(”db1.mdb”)+”;DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};”

set conn=server.createobject(”ADODB.CONNECTION”)

conn.open connstr

set rs=server.createobject(”adodb.recordset”)

sql=”select [列名] from [表名] where [列名]=’”&Title&”‘”

rs.open sql,conn,3,3

if rs.eof and rs.bof then

rs(”列名”)=Title

rs.update

set rs=nothing

end if

set rs=nothing

Response.Write”采集完毕!”

%>

——————————————————————————————————————————

XMLHTTP应用参考
一、使用步骤:
1、创建XMLHTTP对象 //需MSXML4.0支持
2、打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等。客户端通过Open命令打开与服务端的服务网页的连接。与普通HTTP指令传送一样,可以用”GET”方法或”POST”方法指向服务端的服务网页。
3、发送指令。
4、等待并接收服务端返回的处理结果。
5、释放XMLHTTP对象
二、XMLHTTP方法:
1、XMLHTTP对象
备注:客户机可以使用XMLHTTP对象发送任意的HTTP请求,接受HTTP应答,还可以对应答的XML文档进行解析。
Open方法:初始化一个Msxml2.XMLHTTP请求,指定HTTP请求方式、URL以及鉴定信息。
Open( bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword )
bstrMethod: 数据传送方式,即GET或POST。
bstrUrl:    服务网页的URL。
varAsync:    是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。
bstrUser:    用户名,可省略。
bstrPassword:用户口令,可省略。
Send方法:发送HTTP请求到服务器,返回应答。
语法:
oXMLHttpRequest.send(varBody)
说明:此方法是否同步取决于Open方法的varAsync参数。如果设为True则为同步,调用立刻返回,如果设为False调用直到整个应答被接收了才返回。
setRequestHeader( bstrHeader, bstrvalue )
bstrHeader:HTTP 头(header)
bstrvalue: HTTP 头(header)的值
如果Open方法定义为POST,可以定义表单方式上传:
xmlhttp.setRequestHeader( “Content-Type”, “application/x-www-form-urlencoded”)
三、XMLHTTP属性:
onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
responseBody:    结果返回为无符号整数数组。
responseStream:    结果返回为IStream流。
responseText :    结果返回为字符串。
responseXML:    结果返回为XML格式数据。
四、示例:
< script language=”javascript” >
function getDatal(url){
   var xmlhttp = new
ActiveXObject(”MSXML2.XMLHTTP.4.0″;//创建XMLHTTPRequest对象,需MSXML4.0支 持
["MSXML2.XMLHTTP.4.0","MSXML2.DOMDocument.4.0"]
   xmlhttp.open(”GET”,url,false,”",”";    //使用HTTP GET初始化HTTP请求
   xmlhttp.send(”";              //发送HTTP请求并获取HTTP响应
   return xmlhttp.responseXML;        //获取XML文档
}
< /script >

   现在网上流行的小偷程序比较多,有新闻类小偷,音乐小偷,下载小偷,那么它们是如何做的呢,下面我来做个简单介绍,希望对各位站长有所帮助。
(一)原理

偷程序实际上是通过了XML中的XMLHTTP组件调用其它网站上的网页。比如新闻小偷程序,很多都是调用了sina的新闻网页,并且对其中的html进
行了一些替换,同时对广告也进行了过滤。用小偷程序的优点有:无须维护网站,因为小偷程序中的数据来自其他网站,它将随着该网站的更新而更新;可以节省服
务器资源,一般小偷程序就几个文件,所有网页内容都是来自其他网站。缺点有:不稳定,如果目标网站出错,程序也会出错,而且,如果目标网站进行升级维护,
那么小偷程序也要进行相应修改;速度,因为是远程调用,速度和在本地服务器上读取数据比起来,肯定要慢一些。
(二)事例
下面就XMLHTTP在ASP中的应用做个简单说明

代码: <%
‘常用函数
‘1、输入url目标网页地址,返回值getHTTPPage是目标网页的html代码
function getHTTPPage(url)
   dim Http
   set Http=server.createobject(”MSXML2.XMLHTTP”
   Http.open “GET”,url,false
   Http.send()
   if Http.readystate<>4 then
     exit function
   end if
   getHTTPPage=bytesToBSTR(Http.responseBody,”GB2312″
   set http=nothing
   if err.number<>0 then err.Clear
end function
‘2、转换乱玛,直接用xmlhttp调用有中文字符的网页得到的将是乱玛,可以通过adodb.stream组件进行转换
Function BytesToBstr(body,Cset)
     dim objstream
     set objstream = Server.CreateObject(”adodb.stream”
     objstream.Type = 1
     objstream.Mode =3
     objstream.Open
     objstream.Write body
     objstream.Position = 0
     objstream.Type = 2
     objstream.Charset = Cset
     BytesToBstr = objstream.ReadText
     objstream.Close
     set objstream = nothing
End Function
‘下面试着调用http://wmjie.51.net/swords的html内容
Dim Url,Html
Url=”http://wmjie.51.net/swords/”
Html = getHTTPPage(Url)
Response.write Html
%>
——————————————————
代码:
‘代码]用XMLHTTP读取远程文件
<%
Response.Buffer = True
Dim objXMLHTTP, xml
Set xml = Server.CreateObject(”Microsoft.XMLHTTP”
xml.Open “GET”, “http://wmjie.51.net/swords/diary.rar”, False
xml.Send
‘ Add a header to give it a file name:
Response.AddHeader “Content-Disposition”, _
               “attachment;filename=mitchell-pres.zip”
‘ Specify the content type to tell the browser what to do:
Response.ContentType = “application/zip”
‘ Binarywrite the bytes to the browser
Response.BinaryWrite xml.responseBody
Set xml = Nothing
%>

————————————-
如何写ASP入库小偷程序
入库小偷的原理也很简单:就是用XMLHTTP远程读取网页的内容,然后根据需要,对读到的内容进行加工(过滤,替换,分类),最后得到自己需要的数据,加入到数据库中。
首先:我们先用XMLHTTP读取远程网页(我的另一片文章中有介绍)。
其次:对内容进行过滤,这个是比较关键的步骤,比如说,我要从远程网页上提取出所有url连接,我应该怎么做呢?
代码:
‘这里用的是正则式
Set objRegExp = New Regexp    ‘建立对象
objRegExp.IgnoreCase = True    ‘大小写忽略
objRegExp.Global = True        ‘全局为真
objRegExp.Pattern = “http://.+?”    ‘匹配字段
set mm=objRegExp.Execute(str)    ‘执行查找,str为输入参数
For Each Match in mm      ‘进入循环
     Response.write(Match.Value)    ‘输出url地址
next

然后,我们需要根据需要做一些替换功能,把不必要的数据替换掉,这个比较简单,用Replace函数即可。
最后,进行数据库操作
——————————-
一个例子
代码:
<%
On Error Resume Next
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
     t = GetBody(Path)
     getHTTPPage=BytesToBstr(t,”GB2312″
End function

首先,进行小偷程序的一些初始化设置,以上代码的作用分别是忽略掉所有非致命性错误,把小偷程序的运行超时时间设置得很长(这样不会出现运行超时的错
误),转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP组件调用有中文字符的网页得到的将是乱码。
Function GetBody(url)
     on error resume next
     Set Retrieval = CreateObject(”Microsoft.XMLHTTP”
     With Retrieval
     .Open “Get”, url, False, “”, “”
     .Send
     GetBody = .ResponseBody
     End With
     Set Retrieval = Nothing
End Function
‘然后调用XMLHTTP组件创建一个对象并进行初始化设置。
Function BytesToBstr(body,Cset)
     dim objstream
     set objstream = Server.CreateObject(”adodb.stream”
     objstream.Type = 1
     objstream.Mode =3
     objstream.Open
     objstream.Write body
     objstream.Position = 0
     objstream.Type = 2
     objstream.Charset = Cset
     BytesToBstr = objstream.ReadText
     objstream.Close
     set objstream = nothing
End Function
Function Newstring(wstr,strng)
     Newstring=Instr(lcase(wstr),lcase(strng))
     if Newstring<=0 then Newstring=Len(wstr)
End Function
‘处理抓取回来的数据需要调用adodb.stream组件并进行初始化设置。%>
‘以下即为页面显示部分
<%
Dim wstr,str,url,start,over,city
‘定义一些需要使用到的变量
city = Request.QueryString(”id”)
‘程序传回的ID变量(即用户选择的城市)赋给id
url=”http://appnews.qq.com/cgi-bin/news_qq_search?city=”&city&”"
‘这里设置需要抓取的页面地址,当然你也可以直接指定某个地址而不使用变量
wstr=getHTTPPage(url)
‘获取指定页面的全部数据       
start=Newstring(wstr,” <html>”)
‘这里设置需要处理的数据的头部,这个变量应视不同情况而设置,具体内容可以通过查看需要抓取的页面的源代码来确定。因为在这个程序里我们需要抓取整个页面,所以设置为页面全部抓取。注意,设置的内容必须是页面内容唯一的,不可以重复。
over=Newstring(wstr,” </HTML>”)
‘和start相对应的就是需要处理的数据的尾部,同样的,设置的内容必须是页面中唯一的。
body=mid(wstr,start,over-start)
‘设置显示页面的范围
‘下面就是动用乾坤挪移***的时候了,通过replace可以用一些字符替换掉数据中指定的字符。
body = replace(body,”skin1″,”天气预报 - 斯克网络”)
body = replace(body,”http://appnews.qq.com/cgi-bin/news_qq_search?city”,”tianqi.asp?id”)
‘本程序中已经完成了替换的工作,如果有其他需要的话可以继续进行类似的替换操作。
response.write body
引用: 远程获取内容,并将内容存在本地电脑上,包括任何文件
<%
‘———-远程获取内容,并将内容存在本地电脑上,包括任何文件!———-
‘On Error Resume Next
‘Set the content type to the specific type that you are sending.
‘Response.ContentType = “IMAGE/JPEG”
‘——————————-定义输出格式—————————–
Path=request.querystring(”p”)
sPath = Path
if left(lcase(path),7) <> “http://”; then
‘————-如果前面没有http就是本地文件,交给LocalFile处理————
LocalFile(path)
else
‘——————–否则为远程文件,交给RemoteFile处理——————
RemoteFile(Path)
end if
‘Response.Write err.Description
sub LocalFile(Path)
‘——————-如果为本地文件则简单的跳转到该页面——————-
Response.Redirect Path
End Sub
Sub RemoteFile(sPath)
‘————————-处理远程文件函数——————————
FileName = GetFileName(sPath)
‘————-GetFileName为把地址转换为合格的文件名过程————-
FileName = Server.MapPath(”/UploadFile/Cache/” & FileName)
Set objFso = Server.CreateObject(”Scripting.FileSystemObject”)
‘Response.Write fileName
if objFso.FileExists(FileName) Then
‘————–检查文件是否是已经访问过,如是,则简单跳转————
Response.Redirect “/uploadfile/cache/” & GetFileName(path)
Else
‘—————-否则的话就先用GetBody函数读取———————-
‘Response.Write Path
t = GetBody(Path)
‘—————–用二进制方法写到浏览器上————————–
Response.BinaryWrite t
Response.Flush
‘—————–输出缓冲——————————————
SaveFile t,GetFileName(path)
‘——————将文件内容缓存到本地路径,以待下次访问———–
End if
Set objFso = Nothing
End Sub
Function GetBody(url)
‘———————–本函数为远程获取内容的函数———————
‘on error resume next
‘Response.Write url
Set Retrieval = CreateObject(”Microsoft.XMLHTTP”)
‘———————-建立XMLHTTP对象—————————–
With Retrieval
.Open “Get”, url, False, “”, “”
‘——————用Get,异步的方法发送———————–
.Send
‘GetBody = .ResponseText
GetBody = .ResponseBody
‘——————函数返回获取的内容————————–
End With
Set Retrieval = Nothing
‘response.Write err.Description
End Function
Function GetFileName(str)
‘————————-本函数为合格化的文件名函数——————-
str = Replace(lcase(str),”http://”;,”")
str = Replace(lcase(str),”//”,”/”)
str = Replace(str,”/”,”")
str = replace(str,vbcrlf,”")
GetFileName = str
End Function
sub SaveFile(str,fName)
‘————————-本函数为将流内容存盘的函数——————-
‘on error resume next
Set objStream = Server.CreateObject(”ADODB.Stream”)
‘————–建立ADODB.Stream对象,必须要ADO 2.5以上版本———
objStream.Type = adTypeBinary
‘————-以二进制模式打开————————————-
objStream.Open
objstream.write str
‘——————–将字符串内容写入缓冲————————–
‘response.Write fname
objstream.SaveToFile “c:\inetpub\myweb\uploadfile\cache\” & fName,adSaveCreateOverWrite
‘——————–将缓冲的内容写入文件————————–
‘response.BinaryWrite objstream.Read
objstream.Close()
set objstream = nothing
‘———————–关闭对象,释放资源————————-
‘response.Write err.Description
End sub
%>

Posted in 技术, 网摘 | No Comments »

asp采集HTML内容常用方法,详讲正则采集_尘缘 Wind Love Ember

12月 16th, 2007 by kyfwcn

asp采集HTML内容常用方法,详讲正则采集_尘缘 Wind Love Ember

我开发过几个采集程序,也研究过很多采集程序代码,所以对采集程序的原理还算是稍微有些了解。
先说一下采集原理:

采集程序的主要步骤如下:

一、获取被采集的页面的内容
二、从获取代码中提取所有用的数据

一、获取被采集的页面的内容

我目前所掌握的ASP常用获取被采集的页面的内容方法:

1、用serverXMLHTTP组件获取数据

Function GetBody(weburl)
‘创建对象
Dim ObjXMLHTTP
Set ObjXMLHTTP=Server.CreateObject(”MSXML2.serverXMLHTTP”)
‘请求文件,以异步形式
ObjXMLHTTP.Open “GET”,weburl,False
ObjXMLHTTP.send
While ObjXMLHTTP.readyState <> 4
ObjXMLHTTP.waitForResponse 1000
Wend
‘得到结果
GetBody=ObjXMLHTTP.responseBody
‘释放对象
Set ObjXMLHTTP=Nothing
End Function
调用方法:
GetBody(文件的URLf地址)

2、或XMLHTTP组件获取数据

Function GetBody(weburl)
‘创建对象
Set Retrieval = CreateObject(”Microsoft.XMLHTTP”)
With Retrieval
.Open “Get”, weburl, False, “”, “”
.Send
GetBody = .ResponseBody
End With
‘释放对象
Set Retrieval = Nothing
End Function
调用方法:
GetBody(文件的URLf地址)

这样获取的数据内容还需要进行编码转换才可以使用

Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject(”adodb.stream”)
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function

调用方法:BytesToBstr(要转换的数据,编码)’编码常用为GB2312和UTF-8

二、从获取代码中提取所有用的数据
目前我掌握的方法有:
1、用ASP内置的MID函数截取需要的数据

Function body(wstr,start,over)
start=Newstring(wstr,start)
‘设置需要处理的数据的唯一的开始标记
over=Newstring(wstr,over)
‘和start相对应的就是需要处理的数据的唯一的结束标记
body=mid(wstr,start,over-start)
‘设置显示页面的范围
End Function
调用方法:body(被采集的页面的内容,开始标记,结束标记)

2、用正则获取需要的数据

Function body(wstr,start,over)
Set xiaoqi = New Regexp’设置配置对象
xiaoqi.IgnoreCase = True’忽略大小写
xiaoqi.Global = True’设置为全文搜索
xiaoqi.Pattern = “”&start&“.+?”&over&“”‘正则表达式
Set Matches =xiaoqi.Execute(wstr)’开始执行配置
set xiaoqi=nothing
body=”"
For Each Match in Matches
body=body&Match.Value ‘循环匹配
Next
End Function
调用方法:body(被采集的页面的内容,开始标记,结束标记)

采集程序祥细思路:
1、取得网站的分页列表页的每页地址
目前绝大部分动态网站的分页地址都有规则,如:
动态页
第一页:index.asp?page=1
第二页:index.asp?page=2
第三页:index.asp?page=3
…..

静态页
第一页:page_1.htm
第二页:page_2.htm
第三页:page_3.htm
…..
取得网站的分页列表页的每页地址,只需要用变量替代每页地址的变化的字符即可如:page_<%=”&page&”%>.htm

2、获取被采集网站的分页列表页内容
3、从分页列表代码中提取被采集的内容页面的URL连接地址
绝大部分分页页面里的内容页连接也有固定规则,如:
连接1

连接2

连接3

用以下代码就可以获得一个URL连接集合

Set xiaoqi = New Regexp
xiaoqi.IgnoreCase = True
xiaoqi.Global = True
xiaoqi.Pattern = ””“.+?”““
Set Matches =xiaoqi.Execute(页面列表内容)
set xiaoqi=nothing
url=”"
For Each Match in Matches
url=url&Match.Value
Next

4、取得被采集的内容页面内容,根据”提取标记“从被采集的内容页面分别截取要取得的数据

因为是动态生成的页面,大多数内容页面内都有相同的html标记,我们可以根据这些有规则的标记提取需要的各个部分的内容。
如:
每个页面都有网页标题,用我上面写的MID截取函数就可以获得之间的值,也可以用正则表达式来获得。
例:body(”",”")

asp采集HTML内容常用方法,详讲正则采集_尘缘 Wind Love Ember

我开发过几个采集程序,也研究过很多采集程序代码,所以对采集程序的原理还算是稍微有些了解。
先说一下采集原理:

采集程序的主要步骤如下:

一、获取被采集的页面的内容
二、从获取代码中提取所有用的数据

一、获取被采集的页面的内容

我目前所掌握的ASP常用获取被采集的页面的内容方法:

1、用serverXMLHTTP组件获取数据

Function GetBody(weburl)
‘创建对象
Dim ObjXMLHTTP
Set ObjXMLHTTP=Server.CreateObject(”MSXML2.serverXMLHTTP”)
‘请求文件,以异步形式
ObjXMLHTTP.Open “GET”,weburl,False
ObjXMLHTTP.send
While ObjXMLHTTP.readyState <> 4
ObjXMLHTTP.waitForResponse 1000
Wend
‘得到结果
GetBody=ObjXMLHTTP.responseBody
‘释放对象
Set ObjXMLHTTP=Nothing
End Function
调用方法:
GetBody(文件的URLf地址)

2、或XMLHTTP组件获取数据

Function GetBody(weburl)
‘创建对象
Set Retrieval = CreateObject(”Microsoft.XMLHTTP”)
With Retrieval
.Open “Get”, weburl, False, “”, “”
.Send
GetBody = .ResponseBody
End With
‘释放对象
Set Retrieval = Nothing
End Function
调用方法:
GetBody(文件的URLf地址)

这样获取的数据内容还需要进行编码转换才可以使用

Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject(”adodb.stream”)
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function

调用方法:BytesToBstr(要转换的数据,编码)’编码常用为GB2312和UTF-8

二、从获取代码中提取所有用的数据
目前我掌握的方法有:
1、用ASP内置的MID函数截取需要的数据

Function body(wstr,start,over)
start=Newstring(wstr,start)
‘设置需要处理的数据的唯一的开始标记
over=Newstring(wstr,over)
‘和start相对应的就是需要处理的数据的唯一的结束标记
body=mid(wstr,start,over-start)
‘设置显示页面的范围
End Function
调用方法:body(被采集的页面的内容,开始标记,结束标记)

2、用正则获取需要的数据

Function body(wstr,start,over)
Set xiaoqi = New Regexp’设置配置对象
xiaoqi.IgnoreCase = True’忽略大小写
xiaoqi.Global = True’设置为全文搜索
xiaoqi.Pattern = “”&start&“.+?”&over&“”‘正则表达式
Set Matches =xiaoqi.Execute(wstr)’开始执行配置
set xiaoqi=nothing
body=”"
For Each Match in Matches
body=body&Match.Value ‘循环匹配
Next
End Function
调用方法:body(被采集的页面的内容,开始标记,结束标记)

采集程序祥细思路:
1、取得网站的分页列表页的每页地址
目前绝大部分动态网站的分页地址都有规则,如:
动态页
第一页:index.asp?page=1
第二页:index.asp?page=2
第三页:index.asp?page=3
…..

静态页
第一页:page_1.htm
第二页:page_2.htm
第三页:page_3.htm
…..
取得网站的分页列表页的每页地址,只需要用变量替代每页地址的变化的字符即可如:page_<%=”&page&”%>.htm

2、获取被采集网站的分页列表页内容
3、从分页列表代码中提取被采集的内容页面的URL连接地址
绝大部分分页页面里的内容页连接也有固定规则,如:
连接1

连接2

连接3

用以下代码就可以获得一个URL连接集合

Set xiaoqi = New Regexp
xiaoqi.IgnoreCase = True
xiaoqi.Global = True
xiaoqi.Pattern = ””“.+?”““
Set Matches =xiaoqi.Execute(页面列表内容)
set xiaoqi=nothing
url=”"
For Each Match in Matches
url=url&Match.Value
Next

4、取得被采集的内容页面内容,根据”提取标记“从被采集的内容页面分别截取要取得的数据

因为是动态生成的页面,大多数内容页面内都有相同的html标记,我们可以根据这些有规则的标记提取需要的各个部分的内容。
如:
每个页面都有网页标题,用我上面写的MID截取函数就可以获得之间的值,也可以用正则表达式来获得。
例:body(”",”")

Posted in 技术, 网摘 | No Comments »

« Previous Entries