最近遇到一个需求------爬取携程网站中的酒店详情。
具体如下截图:
凡是有过想爬取携程酒店信息的同学,估计都时被携程的反爬技术所困扰。参数OCEANBALL,ELEVEN的加密解密,就够大家琢磨十天半个月了,在碰上个没有JS基础的同学,基本就可以直接放弃了。最关键的是,携程的加密方法,每隔一段时间就会改变,所以即便碰见了爬虫高手,也需要不断的耗费时间对抗携程的反爬,根本无法应用在实际生产中。所以直接通过解密参数直接通过api连接的方式,应该可以放弃了。如果仅当学习,那么可以深度研究下携程的反爬。
既然想运用在实际生产中,又要考虑到效率问题,在征得甲方爸爸的意见后,我采用了一个更加简便的方法。直接使用selenium+chromeDriver/GeckoDriver/FirefoxDriver来进行数据获取。
但是在实际运行过程中,就发现了一个很奇怪的现象,携程的反爬着实令人抓不到头脑。因为在测试过程中,有时候能够获取到正确的数据,有时候,就无法获取正确的数据(数据被下毒),有的时候,直接就被跳转到登录页面,假数据都不给你。为了能够研究出如何才能获取到数据,苦逼的开启了测试模式。
测试第一版:
1- selenium3 + chrome(80版本)
System.setProperty("webdriver.chrome.driver","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
driver = new ChromeDriver(options) ;
//等待时间,超过60秒网页加载不完,会报错
driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
driver.get(url);
这段代码运行后,打开任一酒店页面,会被跳转至登录页面,因为navigator.webdriver = true ;
为了避免webdriver = true这一selenium的典型特征,怎么办?百度下,一般是告诉加入如下一段代码:
options.setExperimentalOption("excludeSwitches", Arrays.asList("enable-automation")) ;
options.setExperimentalOption("useAutomationExtension", false) ;
加入之后,再次实验一下,发现毫无作用。因为在旧的webdriver版本中,开始开发者模式,是可以解决这一问题的,但是在最近的版本中,webdriver=true的bug,被他们修复了~ 是的,在开发者看来,这是个bug ~
怎么办?继续百度,墙内不行,我们就去墙外看看。功夫不负有心人,我们把上面的两行参数给去掉,加入下面两行代码:
options.addArguments("--disable-blink-features") ;
options.addArguments("--disable-blink-features=AutomationControlled") ;
再次打开任一酒店页面。发现竟然没有跳转到登录页面~~~~
啦啦啦啦~~~激动地心,颤抖的手,竟然躲过了webdriver=true的检测,而且完美加载出了每个房间的价格与一些其他参数。
等等,好像挺完美的,但是好像又有一些不对劲呢~
具体哪里不对劲,今天有点晚了,下次我在继续写~ 好菜不怕晚, 好话不嫌慢哈