关于抓取大众点评商户评论的爬虫那点事

第一波更新:更新时间:2020/03/01
没想到才完成两天就发现了bug,再加上之前有两点内容忘记说,就一起更新了。
更新内容:
1.修复已知的bug。bug主要出在主程序的逻辑问题上,还有一个是关于输出保存到txt文件的代码,请拉到下面查看详细。
2.增加输出排版
补充说明:
1.之前在查资料的时候,看到有文章说大众点评实际上是有两种CSS加密的方式,并且时不时会更换,不过两种方式其实差别不大,知道了一种另一种自然就懂了。由于我这几天写程序和测试程序都没遇到第二种加密方式,在文章里也没分析,有兴趣的自行找相关文章吧。
2.程序中使用了随机的User-Agent,也算是在为避免封IP做一点贡献

一、序言

开局划重点,本程序更新于2020/02/28,之后大众点评估计如果又出了什么新的反爬技术了,本文可能就不适用了。

很久之前就听过爬虫,但都没有自己亲手去写过,前几天有朋友突然来问我会不会爬虫,并想要我帮他爬点东西,我也就趁此机会来尝试一下,便接下这个任务,实操一下爬虫这个东西。

任务:
抓取大众点评某个商户的所有评论

众所周知,程序员写代码的第一步就是打开某大型同性交友网站,我也先百度查了一些已有的文章了解一下,发现写这个爬虫主要的难点在于:

  1. IP被封
  2. 评论的内容被加密
  3. 时不时跳出来的验证码

对于封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接下来上代码。

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值