返回信息流如题:
在一个站内通过连接抓取一系列的网页。必定存在页面1和页面2中都有指向页面3的超链接。怎样才能抓取一遍页面3.
我的初步想法是,广度优先遍历,记录唯一一个Url列表。每次遍历结束后,清洗Url列表以保证Url的唯一。最后数据规模在50000-1000000;可能要自己的小机器来跑。有什么好的建议。在存储结构,遍历算法,清洗算法等等方面吧。
这是一条镜像帖。来源:北邮人论坛 / search-engine / #7008同步于 2008/5/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SearchEngine机器人发帖
如何保证抓取数据不重复
yingxinghuan
2008/5/28镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
你这个只是最简单的网页消重 URL的唯一性 你这个数据规模没必要考虑效率问题 重复的删就OK 另:一般url前面很大一部分都是重复的 忽略相通部分,直接比较特征位
建议:考虑程序可靠性,如果程序停止是否能从最近的正常状态重启动继续抓取。
1. 广度优先遍历
2. 使用hash判重,hash表保存已抓url
3. 内存维护一个URL队列,如果队列满,则将新url存到硬盘文件。
4. 抓到网页解析url,查url是否在hash表中,如果不在,把该url加入URL队列
5. 把所有已知url,包括已抓url和待抓url,存到磁盘
6. 程序重启时,可以从磁盘读取已抓url和待抓url,恢复url队列和hash表
【 在 yingxinghuan 的大作中提到: 】
: 如题:
: 在一个站内通过连接抓取一系列的网页。必定存在页面1和页面2中都有指向页面3的超链接。怎样才能抓取一遍页面3.
: 我的初步想法是,广度优先遍历,记录唯一一个Url列表。每次遍历结束后,清洗Url列表以保证Url的唯一。最后数据规模在50000-1000000;可能要自己的小机器来跑。有什么好的建议。在存储结构,遍历算法,清洗算法等等方面吧。
恩。谢谢你的答案。下去试试。
【 在 sunmoonstar 的大作中提到: 】
: 建议:考虑程序可靠性,如果程序停止是否能从最近的正常状态重启动继续抓取。
: 1. 广度优先遍历
: 2. 使用hash判重,hash表保存已抓url
: ...................
还有两个问题,
1.多线程抓取能不能提升速度。(我的是htmlunit,java版)真的不快。还感谢你上次那贴的解答,抓一个页需要去请求两次。很痛苦。
2.这个htmlunit好像对多线程支持的不是很好,做了个多线程小demo结果每次MultiThreadedHttpConnectionManager线程都停不下来。这是为什么?
2.5 有没有别的替代工具?主要是能分析特定的标签内的内容。最好是能带自动抓取的。嘿嘿~
【 在 sunmoonstar 的大作中提到: 】
: 建议:考虑程序可靠性,如果程序停止是否能从最近的正常状态重启动继续抓取。
: 1. 广度优先遍历
: 2. 使用hash判重,hash表保存已抓url
: ...................
1 多线程可以提升速度。在带宽允许的情况下,开100个线程试试。
上次那个不是抓一个网页要请求两次,而是为了获得数据要抓取两个网页!
2&2.5 没用过htmlunit,只用过一个叫jobo的东西。
http://www.matuschek.net/jobo/
线程不能停下来,可能是你的程序编错了。
【 在 yingxinghuan 的大作中提到: 】
: 还有两个问题,
: 1.多线程抓取能不能提升速度。(我的是htmlunit,java版)真的不快。还感谢你上次那贴的解答,抓一个页需要去请求两次。很痛苦。
: 2.这个htmlunit好像对多线程支持的不是很好,做了个多线程小demo结果每次MultiThreadedHttpConnectionManager线程都停不下来。这是为什么?
: ...................
【 在 sunmoonstar 的大作中提到: 】
: 建议:考虑程序可靠性,如果程序停止是否能从最近的正常状态重启动继续抓取。
: 1. 广度优先遍历
: 2. 使用hash判重,hash表保存已抓url
: ...................
larbin的设计啊