代码
https://download.csdn.net/download/liujiayou/11589246
需求
需要大规模接送机的时候,要掌握某个城市所有出入港航班信息。之前用Excel VBS编写了一个,这回试着写第一个暴力猴脚本。
思路
在https://flights.ctrip.com/schedule/可以输入想要查询的城市,以”兴义“为例,最终得到所有兴义出入港航班列表。
https://flights.ctrip.com/schedule/acx-inmap.html(入港)
https://flights.ctrip.com/schedule/acx-outmap.html(出港)
0、在原来菜单右边增加下载,如下图。
1、点击下载先抓取第一页表格数据。
2、查看第一页表格底部下一页 元素。如果有后续页面,那个这个元素的名称为"schedule_down",如果没有那个这个元素的名称为"schedule_down_disable"。
3、打开一个新窗口,把下一页 元素的链接作为窗口的地址,打开第二页数据。利用window.onload和window.onunload的回调函数抓取第二页数据。
4、查看第二页表格底部下一页 元素,并且不断在此新窗口打开下一页 元素的链接并抓取数据,直到下一页 的名称为"schedule_down_disable"。
5、保存结果到一个CSV文件中,如下图。
教训
JS是单线程,代码的执行不是顺序的。习惯了按常规顺序执行语句的方法去写,程序很容易进入死循环或者根本不按设想的去执行。
关键点
按常规的写法,新窗口的onload回调函数,在第一次加载完后是正常运行的。如果再给出新地址,刷新窗口后onload就不执行,造成后续页面无法自动刷新和抓取。
关键在于要把window.onload和window.onunload回调函数在onunload(onunload是在刷新网址前发生的)的时候再绑定一下。如下: