谈谈网络蜘蛛 爬开心网001的一些体会
-------------
前言
------------
最近在搞自动登录系统的框架。拿开心网001来实验,可是非常郁闷,我发现开心网的html页面是我所见到的所有页面中最不规范的。
水平之烂,第一次见。在php中夹杂Javascript,javascript有使用了php动态生成变量;在div布局中又嵌入table;json格式乱七八糟,根本没有统一的模型规范。
html标签不应该关闭的关闭,应该关闭的开着,几乎就是混乱。
我实在怀疑kaixin001到底能走多远。在几乎摇摇欲坠的架构上面开发,到底还有多少潜力?
虽然整个kaixin001如此之烂,而更令我惊奇是,无论IE、firefox、chrome依然能够正确的解析页面布局。实在佩服这些html解析器的内核,竟然可以容忍这么垃圾的html布局。
-------------
正文
------------
使用网络蜘蛛,首先必然要对html进行对象化,变成html树,然后再根据 class / id,甚至节点的位置获取自己需要的信息。
可以开心网的html如此之烂,采用标准的html规范解析,一定会崩溃的;既然ie的内核能够正确解析这种html,那么我一定可以进行类似的智能修正操作。
首先看一段kaixin001恶心的html代码,找找其中的问题。
<div class="dxx1" style="padding: 15px 10px;">
</div>
<div class="dxx4">
<div class="l50_s" id="icon7">
<a href="/home/?uid=14682889" title="陈晨">
<img src="http://pic1.kaixin001.com.cn/logo/68/28/50_14682889_24.jpg" width="50"
height="50" /></a></div>
<div style="text-align: center; margin-top: -8px;">
<a href="/home/?uid=14682889" class="sl" title="陈晨">陈晨</a></div>
</div>
<div class="dxx5" style="width: 120px;">
<div class="c9 f10">
3月24日</div>
<div style="display: none; border: 1px solid #EEC0C7; padding: 2px 5px 0 5px; color: #EEC0C7;">
群发</div>
</div>
<div class="dxx6">
<table width="470" class="aa" border="0" cellpadding="0" cellspacing="0">
<colgroup>
<col width="463" />
</colgroup>
<tbody>
<tr basestyle="oRowLine2">
<td style="white-space: normal" valign="top" onclick="javascript:clickDirect('/msg/view.php?thread_mid=1871989755&pos=6');">
<img onload='_commentImageResize(this,350);' title="微笑" src="http://img1.kaixin001.com.cn/i/face/2.gif">
<div>
<span class='c9'>共2条会话</span><a href="/msg/view.php?thread_mid=1871989755&pos=6"
class="sl">+展开</a></span> -------- 问题2:没有根据的结束符 </div>
<span class="c9"></span>
<div class="msg_encl" style="display: none;">
<img src="http://img.kaixin001.com.cn/i/enclosure.gif" />
此消息含有0个附件</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="dxx4" style="width: 78px;">
<div>
<a class="sl" href="/msg/view.php?thread_mid=1871989755&pos=6" title="查看该消息">查看该消息</a></div>
<div>
<a class="sl" href="/msg/view.php?thread_mid=1871989755&pos=6" title="回复该消息">回复该消息</a></div>
<div>
<a class="sl" href="/msg/write.php?thread_mid=1871989755" title="转发该消息">转发该消息</a></div>
<div id="Div6" style="display: none;" title="举报不良短消息">
<div class="l">
<a class="sl cp" style="text-decoration: underline;" onclick="javascript:report(14682889,'1871989755');"
onmouseover="javascript:$('reportimg').src='http://img.kaixin001.com.cn/i2/tanhao1.gif'"
onmouseout="javascript:$('reportimg').src='http://img.kaixin001.com.cn/i2/tanhao.gif'"
target="reportspam" title="举报不良短消息">不良短消息</a> </div>
<div class="l mt5">
<img id="Img6" onclick="javascript:report(14682889,'1871989755');" onmouseover="this.src='http://img.kaixin001.com.cn/i2/tanhao1.gif'"
onmouseout="this.src='http://img.kaixin001.com.cn/i2/tanhao.gif'" src="http://img.kaixin001.com.cn/i2/tanhao.gif"
width="14" height="12" alt="举报不良短消息" /></div>
<div class="c">
</div>
</div>
</div>
<div class="dxx7" id="delete7">
<a href="javascript:delThread('1871989755', '0');" title="删除该条消息包含的所有会话">
<img src="http://img.kaixin001.com.cn/i/close.gif" /></a></div>
<div class="c">
</div>
</div> -------- 问题1:这个应该是开始的div的结束符
还有类似的代码,例如:
<input type=hidden name=num_2 value="0">
<input type=hidden name=del_2 value="0">
总之,问题数不胜数。我大概列举一下:
1. 标签是否关闭问题
根据html规范,部分标签是不允许有子节点,例如br / hr / input / img 因此读取到当前节点之后,不会进行嵌套读取。
2. 布局的混乱
在第一个例子里面,
<div class="dxx_of" id="message7" onmouseover="msgOnmouseover(7)" onmouseout="msgOnmouseout(7)"/>
div过早的关闭了,如果按照html规范递推建立节点,则会导致子节点无法正确的建立。解决方法就是,当遇到当前节点是关闭的节点,例如<a xxx />,同时允许带有子节点,则进入递归继续读取。
3. 遇到结束节点
例如第一个例子里面多余的</span>,要解决这种问题,就需要对递归保存递归路径,使用堆栈Stack。当发生递归后,压入当前节点名称到堆栈,所以读取了结束节点,则判断是否在堆栈中出现过,如果没有,自动丢弃。
-------------
结束语
-------------
基本上以上3点,可以处理大部分的html代码了。只是还有一个问题,就是第二点的解决方案。
因为我是默认了可以包含子节点的html标签,忽略关闭记号继续迭代(忽略 />) ,则如果当前节点的确是需要关闭的,那么怎么办??
如果我知道ie的优化算法,估计这个问题可以被解决。
做网络爬虫的人应该占大多数,希望大家给点资料。
转载于:https://www.cnblogs.com/zc22/archive/2010/03/31/1701688.html
谈谈网络蜘蛛 爬开心网001的一些体会相关推荐
- 用C#2.0实现网络蜘蛛(WebSpider)
摘要:本文讨论了如何使用C#2.0实现抓取网络资源的网络蜘蛛.使用这个程序,可以通过一个入口网址(如http: //www.comprg.com.cn)来扫描整个互联网的网址,并将这些扫描到的网址所指 ...
- 网络蜘蛛Spider 工作原理
网络蜘蛛 Web spider (或称 Crawler)是一种能够跟踪网络上超链接结构,并不断进行网络资源发现与采集的程序.作为搜索引擎的资源采集部分,Web Spider的性能将直接影响到整个搜索 ...
- 关于网络蜘蛛以及搜索蜘蛛爬行
当"蜘蛛"程序出现时,现代意义上的搜索引擎才初露端倪.它实际上是一种电脑"机器人"(Computer Robot),电脑"机器人"是指某个能 ...
- 转帖不会乱码的,powershell网络蜘蛛
抓取(爬取)网上信息的脚本程序,俗称网络蜘蛛. powershell中自带了这样的两个命令,[Invoke-WebRequest]和[Invoke-RestMethod],但这两个命令有时候会乱码. ...
- 搜索引擎(网络蜘蛛及搜索引擎基本原理)
2006-05-25 网络蜘蛛及搜索引擎基本原理 TAG:搜索相关 搜索引擎的工作原理大致可以分为: 搜集信息:搜索引擎的信息搜集基本都是自动的.搜索引擎利用称为网络蜘蛛(spider)的自动搜索机器 ...
- 网络爬虫(网络蜘蛛,网络机器人)与Web安全
网络爬虫概述 网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定的规则自动抓取万维网资源的程序或者脚本,已被广泛应用于互联网领域 ...
- NetSpider 网络蜘蛛1.0 的简介
NetSpider 网络蜘蛛1.0 的简介 支持多线程下载和 自动断点续传.特别适合对网站上的图象文件进行自动下载,是图片 搜集者的利器.详细的使用说明见: 网络蜘蛛是一个自动搜索HTML页面并下载指 ...
- 搜索引擎中的网络蜘蛛技术探析
摘要:搜索引擎技术可以从海量的 网络 信息中获得我们想要的信息,随着网络信息资源的急剧增长其作用越来越显著.本文介绍了搜索引擎技术中的网路蜘蛛,分析了其对文件的处理方法,研究了其搜索与更新策略. 关键 ...
- 建立网络链接编程C语言,用C语言编写一个网络蜘蛛来搜索网上出现的电子邮件地址...
可能大家经常要去互联网上搜索特定的内容,比如收集大量邮件地址,如果用google之类的搜索引擎是没法实现这种特定功能的,所以用C语言来写一个吧.它的功能就是不断去取得网络上的页面,然后分析出网页上出现 ...
- 中文搜索引擎技术揭密:网络蜘蛛
[e800.com.cn 专稿]搜索引擎一直专注于提升用户的体验度,其用户体验度则反映在三个方面:准.全.快.用专业术语讲是:查准率.查全率和搜索速度(即搜索耗时).其中最易达到的是搜索速度,因为对于 ...
最新文章
- 转:性能测试中的性能测试指标与用户体验分析
- Java基础点——面向对象(中)
- django 的ORM
- mysql left join两个表,mysql left join 多个表
- mysql从节点放家里_添加MySQL 5.6 从节点 Slave
- ArcEngine在个人地理数据库下创建要素类
- oracle凭证编号,R12 AP模块的发票过账后如何关联对应的凭证编号
- matlab遗传算法 系统辨识,基于遗传算法的控制系统的系统辨识
- Java关于数字的正则校验
- 黑道圣徒3如何去掉马赛克
- liang-Barskey算法
- python右对齐输出乘法表_python输出九九乘法表
- openstack kolla 安装报错
- OpenSSL文档阅读笔记-RSA Encryption Decryption Example with OpenSSL in C
- 亚马逊个人创业这条路行的通吗?
- 自动化办公:1、文件自动化处理邮件批量处理
- 达梦数据库:备份 冷备与热备
- Java使用itextpdf生成PDF文件,用浏览器下载
- matlab saveas使用报错:错误使用 matlab.graphics.internal.name (line 101)
- 大陆房价将跌回10年
热门文章
- php json_encode不要反斜杠,【json+encode让URL内容斜杠+不转义】
- 符号_变压器电路图符号大全
- 利器 | REST Assured 实践(二):断言实现
- 9.2-Scrapy框架爬虫【进阶】-spiders用法
- 大数据压缩处理:数据分卷压缩和分卷压缩解压
- python足球作画
- Nuvoton M031-时钟树
- 家用 NAS 服务器(2)| HyperV的Winserver 2022和Ubuntu 22.04双系统
- android 标准时间格式,android开发中关于含有中文字段的格林尼治标准时间的时间格式转换...
- mysql truncate分区表_MySQL分区表的管理~1