Python字体反爬
前些日子,爬取起点中文网的过程中,发现代码没有错,是根据书上的教程来的,结果爬下的小说字数不对,百思不得其解。
百度了一下终于知道这是反爬虫。
首先来看一下反爬虫的概念:
网络爬虫,是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。
但是当网络爬虫被滥用后,互联网上就出现太多同质的东西,原创得不到保护。
于是,很多网站开始反网络爬虫,想方设法保护自己的内容。
他们根据ip访问频率,浏览网页速度,账户登录,输入验证码,flash封装,ajax混淆,js加密,图片,css混淆等五花八门的技术,来对反网络爬虫。
防的一方不惜工本,迫使抓的一方在考虑成本效益后放弃
抓的一方不惜工本,防的一方在考虑用户流失后放弃
参考: 美国高级情报官员透露,美国国家安全局前雇员斯诺登仅仅是利用普通的网络爬虫软件(Webcrawler),从国安局网络里面截取大量的机密文件与资料.
反网络爬虫:越来越成为一种新的行业
反爬虫概念 。(词条来自百度百科!)
由此可以判断是对面的网站做的反爬虫措施了,通过百度知道这是字体反爬虫。什么叫字体反爬虫?
字体反爬虫:在网页中的关键部分中采用自定义的字体来显示,防止爬虫爬取到关键信息。
采用自定义字体文件是CSS3特性,可参考CSS3字体。
这是网友的见解。(ps:比我高明多了)
字体反爬也就是自定义字体反爬,通过调用自定义的ttf文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容!
总结字体反爬虫有三种方法:请让我一一道来:
- 自定义字体文件。字的在字体文件中的编码固定不变,唯一对应。这样爬虫采集到信息在关键处就会显示乱码。
别以为万事大吉了,破解这可是小菜一碟。(当初拦了我一个星期/哭脸)
破解之道:通过fonttools(python工具)将ttf文件转成ttx文件打开后,就可以看到编码与字的对应关系,然后嘛,就把网页中的乱码部分的“编码”替换成对应的字。大功告成了!
- 好吧,你利害 ,那我再升级就是了。让字的编码随机变化,但字体信息不变,浏览器渲染出来的字还能正常显示,同时每个网页加载时都随机自带一套字体。这样,每个字的编码顺序都是变化的,就无法用替换的方法来解决了。
千万别得意,这样的方法也不是万能的!虽然我们打乱了关键字的编码顺序,但是每个字对应的字体信息是不变的,字体中的字的每一笔划都有相应的x、y坐标信息,浏览器正是根据这些笔划信息渲染出对应的字的,看图:image.png
爬虫先手动下载了一个ttf文件,然后根据ttf文件中的文字图形位置在爬虫代码中做一个映射,然后使用程序动态获取采集信息,使用fonttools来循环对比本地之前下载的标本中的字体信息,对比一直,那就是某一个字,如此一来,反爬就轻松被破了。
- 这样也不是万能的嘛,Python有个库叫Selenium,可以驱动浏览器进行爬取,而且爬取的内容是基于浏览器已经渲染后的结果,这样就不会遇见乱码的情况了。但代价就是驱动浏览器进行爬取比较慢。时间成本就上升了。(已经有朋友成功了)还有就是ocr 识别了(这个只是听说,并不了解,这里就不作阐述。)
PS:本文主要借鉴反爬终极方案总结—字体反爬
如有侵权,请及时联系本人。