码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-09-04 17:42:55      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:headers   div   chrome   findall   dba   直接   ike   爬虫   find   

技术图片

 

前序


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

 

 

正文

 

图1

技术图片


根据图1我们可以看出部分文字在源码中是无法得到正常显示的,对应的我们解析也只能得到一些无用的svg标签,且又由于文字本身就是一个svg标签所以此时我们的selenium也爱莫能助,初步认定字体正确显示在网页中是根据svg的class解析出的

图2

技术图片


由上图可以看出svg的每一个类都是对应着特定的坐标,并且还得知了网页加载时加载了一个svg文件,我们打开此链接看下对应内容为何物

图3

技术图片


可以看到图2处的免字在该svg链接返回内容中可以获取到,且图2处显示标签width: 14px ,坐标为x=112 y = 2322,我们来找一下规律,免字在图3当前行内处于第九位,而112/14=8, 在我们程序中又经常使用下标展示内容,那么我们继续对照确定解析方式

技术图片

 

技术图片


图4

技术图片


图5

技术图片


通过图四和图五可以发现确实如同我们所猜想,x坐标/14就对应字体在svg文件内的x轴位置,现在就仅剩y轴坐标需要我们找寻规律了

图6

技术图片


通过查看svg链接对应的网页源代码图6得知每一行字都是对应着y坐标,我们再来看下之前两个例子可以看出加密的svg标签对应的y坐标跟字体文件中的y坐标是存在明确关联的, 即现在我们的大致思路为得到一个svg标签的坐标就相当于得到了正确的文字,那么所有的坐标又在哪呢,我们通过控制台查看得知坐标属性来源于一个css文件中,并且css路径就存在于网页源代码中,见下图所示

技术图片

 

技术图片


既然可以在网页源代码中查找到css文件链接,那我们则可以直接请求网页解析出css链接下载保存,逻辑代码如下

import re
import requests

url = "http://www.dianping.com/shop/GavvJBWdqYcLjBwy/review_all/p1"

headers = {
    "Accept": ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9‘,
    ‘Cookie‘: ‘cy=27; cityid=27; cye=handan; _lxsdk_cuid=173c6514b30c8-0e6711b8a2f35c-3323765-1fa400-173c6514b31c8; _lxsdk=173c6514b30c8-0e6711b8a2f35c-3323765-1fa400-173c6514b31c8; _hc.v=cf8f5b37-3861-f1f3-6c0e-19eda7cf1586.1596760084; s_ViewType=10; ua=%E6%B6%9B_564185; ctu=b689a74c52ba985ea6916abc613db7bb2b8fdd33076d2fe769beab344a903ff1; fspop=test; cy=27; cye=handan; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; Hm_lvt_602b80cf8079ae6591966cc70a3940e7=1598251294,1598252432,1598314846,1598424884; thirdtoken=f70d51d9-4aa6-4b5b-a9df-cdb8ddf1e704; dper=229946c9c4e1e1a2f4ee1aa7e6bb59480b3239f64245a9f169c2f2b6403e9e1f3976e7b1f6b30ed85e477c1b2736d0e6504d7bc1d608fbc3e9b3b477146c218d62be39d25e7faf4cf702f0c0c849a01e5ac6d4124a0c5d9379bcdb729f2791b0; ll=7fd06e815b796be3df069dec7836c3df; ctu=e3484a94f676ae112c7ef5969592c697269c1d07df30ee75c2e77c1457a5cbaefc7d0488ebf9bc8ac603acc1da69eebf; dplet=49dd30d40ac37ddd886a35da22ae62d8; Hm_lpvt_602b80cf8079ae6591966cc70a3940e7=1598425074; _lxsdk_s=174298c21a2-3dd-90e-e71%7C%7C147‘,
    ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36‘
}

con = requests.get(url, headers=headers).content.decode()

# 通过正则取出css文件对应链接
css_url = re.findall(‘<link rel="stylesheet" type="text/css" href="(//s3plus.meituan.*?)">‘, con)

# 得到正确链接
css_url = "http:" + css_url[0]

css_response = requests.get(css_url).text

with open("./font.css", "w") as f:
    f.write(css_response)

下载后的文件内容如下图所示

技术图片


可以看到每一对坐标都对应着wt***, 而wt***则是我们一开始图2处的svg标签对应的class,并且css文件中是有我们的svg文件对应的链接的,那么我们现在有了所有的svg标签和其对应坐标,并且有其正确字体文件链接,那么通过对比即可得到我们所有的正确内容,大致逻辑即为:
1.获取网页源代码
2.解析出css文件路径并获取css文件内容
3.解析css文件内容中的svg class和对应的坐标的映射关系
4.根据css内容解析出svg文件内容即正确字体文件
5.根据svg class和对应的坐标的映射关系和正确字体文件完成网页中的svg标签解密,将svg标签替换为正确内容后利用xpath 正则 或bs4等手段即可完成数据采集

效果如下图所示

技术图片


完整视频教程以录好,文章还是没那么透彻吗  所以加群获取完整视频教程吧:1136192749

 

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

标签:headers   div   chrome   findall   dba   直接   ike   爬虫   find   

原文地址:https://www.cnblogs.com/A3535/p/13571141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!