首先要声明:虽然这是互联网行业的一个普遍现象,但本文讨论的内容,与我所在的公司和所从事的行业无关。
事情的起因是在一个讨论 yaf 的 qq 群有人问如何抓取某网站内容,比如这里。我得说,这个网站在防采集和防抓取方面一直做得很出色。当然更出色的是他们运营的内容的价值。
在几年之前,我就探索过这个问题。对内容的数字、标点进行部分图片化,并且不是固定图片。URL 甚至 md5 值都是变化的。那么最基本的思路就是图像内容的识别。
例如这是其中一个放大了 5 倍的数字:。蓝色背景是我手工加上去的,因为还有这样一个图:,你会发现原来同样的内容的图中还会有干扰点和偏移量的存在。那么难道真得要祭出像 opencv 这样的神器吗?其实,用一个采样/阈值匹配的办法,用 php 和 gd 库就可以实现一个简单的图像识别。
这里是一个实现:https://gist.github.com/3003825
代码很简单,不多解释了。思路其实就是对已知图像进行采样,然后根据采样计算未知图片的匹配度。如果高于匹配阈值,则认为匹配。偏移我没处理,所以匹配阈值要低一点。
至于内容爬取,图片下载,图片识别,内容替换,我就不用再说了吧?
另外,本来就是玩具性质的代码,我可以给大家一些思路来改进:
- 如何加快匹配?
你认为需要 100% 采样有多大必要?在实际应用中,除非需要非常精确的区分两个图片,否则这个必要性为 0。那么降低采样精度带来的好处,就是提升效率了。
- 阈值怎么得到?
我默认提供了 0.8 这个阈值。说白了,是我猜的。最好的办法是你准备一票相同内容,的不同页面的图片素材,然后分别采样。根据每张图片的采样,计算匹配度。得到的最小的匹配度用作阈值就 OK 了。
- 这有什么实际意义?
其实没什么实际意义,对于一些人或者公司,这是大批量采集类似的防采集数据的办法。而对于那些没有这方面业务需求的朋友来说,这就是初步的机器学习的训练、识别过程。在不同的实例中,将采样算法、匹配算法加以替换,就能得到响应的结果。Siri 应当足够令你们印象深刻了吧?
如果你突然悟到点什么,那我这篇杂文也就算没白写了。
Leave a Reply