爬虫如何处理重复抓取的网页?

2013-02-27 12:55:47 +08:00
 laskuma
入门开始写一个爬虫。在爬进一个地址之前是不是需要检测那个地址是否被爬过呢?
检测的时候一般用什么方法呢?暂时能想到的是用HashMap.
6700 次点击
所在节点    问与答
17 条回复
fishsjoy
2013-02-27 13:13:52 +08:00
bloom filter
xingzhi
2013-02-27 13:15:37 +08:00
hashMap是可以,但相对而言耗内存。
如ls所说,用布隆过滤器较好。 吴军的书 《数学之美》中有详细的介绍。
twm
2013-02-27 13:15:45 +08:00
做一个redis集群,或者memcache集群,bdb也行,抓取过的就扔进去,每次要抓取的时候检查一下。
xingzhi
2013-02-27 13:17:38 +08:00
很久前收藏的一篇文章, 你可以看看:
http://www.xiuwz.com/site/tech-bloom-filter/
laskuma
2013-02-27 13:22:31 +08:00
@xingzhi 多谢分享!
forest520
2013-02-27 13:47:37 +08:00
@fishsjoy
@xingzhi
@twm 很多情况下,一个相同的网页可以有很多不同的URL地址,譬如加上一些识别来源的动态参数等,这种情况有什么办法识别是重复的URL?比如:
item.taobao.com/item.htm?spm=1020.3.9.79.4L0esQ&id=15480553483&from=
item.taobao.com/item.htm?id=15480553483
其实是一个网页。
xingzhi
2013-02-27 13:57:22 +08:00
@forest520
我觉得这个就没有万能的解决方案了,得视网站而定。
如你举的例子,可以先找出taobao究竟是以什么参数来决定这个页面的。
这里是id, 那就在获取url后,抽取出id来进行二次判断。
laskuma
2013-03-01 13:31:13 +08:00
@xingzhi 还想再问一个问题 如何获取tinyurl的真实url呢? 我在java下用getresponcecode拿到的是200不是301= =
crazybubble
2013-03-01 16:44:31 +08:00
@laskuma python里的方法是,urllib2.urlopen("http://bit.ly/XKqphv").geturl()
crazybubble
2013-03-01 16:58:00 +08:00
@laskuma java里你可以用HttpURLConnection建立链接,然后getURL()
laskuma
2013-03-01 20:46:57 +08:00
@crazybubble 机制不同 获取的还是tinyurl
binux
2013-03-01 21:17:29 +08:00
真没必要用什么bloom filter,就算你爬一千万个页面,那已经很厉害了,哈希一下全放数据库里,MYSQL什么就行,内存数据库都不需要,每次查一下,没任何问题。
laskuma
2013-03-01 21:32:01 +08:00
@binux 正好不会写 也就练练手了
crazybubble
2013-03-01 21:33:19 +08:00
@laskuma ...这就奇怪了,我试了下tinyurl,能得到原地址
clowwindy
2013-03-01 21:34:37 +08:00
hash 一下存 redis
laskuma
2013-03-02 02:28:35 +08:00
@crazybubble http://tinyurl.com/at3p3en 能帮忙测试下吗?我这个网址不行
laskuma
2013-03-02 02:36:04 +08:00
@crazybubble 解决了。。我一connect()就立刻call 的get url。所以给出的还是原来的url 谢谢了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/61452

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX