当前位置: 首页 > Web前端 > JavaScript

防攀爬用品-教你如何应对JS反爬字体反爬

时间:2023-03-26 22:03:03 JavaScript

本文将讲一个常见的反爬方案“字体反爬”。部分内容实现的反爬策略常见的字体格式包括:ttf、eot、woff,我们一般在网页中通过关键字“@font-face”来定义字体样式,然后设置为元素控件样式//DefinitionFontstyle@font-face{font-family:"字体文件名,如:gzfont";src:url('linktothefontfile');}//设置元素的字体样式control.gzfont{font-family:gzfont;}目前很多主流网站都引入了字体反爬,如:8.com,汽车之家等。今天研究的目标对象是:aHR0cHM6Ly93d3cuZ3VhemkuY29tL2J1eQ==1,分析打开目标页面和浏览器的开发者在工具栏上,我们发现一些车价,down支付金额、里程在源代码中显示为乱码,但界面显示的正常元素的字体样式名称为“gzfont”。我们在网页源码中通过关键字“gzfont”试图找到字体的实际URL地址,但是源码中并没有出现字体定义的逻辑,所以我们可以推测实际加载地址字体是通过Ajax加载的。在“Sources”面板下,通过上面的关键字全局搜索关键字。一一分析所有的代码块。通过加断点找到gzfont字段和字体URL地址产生的逻辑。在浏览器新窗口,通过字体网址下载字体文件,然后在PC端使用软件FontCreator打开查看下载地址:https://www.pcsoft.com.cn/sof...我们发现字体映射关系很简单,数量很少,而且映射关系是固定的PS:每次重新加载页面,字体URL地址,映射关系都是固定的,所以我们可以定义他们的映射关系通过字典#字体映射关系#PS:由于字体数量少,可以直接写字体的映射关系font_relation_map={'uniE9CE':0,'uniE41D':1,'uniE630':2,'uniEAF2':3,'uniE325':4,'uniE891':5,'uniEC4C':6,'uniE1D0':7,'uniE76E':8,'uniE52E':9}最后我们分析发现,页面数据是通过如下网络请求获取的。我们只需要将里面的乱码数据按照字体的映射关系,换成正常的数据即可。2、下面说说爬取网页内容的步骤。首先,我们需要安装字体分析依赖库fonttools#安装依赖pip3installfonttools然后,解析字体文件,根据上面responsedata中的数据格式,重新组合一个新的字典datadefget_font_map():"""获取字体映射关系:return:"""font=TTFont(r'gzfont.woff2')#将字体文件转为xml文件#font.saveXML(r"font.xml")font_map=font.getBestCmap()font.close()#print(font_map)new_font_map={}#遍历字典重新组成一个新的映射字典用于index,keyinenumerate(font_map):value=font_map[key]#捕获异常:test=font_relation_map[值]除了:TEMP=''如果测试!='':#根据响应结果中字体的字体,在添加字符值之前添加字符值。String&#,用于匹配new_font_map['&#'+str(key)+";"]=tempreturnnew_font_map接下来模拟上面的网络请求获取响应数据;遍历上面的字典键值对,判断key是否包含在响应结果中,如果包含,则将响应结果中的所有key键替换为该key对应的valuevalueimportjsonimporttimeimportrequestsdefget_car_list(pagenum:int,new_font_map:dict):"""获取车辆列表数据:paramnew_font_map::return:"""url=f"https://mapi.**.com/car-source/carList/pcList?osv=IOS&minor=&sourceType=&ec_buy_car_list_ab=**"payload={}headers={'authority':'mapi.**.com','accept':'application/json,text/plain,*/*','origin':'https://www.**.com','platform':'5','referer':'https://www.**.com/','token':'','user-agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGecko)Chrome/101.0.4951.64Safari/537.36'}resp_str='requests'.,url,headers=headers,data=payload).text#完全替换forkey,valueinnew_font_map.items():ifkeyinresp_str:resp_str=resp_str.replace(key,str(value))最后选举就可以提取了...#数据解析resp=json.loads(resp_str)postList=resp.get("data").get("postList")foriteminpostList:title=item.get("title")road_haul=item.get("road_haul")#kmlicense_date=item.get("license_date")#购买时间price=item.get("price")#pricefirst_pay=item.get("first_pay")#首付print(f'model:{title},kilometers:{road_haul},购买时间:{license_date},价格:{price},首付款:{first_pay}')...运行爬虫,发现爬取的数据没有乱码,显示正常。3、日常工作总结中,处理字体反爬的一般步骤如下:查看网页控件的字体名称,通过网页源码获取字体地址,网络面板(字体)、Source面板(关键词搜索)调试,通过页面刷新下载的RelationView字体软件查看PC端的字体映射,判断字体文件是否动态生成。使用依赖库fonttools解析字体,根据元素内容生成新的键值对,根据键值对替换内容。以上就是本次分享的全部内容。如果觉得文章还不错,欢迎关注公众号:Python编程学习圈,每日干货分享,发“J”也能领取大量学习资料或者去编程学习网了解更多关于编程技术知识。