(同步个人博客 http://sxysxy.org/blogs/28 到csdn
写一个网络爬虫
写一个网络爬虫,来获取一个网站上感兴趣的信息。
最基本的模型
- 就是图。每个页面看作一个节点,若页面A有到达页面B的链接,则添加一条由A到B的单向边。爬虫要遍历这张图。
遍历这张图
- 广度优先搜索即可。 不推荐用深度优先搜索(容易陷入单个分支而难以搜索到更广泛全面的信息) (如果不明白,请自行查询图论相关资料)
(以上noip普及组难度)
但是细节(重点)
1 这不是OI题目,不会把节点以编号的形式给你。 一个页面只能通过它的网址认识它。由网页之间的关系构成的图中很可能(99.99…%)有环,搜索的时候要判重否则就会死在环里面。一个网址,是一个字符串,代表一个页面,如何快速判重? 字典树!
2 如何知道页面A有到达页面B的链接? 抓取页面A的网页源代码分析即可。重点便是html语句例如
href= "/blogs/3"
,表示A能到达页面/blogs/3/3 访问网络。windows: winsock2.h系列, linux: sys/socket.h系列。用TCP Socket简单地实现http即可。
一个简单的实现
https://github.com/sxysxy/httpSpider 这里我使用c语言做的一个简单的网络爬虫(已经完工)。 同时里面还有字典树和队列数据结构的实现。 httpSpider爬虫搜索遍历网站的同时,可以回调自定制的plugin.dll外挂dll的analyzer函数,将网站的数据发给它(这样泥就可以完成数据分析)。
本来想写个长篇大论的
但是比起什么可持久化树套树啊,FFT/NTT啊,这个真的没什么可多说的。