破解CSS偏移量反爬虫
发布时间丨2021-10-30 15:31:31作者丨zhaomeng浏览丨111
css偏移量反爬虫,之前有写过并分析了js的加密的逆向破解,本篇博文主要记录的是对于css进行反爬虫的实现过程,写这篇博文的初衷在于,这个网站我很早就知道,但是一直没有时间去整理并详细记录破解的过程,由于工作比较忙,时间久了就会发现之前很多做过的东西记不清了,甚至和别人说的时候都有些记不清具体内容,可能学习语言就是这样,学的越来越多,有些不常用的东西就会被抛之脑后,所以还是需要经常性的回顾知识,以及自己做过的东西。温故而知新,常做笔记记录。毕竟好记性不如烂笔头!毕竟自己写的如此详细的破解过程还未见到过。
第一步:查看待采集的网站内容,及分析网站详情信息,如下图:
第二步:查看网页控制台并拿到详情链接及分析页面内容,如下图:
上图是本页面的访问的链接,因此我们可以在页面查看他的源码或者使用代码获取他的源码,并进行页面的内容分析,我这是直接在控制台的响应里面进行了搜索,并没有搜索到相关的信息,猜测这里可能是异步或者js渲染的。搜索信息如下图:
到这里我又再次打开了网站的xhr用来捕获异步请求,查看获取到的接口,发现有如下图的链接获取的响应数据跟我想要获取的数据十分的接近,十分开心,可能获取到了,开始仔细查看每个字段的值,如下图是ajax获取的json数据感觉信息还是很全的,但是唯独没有我需要的价格这个字段,有一个字段是min_price但是也与页面展示的不一样。分析到这里我觉得应该还是要通过js渲染的方式获取页面的源代码。
第三步:使用自动化测试工具selenium进行页面的渲染,以此获取页面的源代码。代码如下图:
到这里就获取到了我想要的页面的源代码,接着在控制面板的元素elements里面对页面进行分析,发现如下价格代码:
外部一个span标签里面是三个b标签,第一个b标签里面还有三个i标签分别有三个值,到这儿就有点不明白了,仔细分析页面所有的价格都是这样的,分析如下:
外部span标签的值是42px,我们这里的值有三个4、1、8,因此每个均占14px就正好,但是仔细观察页面的三个b标签的width属性,第个就是42px,占据了全部他里面的值也正好是三个,每个14px。但是这里的值却不是我想要的,接着看下面的三个b标签,每个width是14px,但是他还有一个左偏移的css属性left,分别是左偏移28px、14px、42px正好是14的倍数。因此按照css反爬虫的一贯做法这里应该是对4、1、8这三个使用组合,这里就是使用css偏移量的方式进行了替换。分析如下图:
到这里就需要使用代码完成价格数据的偏移处理,代码如下图所示:
def getattr(items):
spans = items.css(".fix_price")
for spa in spans:
b_list=[]
b_all = spa.css("span em b")
for b in b_all[1:]:
item={}
value = b.css("::text").get()
style = "".join(b.css("::attr('style')").get())
# print(style)
position = re.findall("left:(.*?)px.*",style)[0]
item["position"]=position
item["value"]=value
b_list.append(item)
# print(b_list)
alter_value = b_all[0].css("i::text").getall()
for dd in b_list:
# print((int(dd.get("position"))/16))
alter_value[int((int(dd.get("position"))/16))] =dd.get("value")
print(alter_value)
url="https://flight.qunar.com/site/oneway_list.htm?searchDepartureAirport=%E5%8C%97%E4%BA%AC&searchArrivalAirport=%E4%B8%8A%E6%B5%B7&searchDepartureTime=2021-10-31&searchArrivalTime=2021-11-02&nextNDays=0&startSearch=true&fromCode=BJS&toCode=SHA&from=flight_dom_search&lowestPrice=null"
getattr(resp(url=url))
最终的价格结果运行如下图:
其实在网页源码中我还发现价格这块的代码里面的title属性正好也是价格的值,如下图:
文章属于原创,未经允许严谨转载!