本次爬虫的爬取目标是大众点评上的一些店铺的店铺名称、推荐菜和评分信息。

一、页面分析

进入大众点评,然后选择美食(http://www.dianping.com/wuhan/ch10),可以看到一页有15家店铺,而除了店铺的名称,还能看到店铺的地址、推荐菜、评分等信息,看起来都没什么问题。

打开开发者工具,然后选择查看一下评分,就发现事情没那么简单了(如下图)。这些评分的数字去哪儿了呢?

其实这些数字是SVG矢量图,SVG矢量图是基于可扩展标记语言,用于描述二维矢量图形的一种图形格式,通过使用不同的偏移量就能显示不同的字符,这样就能很巧妙地隐藏信息了,如果我们用xpath去解析网页得到的就是一个个""。这次爬虫的难点就在于如何得到这些评分的信息,既然我们能够知道它是怎么反爬的,那我们是不是就能想办法实现反反爬呢?先说下破解思路吧:首先要解析网页,找到这个网页使用的SVG矢量图,拿到这个矢量图后,如果我们能得到每个数字对应的偏移量,那就能将这些偏移量转化成图片中的数字了。

二、破解步骤

首先查看网页源码,既然使用的是SVG矢量图,那我们搜索一下svg会不会有惊喜呢?果然有惊喜:

把这个链接复制一下,然后打开这个链接,会看到有很多的class名称和background,这么多的数据,怎么知道有没有我们想要的东西呢?这时候搜索一下unbq2:

可以看到unbq2这个class对应的background为(-199.0px,-109.0px),但是我们还是没有办法得到具体的数字啊,怎么办呢?

我们再搜索一下svg会有什么结果呢?这一步会得到几个以.svg结尾的链接,将这些链接提取出来:

span[class^="ma"]{background-image: url(//s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/9e045e6574fb7ae10b5aae4ae4a0c444.svg);
span[class^="yj"]{background-image: url(//s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/39510b070120e6a5b7c8754ab729ee2e.svg);
span[class^="dz"]{background-image: url(//s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/8eecf780b3c9ecefd5ad508502dd80a5.svg);
span[class^="un"]{background-image: url(//s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/39ecd4a57969825db02c38a01f4f34c6.svg);

可以看到以"un"开头的class使用的背景图片的链接就是//s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/39ecd4a57969825db02c38a01f4f34c6.svg

这就是我们要找的SVG矢量图了,现在的问题就在于如何将偏移量转化成对应的数字呢?首先把这些数字提取出来:

99851465728255648017534661485297040380627087820023

03763928255311814779807306445209731282368541175419

06266544999197136339

然后打开开发者工具,可以发现每个数字都有对应着一组x和y的值:

在前面的分析中我们知道数字6对应的偏移量是(-199.0px,-109.0px),然后我们也可以分析一下别的数字对应的偏移量,然后通过这些分析可以知道y方向上的偏移量只是为了确定这个class对应的数字在哪一行,而x方向的偏移量需要进行一下处理,具体方法为:

(x方向上的偏移量+7)/(-12)

比如(-199+7)/(-12)=16,这个16就表示对应的数字索引为16(第一个数字索引为0),然后y方向的偏移量对应的行数为3,最后从上面的数字中寻找第3行第17个数字--正好为6,也就是说unbq2这个class对应的数字就是6,这样我们就已经成功实现了反反爬。

三、爬取步骤

由于大众点评会对我们的UserAgent和Cookie进行检查,所以在爬取的时候要带上Cookie,而且如果一直用一个UserAgent也会被识别出来,所以得采用不同的UserAgent。这里我要分析一个第三方模块:fake_useragent,没有安装这个模块的可以使用pip命令进行安装。我们通过使用这个模块就能得到随机的UserAgent了,使用方法如下:

1 from fake_useragent import UserAgent
2
3 ua = UserAgent()
4 for i in range(3):
5     print(ua.random)

运行结果如下:

店铺名称和推荐菜的爬取相对简单,这里就不赘述了,主要说一下如何爬取店铺的评分信息。

在我们得到网页的源码之后,需要先把css文件的url提取出来:

# 提取css文件的url
css_url = "http:" + re.search('(//.+svgtextcss.+\.css)', html).group()

然后将以"un"开头的class名称和对应的偏移量全部提取出来,以供后面使用:

css_res = requests.get(css_url)
# 这一步得到的列表内容为css中class的名字及其对应的偏移量
css_list = re.findall('(un\w+){background:(.+)px (.+)px;', '\n'.join(css_res.text.split('}')))

这里还要对得到的数据进行一下处理,因为y方向上的偏移量并不参与计算,最终得到的y_dict中的键是y方向上的偏移量,值是y方向上的偏移量对应的行数:

# 过滤掉匹配错误的内容,并对y方向上的偏移量初步处理
css_list = [[i[0], i[1], abs(float(i[2]))] for i in css_list if len(i[0]) == 5]
# y_list表示在y方向上的偏移量,完成排序和去重
y_list = [i[2] for i in css_list]
y_list = sorted(list(set(y_list)))
# 生成一个字典
y_dict = {y_list[i]: i for i in range(len(y_list))}

然后我们要提取以”un“开头的class所对应svg图片的url,并访问这个url,将图片中的数字都提取出来:

# 提取svg图片的url
svg_url = "http:" + re.findall('class\^="un".+(//.+svgtextcss.+\.svg)', '\n'.join(css_res.text.split('}')))[0]
svg_res = requests.get(svg_url)
# 得到svg图片中的所有数字
digits_list = re.findall('>(\d+)<', svg_res.text)

进行到这一步,我们就已经得到了所有以un开头的class对应的偏移量和所有的数字了,然后我们就可以利用前面的计算方法将这些偏移量转变成对应的数字了,也就能得到每个店铺的评分信息了。

最终运行结果如下:

【Python3爬虫】大众点评爬虫(搞定CSS反爬)相关推荐

  1. Python爬虫 | 以滑雪为例演示大众点评商铺信息采集(字体反爬)

    文章目录 1.简述 2.字体反爬处理 2.1.获取字体文件链接 2.2.创建三类字体与实际字符映射关系 3.单页店铺信息解析 4.全部页数据获取 4.1.获取数据页数 4.2.采集全部数据 5.总结 ...

  2. 大众点评数据信息获取——字体反爬

    大众点评数据信息获取--字体反爬 大众点评的字体反爬算是比较常见的,这次来学习一下相关字体反爬的技巧 以店铺的评论页面和店铺列表页面进行研究,分别对应了css字体映射,woff字体加密的反爬虫手段. ...

  3. python爬虫进阶-自如租房信息(CSS反爬)

    目的 分析学习CSS反爬并得到正确的信息 详细需求 http://sz.ziroom.com/z/ 思路解析 一.F12 二.分析 三.复制url,浏览器打开查看 四.映射字符 五.汇总 1.源网页请 ...

  4. python爬虫笔记四:大众点评店铺信息(字体反爬-静态映射)

    https://jia666666.blog.csdn.net/article/details/108885263 里面讲的非常详细了,不过点评有改动,里面的代码也要相应的改动一下 #coding:u ...

  5. python爬虫进阶-大众点评店铺信息(字体反爬-静态映射)

    目的 获取大众点评店铺信息 详细需求 http://www.dianping.com/shenzhen/ch10 思路解析 一 通过F12查找目标信息位置,进行分析 同理进行其他信息的解析,分析汇总 ...

  6. 抓取设了CSS反爬机制的大众点评数据(下)

    该篇实现大众点评爬虫操作代码,所有原理都在(上)篇均已详细阐述,让我没想到的是大众点评不仅设置了CSS反爬,在ip限制方面也是十分的凶狠,不得已花了10块钱买了一天代理ip. 大众点评究的反爬竟有多恶 ...

  7. python爬虫大众点评店铺信息(字体加密)

    python爬虫大众点评店铺信息(字体加密) 1.观察网站 发现部分字体加密 2.查看请求的字体文件 发现请求到了两个字体文件,把他下载打开 3. 这就是对应该网页每个字体的unicode,发现两个字 ...

  8. 爬虫-大众点评评论信息(思路)

    Python爬虫-爬取大众点评评论信息(CSS映射) 正常页面显示数据为: 而打开开发者工具每条评论的个别字是通过标签替换的 部分字体被svgmtsi标签包含,实际上是一张svg背景图,通过类选择器进 ...

  9. 爬虫 — 大众点评商户信息的爬取和文字反爬

    信息爬取 import requests from lxml import etree import time import json import pandas as pd# 获取商户名称和ID r ...

最新文章

  1. fedora15换主题
  2. SVM 核函数相关知识
  3. django 修改html无变化,Django Pycharm 修改html后立即刷新页面
  4. WOJ 18 动态无向图
  5. 攻击 | 神奇的木马(虚拟机模拟木马入侵)
  6. 《python核心编程》学习笔记
  7. 网络计算机装系统,网络克隆——为电脑重装系统
  8. 【ARM】Linaro Security module
  9. 你想要的宏基因组-微生物组知识全在这(1910)
  10. ai形状生成工具机器人_一名大学生使用一种语言生成AI工具来创建病毒博客文章...
  11. Windows 7系统tracert怎么用?
  12. win10找不到gpedit.msc
  13. ZZULI - 建国的数学难题
  14. oracle创建emp表dept 表
  15. 21天学通java第7版pdf_21天学通Java.第7版.pdf
  16. QQ2009、QQ2010、QQ2011远程攻击漏洞,详细使用方法。
  17. less的了解及基本使用
  18. 个人收藏的常用前端网站
  19. web服务器与ftp服务器的区别
  20. linux pid t 头文件_关于pid_t的理解

热门文章

  1. mysql - 一键安装方式- 课堂版
  2. Spring Cloud Alibaba发布第二个版本,Spring 发来贺电 1
  3. Nexus修改admin密码及其添加用户
  4. 一文掌握关于Java数据结构所有知识点(欢迎一起完善) 1
  5. 迷宫(AHOI2016初中组T3)
  6. 0-11 NFS与TFTP服务器配置
  7. iOS25个性能优化,和内存优化
  8. IOS 如何获取ppi
  9. 时间:2014年3月27日20:08:01网站建表实战与优化意识
  10. 利用Crontab为Linux定时备份Mysql数据库