前序:
这两天写了一个关于采集大众点评评论的爬虫,写的时候遇到了不少的坑,当然也学到了不少,有一定的收获;就写个教程来巩固一下。
现在无论爬那个网站的数据,基本都会碰到相应反爬机制,问题的关键在于反爬机制的强弱;这次爬取点评评论时主要遇到了css机制反爬问题:
正文:
首先我们打开大众点评内其中一个店铺的页面,找到评论的面板,打开开发者模式(按下F12键),用选择工具选取指定的评论区与相应的源码进行对比,会发现一个问题,就是源码中的评论不全:
源码中的评论并不是一句话连起来的,而是一个字一个字间隔出现的而且会出现字符缺失的现象,中间会出现相应 <span class="yscak"></span>标签的出现,而标签 span内的class标签文字的替换就是这次破解反爬的关键,
我们第一次碰到这个东西肯定是蒙蒙的,我们可以尝试点一下span标签,看会有什么发现;点进去会发现源码的右边会出现关于这一元素的基本格式:位置、大小、字体大小等,里面还会有个url:
图2
url点进去会出现类似于class="yscak"标签的隐藏文字:
但是我们需要找到文字的替换规则,打开这个网页的源码:
这里要有两个点需要我们注意:一个是文字的大小font-size,另一个就是每一行都会有一个y标签会对应一个数值;这里我看了网上的一些教程,了解到与这两个点对应的就是图二中下标签内元素对应的background对应的两个位置元素(区别是位置元素里面的数值是负值);定位规则就是第二个元素对应的是y值决定该class标签替换的元素在哪一行,而第一个元素数值与文字大小之比对应的是这一行的第几个即为偏移量,从而形成映射关系;
为了读者们更加明白上面这句话,我这里以为例,从图中可以看到它对应的文字是“盗”,它的background对应的是:-322.0px -572.0px;
接下来打开标签对应url,打开对应网页的源码:
接下来就是需要找到与标签相对应的文字了,-572px说明元素位于包含572哪一行,从源码中对应的就是y = "595"那一行,然后通过第一个位置元素数值计算偏移量: 322/14 + 1 = 24(因为文字大小为14px所以需要除以14),验证即为所得:
基本总结:
下面就是这个爬虫整个基本流程:
找到评论中class属性标签对应替代文字url;
根据y标签数值以及文字偏移量,化成对应元素位置格式,写出文字与元素位置所对应的映射关系:
访问class标签对应的位置元素数值(在评论源码中就能找到相关url的链接),形成class标签元素与位置元素数值对应的映射
然后就是通过以上的一一映射,可以把class标签元素与文字进行替换;
然后通过select或者xpath等方法来提取评论;
这里还需要注意一点,就是大众点评评论需要登陆才能够爬取,这里解决的方法比较简单就是先登录,获取cookies,添加到requests里面再进行爬取,但是一般爬取200页的时候会现滑块验证;所以可以准备一个相关cookies池让里面的cookie轮流访问;
代码部分:
获取class标签对应的位置元素url(以.css结尾的):
构建class标签元素与位置元素数值对应的映射关系:
构建隐藏文字与位置元素数值对应的映射关系:
进行class属性元素与隐藏文字的替换:
我把爬取的数据都存入Mongodb数据库中,爬取结果如下:
想获取本次教程的完整源码,关注微信公众号:小张Python,后台回复“大众点评”即可获取。
网友评论