Python爬虫反反爬:CSS反爬加密彻底破解!

python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站 你已经知道了对方是 如何自定义字体加密的了 你要想去反反爬 你就要先站在对方的角度去思考问题 有句话这么说来着 “知己知彼,才能那啥” 那么对于像猫眼电影、大众点评等等 那样的 css 自定义字体加密 应该怎么破呢? 接下来就是 学习 python 的正确姿势 有人说了 不就是把字体通过 unicode 编码吗? 那就简单了啊 把每个字的编码找到 然后使用字典把编码和对应的字对应起来 抓取... 阅读详情

0 惯性嘚瑟

刚开始搞爬虫的时候听到有人说爬虫是一场攻坚战,听的时候也没感觉到特别,但是经过了一段时间的练习之后,深以为然,每个网站不一样,每次爬取都是重新开始,所以,爬之前谁都不敢说会有什么结果。

      前两天,应几个小朋友的邀请,动心思玩了一下大众点评的数据爬虫,早就听说大众点评的反爬方式不一般,貌似是难倒了一片英雄好汉,当然也成就了网上的一众文章,专门讲解如何爬取大众点评的数据,笔者一边阅读这些文章寻找大众点评的破解思路,一边为大众点评的程序员小哥哥们鸣不平,辛辛苦苦写好的加密方式,你们这些爬虫写手们这是闹哪样?破解也就算了,还发到网上去,还发这么多~    

       笔者在阅读完这些文章之后,自信心瞬间爆棚,有如此多的老师,还有爬不了的网站,于是,笔者信誓旦旦的开始了爬大众点评之旅,结果,一上手就被收拾了,各个大佬们给出的爬虫方案中竟然有手动构建对照表的过程,拜托,如果我想手动,还要爬虫做什么?别说手动,半自动都不行。

       大家看到这里或许头上有些雾水了,什么手动?什么半自动?还对照表?大佬,你这是什么梗?再不解释一些我就要弃剧了,葛优都拉不回来~

 

        

      大家先不要着急,静一静~,对照表后面会讲,这里只需要知道我遇到困难了,就可以了,不过咨询了几个大佬之后,好在解决了,革命的路上虽有羁绊,终归还是有同志的~

       好,现在开始入正题,点评的程序员哥哥请不要寄刀片:

1 基础环节

 大众点评的数据爬虫开始还是很正常的,各个题目、菜单基本上都可以搞下来:

       代码如下:

#!/usr/bin/env python
 # _*_ UTF-8 _*_
 # 个人公众号:livandata
 import requests
 from lxml import etree
 
 header = {"Accept":"application/json, text/javascript",
           "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
           "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
           "Cookie":"cy=1; cye=shanghai; _lxsdk_cuid=16ca41d3344c8-050eb4ac8f1741-4d045769-1fa400-16ca41d3345c8; _lxsdk=16ca41d3344c8-050eb4ac8f1741-4d045769-1fa400-16ca41d3345c8; _hc.v=38ae2e43-608f-1198-11ff-38a36dc160a4.1566121473; _lxsdk_s=16ce7f63e0d-91a-867-5a%7C%7C20; s_ViewType=10"
           }
 url = 'http://www.dianping.com/beijing/ch10/g34060o2'
 response = requests.get(url, headers=header)
 data = etree.HTML(response.text)
 title = data.xpath('//*[@id="shop-all-list"]/ul/li[1]/div[2]/div[1]/a/@title')
 print(title)

        爬取的结果为:

       

     

       按照常规的套路,爬虫可以说是写成了。但是,现在的网站大多使用了反爬,一方面担心自己的服务器会被爬虫搞的超负荷,另一方面也为了保护自己的数据不被其他人获取。 

        

        大众点评就是众多带反爬的网站中的佼佼者,使用了比较高级的反爬手法,他们把页面上的关键数字隐藏了起来,增加了爬虫难度,不信~你看:

2 CSS加密

       我们用如下字段爬取商店的评论数:

data = etree.HTML(response.text)
 title = data.xpath('//*[@id="shop-all-list"]/ul/li[1]/div[2]/div[2]/a[1]/b/svgmtsi[1]/text()')
 print(title)

       结果得到的却是如下字段:

       一看傻了,这是什么鬼?

       我们紧接着审查了网站数据,看到的内容却是:

       这是什么鬼?评论数呢?

 

 

        查看了网站的源代码:

       发现原来显示点评数的字段显示成了:

       这是为什么呢?

       好在网上的大神们给出了解答,这就是CSS加密。

       接下来我们就介绍如何破解CSS加密:

       我们把源代码上加密的部分取下来观察一下:

     <svgmtsi>&#xf784;</svgmtsi>

 

       我们发现了网上一直在讨论的svgmtsi标签,这个标签是矢量图的标签,基本上意思就是显示在这里的文字是一个矢量图,解析这个矢量图需要到另外一个地方找一个对照表,通过对照表将编码内容翻译成人类可以识别的数字。

 

       那么,对照表在哪里呢?

       我们先记录下标签中的class值:shopNum(为什么记录,先不要着急,后面会讲到),然后在源代码中查找svg,我们发现了如下内容: 

       大宝藏被挖掘了。

       这好像是个链接,我们点击一下,发现页面跳转到了一个全新的水月洞天:

 

        这真是个伟大的发现,他预示着我们的爬虫找到了门路,我们在这个页面上查找刚才class中的值shopNum,然后,我们看到了如下内容:   

url("//s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/bc2c52b3.woff");}

.shopNum{font-family: 'PingFangSC-Regular-shopNum';}@font-face{font-family:

"PingFangSC-Regular-reviewTag";

src:url("//s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/07758223.eot");

      在这段代码中距离shopNum最近的地方,我们找到一个woff文件。

      你没有猜错,这个woff文件就是我们的对照表。

      同样的思路,这是一个网址,我们可以把他下载下来,把这个网址复制到浏览器的地址栏中,点回车,会跳出如下快乐的界面。

 

       下载完成后,我们在浏览器中打开woff的翻译工具:

        http://fontstore.baidu.com/static/editor/index.html

       我们把&#xf784;前面的&#x去掉并替换成uni,后面的;去掉,得到字段为:unif784。

        秘密揭晓了:

       是不是很眼熟?

       是不是很惊喜?

       是不是很意外?

       恭喜你,第一步成功了~

       这个编码在woff文件中对应的值为7。

       就是我们要找的亲人~

3 woff文件处理

       事情到这里其实就可以画个句号了,因为接下来的思路就变的非常简单了,我们用上面的通用爬虫下载下网站上所有编码和对应的class值,然后根据class值找到对应的woff文件,再在woff文件中确定编码对应的数字或汉字就可以。

      但是,当我们扩充这一思路的时候却遇到了两个问题:

1)如何读取出woff文件中的数字,大众点评有多个woff文件,怎么对照读取呢?难不成要一个个写出来?根据前面网站里的文章来讲,对的,你猜的很准,这就是我文章一开始写的半自动,崩溃了吧,好在笔者找到了新的方法,取代了半自动的问题,这个新的方法就是OCR识别,后面我会仔细讲解。

2)页面的编码是变动的,你没有看错,&#xf784;这个值是会变的,好在这个事件没有发生在大众点评中,但是汽车之家、猫眼等网站使用的CSS加密会随页面的刷新发生变动,有没有惊到你?

如果你只需要大众点评,第二个问题几乎可以不用考虑了,但是笔者认为要做一个有理想的爬虫,尽量多的获取知识点才是正确的,所以,笔者研究了汽车之家、猫眼、天眼等几个用CSS加密的网站,找到了一个通用的方法,下面我们来介绍一下这个通用方法。

先看一下猫眼网站上编码的动态效果:

如图:

      我们先找到一个加密编码,把他复制出来,看到的编码如下:

      然后我们刷新一下页面,再看源码:

       不管你惊不惊,反正我是惊到了~

 

       针对这一变化,笔者心中产生了一个疑惑,如果说编码会变,那浏览器是怎么获取到准确的值的呢?说明一定存在一个统一的方法供浏览器调用,于是,笔者重新研究了编码的调用方式,惊奇的发现了其中的秘密:

       我们以如下两个编码来揭露这个今天大幂幂:

       &#xf0d5; -->unif0d5

       &#xe765;-->unie765

       这两个字段都是表示数字中的1,那他们有什么规律呢?

       我们首先解码woff文件成xml格式:

from fontTools.ttLib import TTFont
 font = TTFont('e765.woff')
 font.saveXML('e765.xml')

      在pycharm中我们打开xml文件:

 

      找到unie765所在的位置:

 

       这一串代码是字形坐标,浏览器就是根据这个字形坐标翻译出我们能够识别的汉字:1。

       同样的思路,我们再去解析unif0d5的值,得到如下图:

 

我们惊奇的发现,这两个竟然一样,是不是所有的值对应的字形坐标都是唯一的呢,答案是肯定的,变化的只是上图name中的编码,坐标与数字之间是一对一的,所以,我们的思路来了,我们只需要找到编码所对应的字形坐标,然后想办法解析出这个字形坐标所对应的数字就可以了。

4 完整思路

       问题展示基本上清楚了,我们接下来看一下怎么自动化解决上面两个问题:

       首先展示一下思路:

 

       这是在excel里面画的,大家可以只关注内容,忽略掉背景线。

       解释一下上面的思路:

       首先:我们从页面上获取到文字编码和woff文件,注意,这里的字形编码和woff文件一定要一起获取,因为每个编码对应一个woff文件,一旦刷新页面,编码在woff文件中的对应关系就会变化,找不到对应的字形坐标。

data = etree.HTML(response.text)
title = data.xpath('//*[@id="shop-all-list"]/ul/li[1]/div[2]/div[2]/a[1]/b/svgmtsi[1]/text()')
print(title)

       其次:我们把字形编码转化成uni开头的编码,并获取到woff文件中的字形坐标。

from fontTools.ttLib import TTFont
font = TTFont('f0d5.woff')
coordinate = font['glyf']['uniF0D5'].coordinates
print(coordinate)

       第三:用matplotlib解析这一坐标,并保存成图片。

#!/usr/bin/env python
 # _*_ UTF-8 _*_
 # 个人公众号:livandata
from fontTools.ttLib import TTFont
import matplotlib.pyplot as plt
font = TTFont('f0d5.woff')
coordinate = font['glyf']['uniF0D5'].coordinates
coordinate = list(coordinate)
fig, ax = plt.subplots()
x = [i[0] for i in coordinate]
y = [i[1] for i in coordinate]
plt.fill(x, y, color="k", alpha=1)
# 取消边框
for key, spine in ax.spines.items():
     if key == 'right' or key == 'top' or key == 'bottom' or key == 'left':
         spine.set_visible(False)
plt.plot(x, y)
# 取消坐标:
plt.axis('off')
plt.savefig('uniF0D5.png')
plt.show()

       通过上面的解析,我们可以得到1的图片:

      

       这个1好难看,不过好在解析出来了~

       第四:使用OCR解析这个数字:

# 图片转化成string:
try:
   from PIL import Image
except ImportError:
   import Image
import pytesseract
captcha = Image.open(r'uniF0D5.png')
print(captcha)
result = pytesseract.image_to_string(captcha, lang='eng', config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789').strip()
print(result)

        自此,我们的文字就可以直接识别出来了,我们就再也不需要用半自动的小米加步枪了,我们可以直接使用冲锋枪了

 

      不过需要注意的是使用OCR解码文字需要一定的时间,耗时还是比较长的,如果经常使用这一思路,建议可以构建一个“字形坐标:文字”的数据库表,下次使用时解析出字形坐标,直接到数据库里匹配对应的文字就可以了。

 

 

Python爬虫」:破解网站字体加密反反爬 前言:字体,也是一种常见的技术,例如58同城,猫眼电影票房,汽车之家,天眼查,实习僧等网站。这些网站采用了自定义的字体文件,在浏览器上正常显示,但是爬虫抓取下来的数据要么就是乱码,要么就是变成其他字符,是因为他们采用自定义字体文件,通过在线加载来引用样式,这是CSS3的新特性,通过 CSS3,web 设计师可以使用他们喜欢的任意字体 ,然后因为爬虫不会主动加载在线的字体, 字体加密一般是网页修改了默认的字符编码集,在网页上加载他们自己定义的字体文件作为字体的样式,可以正确地显示数字,但是在源码上同 阅读详情

相关推荐

手把手教你用ddddocr破解CSS字体:以某电商网站价格加密为例

本文详细介绍了如何利用Python的ddddocr库破解CSS字体技术,以电商网站价格加密为例。通过解析WOFF字体文件、生成识别图像和使用OCR技术,建立加密字符与实际数字的映射关系,实现高效准确的数据抓取。文章提供了完整的代码实现和优化策略,帮助开发者应对复杂的机制。

vvv99的博客 551

很好用的css+js加密工具

很好用的css+js加密工具 ,修好好源码中的需要加密的文件目录(会编译子文件夹);请确保自己的css和js文件的编码格式为utf-8

Python爬虫从0到1(第十一天)——入门

反反爬的主要思路->尽可能的去模拟浏览器对服务器发起请求,浏览器中认为如何操作,代码中就如何去实现。例如:浏览器中先请求了url1,然后获取到服务器返回的cookie保存在本地,然后再去请求url2,此时就会带上url1返回的cookie进行请求,如果没有携带这个cookie就会请求失败Hash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数。MD5的固定长度为128比特,16字节。

weixin_43770993的博客 880

爬虫入门经典(二十一) | 破解CSS加密取大众点评

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/。 PS:由于现在越来越多的人未经本人同意直接取博主本人.

不温卜火 8万+

web爬虫学习(六)——CSS加密彻底破解

笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。 我的公众号为:livandata 0 惯性嘚瑟 刚开始搞爬虫的时候听到有人说爬虫是一场攻坚战,听的时候也没感觉到特别,但是经过了一段时间的练习之后,深以为然,每个网站不一样,每次取都是重新开始,所以,之...

livan1234的博客 4134

CSS爬虫 大众点评

爬虫时,我们会经常遇到一些爬虫的例子,网站上通过爬虫便使得我们无法获取真实的数据信息,有兴趣的同学可以看下这篇文章(点我呀),其中介绍了多种的爬虫和对应的策略。 在大多数数据较多的网站中,其经常会使用CSS爬虫机制来阻止我们对其中信息的访问,因此想要获取我们需要的数据信息,就必须要对这种爬虫加密进行破解。我们以大众点评中的点评数量为例,来讲解一下其具体的破解方法。 我们首先在浏览器种打...

qq_42293758的博客 1741

常见策略整理——CSS 加密

这篇文章是专栏的系列之一,主要讲解常见的CSS加密策略一些特征及解决方案,看汇总版的可以移步常见策略整理。

qq_38223858的博客 2217

一入爬虫深似海,技术你知多少?

我跟在座的各位同僚一样,一个在互联网公司求生的程序员!工作占据了大部分时间,希望有朝一日能实现财富自由、也同样希望早日荣归故里!

吴秋霖的博客 2万+

爬虫:字体案例分析与取实战

字体是一种常见的爬虫技术,通过自定义字体文件(如TTF、WOFF)对网页中的字符进行加密或替换,将页面上的文字使用特殊字体显示,而爬虫在解析时由于缺少相应的字体文件,导致无法正确识别文字内容。本文将深入分析字体的机制,并提供实战样例,帮助读者理解和应对这一挑战。字体技术通过自定义字体文件对字符进行加密或替换,增加了爬虫解析的难度。通过下载并解析字体文件,建立字符映射关系,可以有效破解这种机制。在实际应用中,可能需要结合动态加载、CSS偏移等其他技术进行综合处理。

数据知道的博客 1万+

(二)爬虫入门-大话爬虫中的反反爬

  声明:文章仅源自个人兴趣爱好,不涉及他用,侵权联系删。   转载请注明转自https://leejason.blog.csdn.net/article/details/107457651 浅谈爬虫中的反反爬1 爬虫工程师与开发工程师的较量2 汇总2.1 headers、cookie验证2.2 用户行为验证2.3 封IP2.4 JavaScript加密2.5 字体加密2.6 验证码验证2.7 禁止打开 F12 开发者工具,禁用ctrl+v、alt、shift等 1 爬虫工程师与开发工程师..

郑德帅 1180

Python爬虫反反爬CSS加密彻底破解

点击“简说Python”,选择“星标公众号”福利干货,第一时间送达!@老表家的猫本文授权转载自数据EDTA禁止二次转载大家好,我是老表阅读文本大概需要 10分钟今天,...

简说Python的博客 1086

Python爬虫之常见的手段和解决方法

转载这篇文章主要是了解python爬虫策略,帮助自己更好的理解和使用python 爬虫

Zsanfeng的博客 3946

Python爬虫基础与应用

网络爬虫也叫网络蜘蛛,如果把互联网比喻成一个蜘蛛网,那么蜘蛛就是在网上去 的蜘蛛,爬虫程序通过请求url地址,根据响应的内容进行解析采集数据简单的说:就是用代码模拟人的行为,去各各网站溜达、点点按钮、查查数据。或者把看到的数据拿下来。Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

2402_85236482的博客 4250

python爬虫反反爬:搞定CSS加密

0 惯性嘚瑟刚开始搞爬虫的时候听到有人说爬虫是一场攻坚战,听的时候也没感觉到特别,但是经过了一段时间的练习之后,深以为然,每个网站不一样,每次取都是重新开始,所以,之前谁都不敢说会有...

程序IT圈 480

反反爬虫(2) :破解 CSS3 @font-face 字体加密

CSS3 之前,WEB 开发者必须使用用户计算机上已有的字体。但是在 CSS3 时代,开发者可以使用 `@font-face` 为网页指定字体。 CSS 的作用是修饰 HTML,并且在页面渲染的时候不会改变 HTML 文档的内容。所以即使我们借助 Selenium 工具也无法获得对应的文字内容。字体爬虫正是利用了这个特点,将自定义字体应用到网页中重要的数据上,使得爬虫程序无法获得正确的数据。.........

zzzzls 的博客 1416

python爬虫对抗_python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站...

你已经知道了对方是如何自定义字体加密的了你要想去反反爬你就要先站在对方的角度去思考问题有句话这么说来着“知己知彼,才能那啥”那么对于像猫眼电影、大众点评等等那样的 css 自定义字体加密应该怎么破呢?接下来就是学习 python 的正确姿势有人说了不就是把字体通过 unicode 编码吗?那就简单了啊把每个字的编码找到然后使用字典把编码和对应的字对应起来抓取分析的时候直接替换不就得了有道理是有道理...

weixin_39645165的博客 145
上一篇: python爬虫教程,爬取任意网站上面的视频!
下一篇: Python爬虫爬取智联招聘!谁说Python岗位少的?
PythonJavaPHP
博客等级 码龄7年 0粉丝 76原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值