当前位置: > python爬虫 >

编写python爬虫爬取汽车之家
栏目分类:python爬虫   发布日期:2019年03月12日 19:23:06   浏览次数:

 大家好,我是爱吃苹果的宇文拓。今天我给大家带来的是关于汽车之家网站的爬虫


  前面我介绍了一些反爬技术,比如字体反扒技术。今天的目标网站(汽车之家)就利用到了这个反爬技术。

我们今天就以这个网页链接为例:https://club.autohome.com.cn/bbs/thread/886724929e48cff9/78533969-1.html#pvareaid=6825493我们爬虫这个页面的文章内容。



我们打开F12用开发者工具查看element选项卡。可以看到有些文字被替换成口这样的字样。我们通过程序抓取到的内容也是这样的。所以这样的信息会导致我们无法阅读,会影响后续的处理。



我在这里简单阐述一下解决思路。了解前端知识的朋友肯定会发现,这个口字字样的文字的样式为myfont的字体文件。说明这个字是自定义字体。我们打开网页源代码可以发现字体文件的链接。



是不是我们拿到这个文件,然后在对应里面的文字所对应的编码,然后在正确替换就行了呢?这个思路是正确的,当时我也是这样想的,但是测试发现后,该网站有多套字体。每次请求网页所使用的字体文件可能不一样,这就导致我们不能确定使用哪个映射关系。是不是就没有解决办法了呢?答案是否定的
      我研究了一段时间字体文件发现自定义字体文件其实是将字形对应相应的编码。我们将下载好的字体文件转换为xml文档






然而我研究xml文档发现每个具体文字对应一个unicode编码,不同的字体文件中同一个汉字对应的unicode编码可能不一样。但是通过xml我们发现每个编码对应相应的字形。其实所谓的字形就是很多点的坐标,然后这些点又构成相应的线,从而构成一个汉字。虽然不同的字体文件中每一个汉字的编码可能不一样。但是只要编码所对应的字形一样,那我们就可以通过字形不变的特点就可以建立映射关系了

  到达这里我的总体思路是这样:随机获取一套字体文件,手动建立编码与具体汉字的映射关系。然后每次请求网页的时候拿到当前的字体文件,通过字形不变的原理以及我们先前建立的映射关系,找到当前字体文件中编码与汉字的映射关系,然后在将网页中的unicode编码替换为正确的汉字。





我照着这个思路做了一遍,原本以为大功告成了。但是发现还是不行,我最后仔细研究xml文档发现,汽车之家论坛版块的字体文件不仅会变,而且字形也会改变。那是不是就没有解决办法了呢?当然不是,我研究了一段时间发现,其实字形就是有很多点构成了,虽然这些点不一样,但是他们的x,y坐标都是在一定误差范围内。



因此,到这里我们就有思路了,只要遍历每个汉字的字形然后在获取到他们的点的数量,以及具体点的x,y坐标判断它们相差的范围在一定范围内,是不是就可以判断为同一个汉字呢?
理论上是可行的,但是也可能出现误差,但是这个误差在我们的承受范围内。我研究发现 我吧误差控制在40以内,然后或者到的结果也很准确。接下来就是源码。











下面是程序运行效果图




总结:今天我们学习了如何解决字体反扒技术,以及关于字体反扒技术的原理。通过汽车之家论坛版块的一遍文章为例,演示了整个反反爬技术的实现。大家好好研究一下,最重要的是要明白其中的原理。另外在建立基础映射关系的时候推荐大家一个工具FontCreator,这个工具可以打开字体文件,然后可视化编码与文字的映射关系。

相关热词:

热门关键词
     
python教程 python爬虫 python人工智能 Python+大数据 python问答