去哪儿 爬虫 pre

本文目标:去哪儿网(qunar.com)的主要关键字段pre

我们的目标是获取以下链接返回的数据:

https://flight.qunar.com/site/oneway_list.htm?searchDepartureAirport=%E5%8C%97%E4%BA%AC&searchArrivalAirport=%E6%88%90%E9%83%BD&searchDepartureTime=2019-11-16&searchArrivalTime=2019-11-19&nextNDays=0&startSearch=true&fromCode=BJS&toCode=CTU&from=qunarindex&lowestPrice=null

去哪儿 爬虫 pre_第1张图片

经多方调试,这里主要的字段就是headers中的pre参数。

 去哪儿 爬虫 pre_第2张图片

其他参数可以固定使用。太过简单的就不介绍了。

从朋友那儿得知,目前大家获取这个参数主要就是依靠selenium模拟获取,作为爬虫工程师,用selenium是迫不得已的下下策,所以,一怒之下,自己动手,把这个参数给解了,纯代码实现,不需要借助selenium,这才是爬虫该有的姿态。

查找pre的调用位置:

去哪儿 爬虫 pre_第3张图片

显然pre是通过window._pt_ 获得。

经过多方查找,最后看到前端源码里面的script标签,这段熟悉又陌生的代码。

去哪儿 爬虫 pre_第4张图片

 复制这段js到本地、格式化、运行。成功看到:内存溢出报错:

去哪儿 爬虫 pre_第5张图片

内存溢出,判断是代码进入了死循环,只能console.log慢慢识别具体的位置,好吧,这个过程,花费三天三夜。不尽一个地方会导致内存溢出,每段这串js代码都有多处让你崩溃的溢出。没办法,只能一个一个找。

鬼叼的是,不同的js返回,溢出的地方,并不一样。调试这个还是需要耐心、耐心、耐心。

解决完内存溢出后,运行代码,发现,并没有生成我们需要的window._pt_

去哪儿 爬虫 pre_第6张图片

这不科学,难道这段代码并不是我们需要的代码,不存在的,在多次断点之后,发现加载完这个代码后,window._pt_就已经生成了,这时查看了源码返回的其他script下的 代码,会不会是其他的代码生成的,可惜,其他js代码并没有做什么重要事情。

那么最后还是回到这段代码上来,既然运行没有报错,却没有生成我们需要的参数,那很可能是某块的代码并没有运行。

于是又是一段疯狂的断点输出,甄别具体没有运行到的代码。

最后果然发现有一段是没有运行到的。

即使发现了问题,但是,这中间又出现了无数个无法进行下去的坑,苦战几天几夜,最后完美用纯代码的方式生成pre:

 

去哪儿 爬虫 pre_第7张图片

 

目前网上普遍都是用selenium模拟生成这个参数,自己硬干把它解出来的过程是艰辛的,当然也充满着乐趣。

纯属个人爱好,不做任何数据的抓取。

破解技术交流,欢迎勾搭。

更多粉丝可见的文章,欢迎点击关注。

 

QQ:  MTE2NTY3MzkzNg==      (base64)

你可能感兴趣的:(js)