前言
起初做这个是因为博主想要监控携程的酒店和机票价格,途中踩了许多坑故作此记录
机票接口分析:
- 航班信息的详细数据全部来源于 jxxxxxxx-xxxxx 这个请求
- 这个 id 号是通过 batchSearch 请求的响应数据中获取的
- 且请求头中需要携带 Transactionalid
酒店接口分析
- 酒店的数据主要来自于 HotelSearch 和 hotelSearchNearby 这两个接口
- 酒店页面搜索的界面需要登录
从上面的分析来看不管是单纯的爬取 html 页面还是请求接口都是不现实的
因此我使用的技术栈如下 :
- Selenium
- BrowserMob-proxy
- firefox driver
引入依赖
这里关于 Selenium 和 BrowserMob 的版本关系有很大的坑,高于 4.0 的 Selenium-Java 库修改了一些方法的参数类型,且会与现有的 guava 库产生冲突,如果你尝试覆盖掉 guava 库以与当前的 Selenium-Java 库匹配,会导致其他依赖 guava 库的第三方库出错无法启动 springboot 项目
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.5</version>
</dependency>
<dependency>
<groupId>net.lightbody.bmp</groupId>
<artifactId>browsermob-core</artifactId>
<version>2.1.5</version>
</dependency>
核心代码
这里给出的是使用 firefox 版本的代码,原因是携程的机票响应可能数据过大导致 chrome 浏览器无法加载出响应数据,目前只有火狐浏览器支持解除缓存大小限制,关于如何解除会在后面的排错给出
前置条件
- 安装 firefox 浏览器
- 下载 firefox 的 driver 文件,下载地址
- 把 webDriver 改为驱动文件的绝对路径
- 把 profile 改为 firefox 的用户目录 (先在网站登录成功过一次后在进行此项,目的是导入当前浏览器的登录信息)
- windows:
C:\Users\your-username\AppData\Roaming\Mozilla\Firefox\Profiles\your-id
- linux:
/root/.mozilla/firefox/your-id
,(root 是我的根目录)
- windows:
获取响应数据
public String getResponseData(String searchUrl, String regex, String waitFor) {
// 设置 BrowserMob Proxy 路径和启动代理服务
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start