Python爬虫大众点评字体加密评论采集!听说这个网站很难?
2021-03-31 03:28
标签:headers div chrome findall dba 直接 ike 爬虫 find 图1 图2 图3 图6 下载后的文件内容如下图所示 效果如下图所示 Python爬虫大众点评字体加密评论采集!听说这个网站很难? 标签:headers div chrome findall dba 直接 ike 爬虫 find 原文地址:https://www.cnblogs.com/A3535/p/13571141.html前序
最近在研究反爬虫策略,写了一个大众点评评论采集的程序,途中遇到了一些坑有感而发分享给大家,
大众点评是基于css机制实现的字体加密技术来阻碍我的进行准确数据的抓取正文
根据图1我们可以看出部分文字在源码中是无法得到正常显示的,对应的我们解析也只能得到一些无用的svg标签,且又由于文字本身就是一个svg标签所以此时我们的selenium也爱莫能助,初步认定字体正确显示在网页中是根据svg的class解析出的
由上图可以看出svg的每一个类都是对应着特定的坐标,并且还得知了网页加载时加载了一个svg文件,我们打开此链接看下对应内容为何物
可以看到图2处的免字在该svg链接返回内容中可以获取到,且图2处显示标签width: 14px ,坐标为x=112 y = 2322,我们来找一下规律,免字在图3当前行内处于第九位,而112/14=8, 在我们程序中又经常使用下标展示内容,那么我们继续对照确定解析方式
图4
图5
通过图四和图五可以发现确实如同我们所猜想,x坐标/14就对应字体在svg文件内的x轴位置,现在就仅剩y轴坐标需要我们找寻规律了
通过查看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(‘‘, 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爬虫大众点评字体加密评论采集!听说这个网站很难?
文章链接:http://soscw.com/index.php/essay/70283.html