导航

  • 爬取网址
  • 字体加密原理分析
  • 代码
    • 获取3个字体加密文件
    • 提取用户信息和评论
    • 解密评论
    • 结果
  • 总结

最近一直在学习爬虫,刚好到了反爬这一块,听朋友说大众点评的反爬挺厉害,分析了一下发现还是老熟人,字体反爬,没错,与猫眼电影一样也是字体反爬,感兴趣的朋友可以点 猫眼电影了解详情,不过和猫眼的字体反爬不同,大众点评是通过css文件来进行加密,下面就让我们一起来分析分析吧

爬取网址

本次爬取网址:华联影城(平谷店)

字体加密原理分析

这是网页显示的评论

点击检查打开开发者工具,可以看到一条评论有个别字是使用标签代替的,然后通过类选择器进行css加密

既然知道了css加密,那么我们首先要找的就是CSS文件了,右击点击查看源代码,这就是我们要找的css加密文件了

打开这个文件,可以看到密密麻麻的一堆标签,这就是每个类对应的字体坐标

找到坐标之后,我们还需要找到他加密的字体文件,字体文件的链接也藏在这个文件中,Ctrl+F搜索 .svg,一共有3个文件,都是字体加密的文件

打开之后的样子

查看源代码

这里我们只要注意y轴就行了,x轴是直接通过除以字体大小得出来,不过y会有一些细微的差别,我们只需要取相近的值,就能判断是哪个字了

代码

分析完后,我们就开始爬取吧,因为爬取的数据也不是很多,所以我们直接使用requests模块进行爬取,简单的代码我就不上了,直接上干货

获取3个字体加密文件

取出.css文件,在依次取出里面的3个.svg文件,最后组成映射字典保存起来

def get_encryption_font(self, html):"""获取加密字体"""font_href = "http:" + html.xpath("//link[@rel='stylesheet'][2]/@href")[0]# 发送请求下载字体encryption_font = requests.get(font_href, headers=self.headers).textencryption_font_list = re.findall(r"(\w+)\{background:-(\d+).0px -(\d+).0px;\}", encryption_font)self.encryption_font_map_dict = {font_tuple[0]: (font_tuple[1], font_tuple[2]) for font_tuple inencryption_font_list}# 获取3个字体文件svg_font_url_list = re.findall(r"margin-top: (-?\d+?)px;background-image: url\((.+?\.svg)\)", encryption_font)# 请求3个字体文件并进行映射for svg_font_url in svg_font_url_list:svg_font = requests.get("http:" + svg_font_url[1], headers=self.headers).text# 取出字体文件的内容组成字典text_list = re.findall(r"""y="(\d+?)">(.+?)</text>""", svg_font)if not text_list:# 第二种形式y_list = re.findall(r"""d="M0 (\d+?) H600"/>""", svg_font)font_list = re.findall(r""">(.+?)</textPath>""", svg_font)# 判断2种取出来的是否对应if len(y_list) == len(font_list):text_list = list(zip(y_list, font_list))else:return '提取有误'font_map_dict = {(str(i*14), int(x[0])+int(svg_font_url[0])-9): font for x in text_list for i, font in enumerate(x[1])}self.font_map_dict.update(font_map_dict)

提取用户信息和评论

使用xpath提取我们每条评论想要的信息组成字典,最后保存到列表里面

def get_comments(self, html):"""提取用户信息和评论"""user_div_list = html.xpath("//div[@class='main-review']")# 取出评论divfor div in user_div_list:# 取出每条评论的用户基本信息添加到列表self.user_info_list.append({# 取出用户名"user_name": div.xpath("normalize-space(.//div[@class='dper-info']/a/text())"),# 取出综合评分和人均"comprehensive_score": div.xpath("normalize-space(.//div[@class='review-rank']/span[@class='score'])"),# 取出发表时间"published_time": div.xpath("normalize-space(.//div[@class='misc-info clearfix']/span[@class='time'])"),# 取出被评论地点"comments_on_site": div.xpath("normalize-space(.//div[@class='misc-info clearfix']/span[@class='shop'])"),# 取出评分"star_num": int(re.search(r"\d+", etree.tostring(div.xpath(".//div[@class='review-rank']/span[@class][1]")[0], encoding="utf-8").decode()).group()) // 10,# 取出评论"comment": "".join([etree.tostring(comment, encoding="utf-8").decode() for comment in div.xpath(".//div[@class='review-words Hide']|.//div[@class='review-words']")])})

解密评论

最后就是本次的重点解密评论了,因为评论是普通文字和标签混合的,所以我们使用正则表达式来提取,最后根据之前的映射字典,进行替换即可

def decryption_comment(self):"""解密评论"""for user_info_dict in self.user_info_list:# 提取评论comments = re.findall(r""">\n(.+?)<|>(\w*?.*?\w*?)<|svgmtsi class="(.+?)"/|>(\w+)\s+<""", user_info_dict["comment"])new_comment_list = list()for comment_tuple in comments:comment_tuple = list(comment_tuple)# 判断有没有数据if comment_tuple:# 判断是否是需要解密的if comment_tuple[2]:font_key = self.encryption_font_map_dict.get(comment_tuple[2])# 求出差值最接近的值for cos, font in self.font_map_dict.items():if abs(int(font_key[0]) - int(cos[0])) <= self.difference and abs(int(font_key[1]) - int(cos[1])) <= self.difference:comment_tuple[2] = fontnew_comment_list.append("".join(comment_tuple))user_info_dict["comment"] = re.sub(r"\t| |收起评论", "", "".join(new_comment_list))pprint(self.user_info_list)

结果

最后打印出来的结果就如下图了,本次爬取是冲着学习的目的去的,所以并没有将数据保存起来

总结

因为有了上次猫眼的字体反爬经验,所以本次大众爬取的时间要快上不少,爬虫的反爬只要明白原理,剩下的无非就是经验的累积了,毕竟现在的反爬也是越来越厉害,更新的也越来越频繁,但我相信只要不断的学习,提升自己,那肯定就没有解决不了的问题
最后,如果你觉得这篇文章帮到了你,不妨点个赞吧!

本文仅供交流学习,严禁用于商业或着任何违法用途

Python爬虫——大众点评,爬取用户电影评论,CSS字体加密相关推荐

  1. Python爬虫入门(爬取豆瓣电影信息小结)

    Python爬虫入门(爬取豆瓣电影信息小结) 1.爬虫概念 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或脚本.爬虫的本质是模拟浏览器打开网页,获取网页中我们想要的那部分数据. 2.基本流程 ...

  2. python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程

    python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程 前言 一丶整体思路 二丶遇到的问题 三丶分析URL 四丶解析页面 五丶写入文件 六丶完整代码 七丶最后 前言 大家好我是墨绿 头顶总 ...

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

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

  4. 携程ajax,Python爬虫实战之爬取携程评论

    一.分析数据源 这里的数据源是指html网页?还是Aajx异步.对于爬虫初学者来说,可能不知道怎么判断,这里辰哥也手把手过一遍. 提示:以下操作均不需要登录(当然登录也可以) 咱们先在浏览器里面搜索携 ...

  5. python爬虫大众点评_python爬虫——按城市及店铺面爬取大众点评分类

    题外话:因为最近遇到很多标签要对其进行分类,其中很多是店铺名,所以就想爬取大众点评的分类信息.因为不是专门做爬虫的,所以下面这段代码仅仅是可以实现要求,如何能避免网站的反爬机制这一点就无能无力了.另外 ...

  6. python爬虫——大众点评——商户评论

    ### 今年大众点评已经可以识别selenium,使用这个就会被封,建议大家另寻其他方法 ### 貌似是有一些编译过的webdriver,可以把请求里代表测试工具的关键字拿出来 抓取内容:大众点评-北 ...

  7. python爬虫,Scrapy爬取豆瓣电影《芳华》电影短评,分词生成词云图。

    项目github地址:https://github.com/kocor01/scrapy_cloud Python版本为3.6 自己写的简单架构<python爬虫,爬取豆瓣电影<芳华> ...

  8. Python爬虫大众点评字体加密评论采集!听说这个网站很难?

    前序 最近在研究反爬虫策略,写了一个大众点评评论采集的程序,途中遇到了一些坑有感而发分享给大家, 大众点评是基于css机制实现的字体加密技术来阻碍我的进行准确数据的抓取 正文 图1 根据图1我们可以看 ...

  9. Python爬虫实战 | (3) 爬取豆瓣电影Top250

    在本篇博客中,我们将使用requests+正则表达式来爬取豆瓣电影TOP250电影榜单,获取每部电影的序号.片名.导演.编剧.主演.类型.制作国家/地区.语言.上映日期.片长.又名.豆瓣评分和剧情简介 ...

最新文章

  1. ubuntu创建新用户名和密码以及查看删除用户
  2. 快速准备电子设计大赛
  3. 关于 Google Chrome 操作系统的 5 个问题
  4. 预定义异常 - PHP手册笔记
  5. SolrCloud 分布式集群安装部署(solr4.8.1 + zookeeper +tomcat)
  6. 在WildFly上将JPA和CDI Bean与骆驼一起使用
  7. 万万没想到,EfficientNet居然这么火!
  8. hbase 页面访问_HBase在滴滴出行的应用场景和最佳实践
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_3_练习_使用递归计算阶乘...
  10. 算法设计思维导图(算法设计与分析第二版)
  11. 创建数据库常用SQL语句
  12. APEX 文件格式学习记录
  13. less中使用global的两种用法
  14. 活动|QuarkChain 高TPS悬赏令:看你能有多快!2.4BTC等你拿!
  15. 容器化部署openvpn,访问策略配置
  16. 计算机简单的办公操作,电脑操作掌握这15种快捷键技巧,你就是办公高手!
  17. BF发卡网开源源码+详细教程
  18. Android 13 适配指南~
  19. Keil4的下载程序后窗口闪退,程序保存失败
  20. java+决策树结构_机器学习——决策树,DecisionTreeClassifier参数详解,决策树可视化查看树结构...

热门文章

  1. LeetCode刷题1:第四周
  2. unity程序最小化,隐藏桌面和任务栏
  3. 炭化机是什么?它的作用?
  4. matlab call lapack,MATLAB中调用LAPACK 和BLAS函数
  5. 视频教程-自然语言处理实战——情感分析-NLP
  6. Illustrator CS绘制矢量精细图标详解
  7. 今天给“小白”换上了新的风扇:酷冷至尊ICT-D725R!
  8. 【开发日常】六合一串口模块使用说明
  9. Firebird的备份工具(nbackup)介绍
  10. 无线局域网(wifi) 简单破解