第一波更新:更新时间:2020/03/01
没想到才完成两天就发现了bug,再加上之前有两点内容忘记说,就一起更新了。
更新内容:
1.修复已知的bug。bug主要出在主程序的逻辑问题上,还有一个是关于输出保存到txt文件的代码,请拉到下面查看详细。
2.增加输出排版
补充说明:
1.之前在查资料的时候,看到有文章说大众点评实际上是有两种CSS加密的方式,并且时不时会更换,不过两种方式其实差别不大,知道了一种另一种自然就懂了。由于我这几天写程序和测试程序都没遇到第二种加密方式,在文章里也没分析,有兴趣的自行找相关文章吧。
2.程序中使用了随机的User-Agent,也算是在为避免封IP做一点贡献
一、序言
开局划重点,本程序更新于2020/02/28,之后大众点评估计如果又出了什么新的反爬技术了,本文可能就不适用了。
很久之前就听过爬虫,但都没有自己亲手去写过,前几天有朋友突然来问我会不会爬虫,并想要我帮他爬点东西,我也就趁此机会来尝试一下,便接下这个任务,实操一下爬虫这个东西。
任务:
抓取大众点评某个商户的所有评论
众所周知,程序员写代码的第一步就是打开某大型同性交友网站,我也先百度查了一些已有的文章了解一下,发现写这个爬虫主要的难点在于:
- IP被封
- 评论的内容被加密
- 时不时跳出来的验证码
对于封IP来讲,在IP被封之前,可以设置每抓取一个页面之后延迟一些时间,我设置了延时10-25秒,这个设置其实已经可以很大程度上避免IP被封了,假如IP还是不幸被封,那只能去找代理(一般要花钱,有钱就能为所欲为)。
对于评论的内容被加密,这个是这篇文章讲的重点内容,后面详述。
对于时不时跳出来的验证码,大众点评的验证码不止一种,但是都是类似于滑块这一类的,涉及坐标计算之类的,我没有详细了解(以后有空再搞这个 )。更恶心的是对滑动速度还有要求,我在手动划的时候划的太快也不给通过,嘤嘤嘤。
二、网页分析
打开大众点评的评论页面之后,看着页面十分正常,于是一如既往开局就是一个F12,发现大众点评的程序员太实诚了:
这注释感觉有点瞧不起我们爬虫的(虽然你们确实牛× )。。。
定位到评论所在元素之后,开始懵逼 就看到评论内容是这样子的!
仔细观察就可以发现一个svgmtsi标签实际上就是对应着一个字,与这个标签唯一有关的也就只有一个class,于是查看这个标签的CSS,发现这个标签实际上就是一张图,图片来源于一个链接://s3plus.sankuai.com/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/ba86a6e2e1726aac5aefe7599d8de8d8.svg,当然就需要打开这个链接看一看呀!
是一整页的字,到这里,好像开始有头绪了,html页面缺少的字,都是来自这个svg页面,就差个什么东西将这俩东西联系起来了。
没错,关键就在svgmtsi标签的类,我们找到相应的CSS文件,结果在那里面有重大收获:
你看这URL它又细又长,是不是有点眼熟,这不就是满满一页字的那个链接嘛;而且还有超多的以hpq开头的class,里面对应一个坐标值,这么看来,一切都明朗了,大众点评评论的文字替换成图片的原理是这样子的:
1.把svg页面加载出来,这里可以把这个页面理解为一张图
2.当网页解析到svgmtsi标签的时候,根据类名(例如上面的hpqvv8)找到对应的属性和属性值,其中属性值实际上就是坐标,设为x和y(例如hpqvv8对应的坐标就是x=294和y=3095)
3.根据坐标值对svg页面进行移动即可显示相应的字
而我们要取得相应的字,第三步就会有所不一样,容我先用下面一张图来解释:
第一步:y的值和M0的值比较,找到对应的第几行,如图:当2948<y<2989时,则对应第73行。
第二步:找到对应的那一行。图凑合着看,就不截长图了。
第三步:x起作用了,x的值除以14(字号是14)就是对应的第几个字,例如图里的“饮”字,对应的x值就是42。
找到对应的字了,最后直接替换掉原本的标签就行了。
OK接下来上代码。