最近写了一个爬虫框架,自认为在功能上已经比较强大了,只要你浏览器可以看见的东西,自认为都可以爬取下来。但是至于到底能不能爬取到有用数据,个人认为主要看使用者能力。

朋友告诉我大众点评网站有反爬限制,我特意去看了下大众点评反爬机制。页面上显示的手机号,但是在浏览器f12里面却只能看见一个个方框。

但是右键查看源码时,可以看见如这样的字符。我将源码复制到编辑器中,一点一点删除js后进行预览,发现&#x开头的字符依然能够显示成数字。直到我删除完所有的js,页面依然可以渲染成数字。然后我开始删css,最后把范围缩小到一个css文件中的几行样式之中:
image.png

我删除其中任何一行,都会导致页面无法渲染,而此样式其实就是指定了一个字体。我下载了woff后缀的文件,直接记事本打开是乱码。网上百度发现可以用fontcreator软件打开字体文件。我打开之后内容如下:
image.png

然后随便查看了一个字的详细信息:
image.png

箭头指向的字符串不正是我html中的内容吗?
image.png

我还测试了大众点评上其他的一些中文,部分汉字也是使用字体文件渲染出来的。而字体文件中的字符有六百个左右,所以自己写一个映射表,然后将字符串映射为对应字符是最有效的方法。

其中网上还有一部分教程说是使用svg图标生成的文字,但是我测试中没有发现,或许最新版的大众点评早已经修改了。另外,网上一大堆说&#开头的字符串后面跟的十六进制数字是汉字对应的某种编码的。但是经过测试,我并没有找到常用的编码可以与之对应,所以别想直接通过解码的方式解决了。

Q.E.D.


擅长前端的Java程序员