地址:http://www.dianping.com/shop/9964442

好多字没了,替代的是<x class="xxx"></x>这种css标签

定位到位置

找到文字

 SVG

 svg可以写字,xy是相对svg标签的坐标,单位px

textPath

xlink:href标记文字路径,就是文字排列方向,文字按方向对齐

<path id="my_path" d="M 20,20 C 40,40 80,40 100,20" fill="transparent" />
<text>
<textPath xlink:href="#my_path">This text follows a curve.</textPath>
</text>

d内的参数:

M = moveto

L = lineto


H = horizontal lineto


V = vertical lineto


C = curveto


S = smooth curveto


Q = quadratic Bézier curve


T = smooth quadratic Bézier curveto


A = elliptical Arc


Z = closepath

用了M和H,M是xy坐标,H是水平线表示文字方向水平方向。

参考:https://cloud.tencent.com/developer/section/1423872

1.找css

2.找svg

3.得到css的坐标,在svg里找到字

4.用字替换标签

代码:

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}
r=requests.get("http://www.dianping.com/shop/9964442",headers=headers)
css_url="http:"+re.findall('href="(//s3plus.meituan.net.*?svgtextcss.*?.css)',r.text)[0]
css_cont=requests.get(css_url,headers=headers)

得到css

svg_url=re.findall('class\^="(\w+)".*?(//s3plus.*?\.svg)',css_cont.text)
s_parser=[]
for c,u in svg_url:
f,w=svg_parser("http:"+u)
s_parser.append({"code":c,"font":f,"fw":w})

得到svg

解析svg结果

def svg_parser(url):
r=requests.get(url,headers=headers)
font=re.findall('" y="(\d+)">(\w+)</text>',r.text,re.M)
if not font:
font=[]
z=re.findall('" textLength.*?(\w+)</textPath>',r.text,re.M)
y=re.findall('id="\d+" d="\w+\s(\d+)\s\w+"',r.text,re.M)
for a,b in zip(y,z):
font.append((a,b))
width=re.findall("font-size:(\d+)px",r.text)[0]
new_font=[]
for i in font:
new_font.append((int(i[0]),i[1]))
return new_font,int(width)

结果里有些字没解析出来,发现有两种文字形式

一种带路径的textPath,行数y在d=“xx”的M里

另一种text,行数在text标签里y的值,需要分别处理

返回一个元组包含y的参考值和字体内容,fw是字体宽度

 

css_list = re.findall('(\w+){background:.*?(\d+).*?px.*?(\d+).*?px;', '\n'.join(css_cont.text.split('}')))
css_list = [(i[0],int(i[1]),int(i[2])) for i in css_list]

从css找到所有坐标

def font_parser(ft):
for i in s_parser:
if i["code"] in ft[0]:
font=sorted(i["font"])
if ft[2] < int(font[0][0]):
x=int(ft[1]/i["fw"])
return font[0][1][x]
for j in range(len(font)):
if (j+1) in range(len(font)):
if(ft[2]>=int(font[j][0]) and ft[2]< int(font[j+1][0])):
x=int(ft[1]/i["fw"])
return font[j+1][1][x]

根据class坐标在svg找到具体文字

y是文字所在行数,x字体宽度

replace_dic=[]
for i in css_list:
replace_dic.append({"code":i[0],"word":font_parser(i)})

根据坐标,找到映射关系

rep=r.text
for i in range(len(replace_dic)):
if replace_dic[i]["code"] in rep:
a=re.findall(f'<\w+\sclass="{replace_dic[i]["code"]}"><\/\w+>',rep)[0]
rep=rep.replace(a,replace_dic[i]["word"])

<x class="xxx"></x>标签全局替换

shop=[]
shop_name=tree.xpath('//h1[@class="shop-name"]//text()')[0]
reviewCount=tree.xpath('//span[@id="reviewCount"]//text()')[0]
avgPriceTitle=tree.xpath('//span[@id="avgPriceTitle"]//text()')[0]
comment_score=tree.xpath('//span[@id="comment_score"]//text()')
comment_score=[i for i in comment_score if i!=" "]
addr=tree.xpath('//span[@itemprop="street-address"]/text()')[0]
phone=tree.xpath('//p[@class="expand-info tel"]//text()')
phone=phone[1]+phone[2]
review=[]
for li in lis:
name=li.xpath('.//a[@class="name"]/text()')[0]
comment=li.xpath('.//p[@class="desc"]/text()')[0]
review.append({"name":name,"comment":comment})
shop.append({
"shop_name":shop_name,
"reviewCount":reviewCount,
"avgPriceTitle":avgPriceTitle,"addr":addr,
"phone":phone,
"review":review
})

替换后店名评论数评论评分电话地址等结果

用的库

后来发现不只使用一种反爬,还有自定义字体

字体反爬--css+svg反爬的更多相关文章

  1. 记一次svg反爬学习

    网址:http://www.porters.vip/confusion/food.html 打开开发者工具后 页面源码并不是真实的数字,随便点一个d标签查看其样式 我们需要找到两个文件,food.cs ...

  2. python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题

    python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述       通过编写程序'模拟浏览器'上网,然后通 ...

  3. 常见的反爬措施:UA反爬和Cookie反爬

    摘要:为了屏蔽这些垃圾流量,或者为了降低自己服务器压力,避免被爬虫程序影响到正常人类的使用,开发者会研究各种各样的手段,去反爬虫. 本文分享自华为云社区<Python爬虫反爬,你应该从这篇博客开 ...

  4. 如何制作图标字体(如何将svg转换为css可用的图标字体)

    转自: 如何制作图标字体(如何将svg转换为css可用的图标字体) 具体描述 在项目开发当中,我们常常遇到需要将获取到的svg转换为,css可用的图标字体,那么具体该如何进行操作呢 具体操作 登录ic ...

  5. 爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider)

    爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider),这之间的斗争恢宏壮阔... Day 1小莫想要某站上所有的电影,写了标准的爬虫(基于HttpCli ...

  6. (转)unity3D 如何提取游戏资源 (反编译)+代码反编译

    原帖:http://bbs.9ria.com/thread-401140-1-1.html 首先感谢 雨松MOMO 的一篇帖子 教我们怎么提取 .ipa 中的游戏资源.教我们初步的破解unity3d资 ...

  7. Android反编译(二)之反编译XML资源文件

    Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具  apktool http ...

  8. Android反编译(一)之反编译JAVA源码

    Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具  dex2jar   http://code.go ...

  9. 转 谈谈android反编译和防止反编译的方法

    谈谈android反编译和防止反编译的方法   android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的项 ...

随机推荐

  1. O365 Manager Plus帮助台委派功能一览表

    O365 Manager Plus帮助台委派介绍 虽然Office 365允许您在全球任何地方工作,但它提供的管理功能十分不足.当一个组织分布在多个国家/地区时,一个管理员很难单独管理所有用户和邮箱. ...

  2. 《Linux就该这么学》第十二天课程

    使用ssh服务管理远程主机 绑定两块网卡 原创地址:https://www.linuxprobe.com/chapter-09.html 第1步:在虚拟机系统中再添加一块网卡设备,请确保两块网卡都处在 ...

  3. 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)

    传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...

  4. centos6安装oracle时运行./runInstaller无法弹出图形界面

    首先确保安装oracle的机器上安装了图形化界面. 1.利用xmanager登录到安装oracle的服务器上(直接用root用户登录) 2.运行 export DISPLAY=你的本机地址:0.0 3 ...

  5. ASP.NET代码调用SQL Server带DateTime类型参数的存储过程抛出异常问题

    ASP.NET代码调用SQL Server带DateTime类型参数的存储过程,如果DateTime类型参数的值是'0001/1/1 0:00:00'时,就会抛出异常“Message: SqlDate ...

  6. 与我们息息相关的internet服务(2)---WWW服务

    在起步一个公司,从组建的技术上,可能要准备很多东西,其中一个就是我们熟悉的公司网站    网站,在初中,那时浏览一个网页可叫网上冲浪,听起来似乎比洗澡还爽快,可现在这词就是土鳖,网上冲浪火起来主要是应 ...

  7. idea jetty 配置

    一.jetty 网址下载地:https://www.eclipse.org/jetty/ 1.如下图红色箭头--> 点击Downloads 下载 2.选择最新版 .ZIP 下载 3.选择安装路径 ...

  8. Qt Creator快捷键设置

    QT Creator 下载地址 http://download.qt.io/ 一.快捷键配置方法: 进入“工具->选项->环境->键盘”即可配置快捷键. 二.常用默认快捷键:   编 ...

  9. ASP.NET Core - Razor 页面介绍

    简介 随着ASP.NET Core 2 即将来临,最热门的新事物是Razor页面.在之前的一篇文章中,我们简要介绍了ASP.NET Core Razor 页面. Razor页面是ASP.NET Cor ...

  10. 【每日一点】1. Java如何实现导出Excel单表头或多表头

    一.背景 在后台项目中,经常会遇到将呈现的内容导出到Excel的需求,通过都是导出单个表头的Excel文件,如果存在级联关系的情况下,也就需要导出多表头的场景.今天这篇文章就是分享导出Excel单表头 ...