Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29308235
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2010-02-08 21:45:14

天涯在线是我国最大的论坛社区,无论论坛的在线人数、帖子质量数量,其他论坛都难以望其项背。
  以天涯旅游版为例,一个质量稍微好一点的帖子,其长度约有10余页,2000多个楼主发帖和其他用户的回复。很多时候,回复的内容中很多是垃圾留言,甚至是无关的广告帖子。
  这里开发一个网页过滤器对天涯帖子进行过滤,处理后的帖子只剩下楼主的跟帖。
 
  主要使用python的正则表达式来实现网页元素的识别、替换和删除。
 
   结果在这里演示:
   测试例子:
   python cgi地址: (google的apps engine)
   演示URL  
 
   过滤的原理为,让对进行访问,分析其html源码输出,将非楼主部分的回帖剔除掉。同时,帖子上如果有分页,则对分页按钮的目标href进行替换;如果帖子上有表单form,则分析表单字段,改变表单的target为 脚本。
  
  处理的主要过程为:
 
  1.识别楼主:
 
   帖子代码片段:
<!-- 天涯百宝箱 -->
<script>
var chrType = "public";
var intAuthorId = "";
var chrAuthorName = "GreyHouse";
var chrTitle = "[光影记录]跳蚤的欧洲之行";
var chrItem = 'travel';
var intItem = '0';
var intArticleId = "191157";
var tAuthor = 'GreyHouse';
script>
 
  使用以下的正则表达式来找到楼主
   reg_louzhu = re.compile('.*chrAuthorName = "(.*?)"; '
   
  设mat为reg_louzhu.match(网页源码html行);
  则mat.groups()[0] 为楼主名字 GreyHouse
 
2. 识别一个帖子的起始位置
   继续分析html,发现天涯回帖一般都是用作者信息栏作为帖子的起始,那么帖子的尾部就是下一个作者信息栏之前咯。
<TABLE cellspacing=0 border=0 bgcolor=f5f9fa width=100% ><TR><TD WIDTH=100 ALIGN=RIGHT VALIGN=bottom>TD><TD><font size=-1 color=green><br><center>作者:<a href="/browse/Listwriter.asp?vid=11288815&vwriter=开着坦克逛街&idwriter=0&key=0"     target=_blank>开着坦克逛街a> 回复日期:2009-1-8 14:32:38font> center>TD><TD WIDTH=100 ALIGN=RIGHT VALIGN=bottom> TD>TR>table>
 
使用如下表达式来识别作者信息栏和作者的位置:
pat_vwriter=re.compile(r".*
 
同理,match对象的grous()[0] 是回复作者。
 
如果发现匹配,就可以得到回帖作者的名字以及回帖的起始位置。
后续的处理为:
        如果回帖作者是楼主,那么连续输出其回帖内容
        如果回帖作者非楼主,删除其回帖内容
 
3. 实现分页按钮href替换
 
  帖子上有分页功能的按钮,如果不处理,那么点击分页后又会跳回原天涯页面上。所以,这里要做到识别分页href连接,然后替换这个连接。
  分页功能按钮的href相关源码如下:
<a    href=><font color=#246cae>下一页a>
  正则表达式 pnext=re.compile("]*?)>]*>下一页")
  使用
filtered_html    = pnext.sub(r"<a href=\1><font color=#246cae>下一页font>a>",filtered_html)    
 
 其中\1表示正则表达是匹配后,匹配结果中的组1,既是
  上述替换的结果为,把 原来
<a    href=><font color=#246cae>下一页a>
换成了
<a    href=><font color=#246cae>下一页a>
 
这样就实现的连接的重新替换。
 
4 form对象的替换。
 
  和连接href对象的替换类似,也是使用睁着表达式来识别
....
这样的元素,然后把部分表单元素或者整个表单替换掉,从而实现自己的目的。
 
  有兴趣的读者可以进行选择一个html页面,用正则表达式进行过滤,实现自己喜欢的功能。
  一般功能有:
 网络钓鱼:
  1. 选取一个银行网站,分析其关键部分(登陆)部分的Form。
  2. 用自己网站上的脚本进行处理,将其Form部分重定向到自己网站上。
  3. 申请和银行类似的域名,伪装链接并将链接发送给水鱼。
  这样做效果比建立一个钓鱼网站所花的功夫可能要少,而且还会随着目标网站的更新而更新(因为都是从目标直接拉取页面)。缺点是url可能比较长,容易引起怀疑。
 广告去除:
  分析广告特征html代码,将广告部分去掉。
 
  Google appengine 支持用户申请500M的网页空间,允许在上面运行python脚本,并提供相应的URL、数据存储、图片处理的API。方便学习者在上面创建各种有意思的应用。如感兴趣请访问 ,申请方便,只要你拥有一台联通号码的手机用于接收验证短信即可。
  随后附上我google apps上的天涯html过滤脚本。
阅读(1005) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~