一、写在前面
我在以前写过一次12306网站的爬虫,当时实现了模拟登录和查询车票,但是感觉还不太够,所以对之前的代码加以修改,还实现了一个订购车票的功能。
二、主要思路
在使用Selenium做模拟登录12306网站的时候,需要将登录成功后的Cookie保存下来,这个Cookie在后面是必需的。然后就是在12306网站上查票订票,同时使用Fiddler软件进行抓包,通过分析得到订票所需的十多个请求,只要依次发送这些请求,在请求成功之后就能够订到票。
三、模拟登录
之前的代码已经基本实现了模拟登录的功能,但是还没法得到想要的Cookie,所以需要对之前的代码进行改进。虽然Selenium模块提供了get_cookies()方法,但是使用这个方法得到的是当前会话的Cookie,也就是Selenium开启的浏览器中当前页面的Cookie,这个Cookie和本地浏览器中的Cookie是不同的。如下是从本地Chrome中拷贝的Cookie,其中以_jc_save开头的字段都是之前查询车票的记录,而其余字段都是生成的:
JSESSIONID=A318817EEE594DE954CE352761DF4CD7;
_jc_save_fromStation=%u6B66%u6C49%2CWHN;
_jc_save_wfdc_flag=dc;
_jc_save_toStation=%u4E0A%u6D77%2CAOH;
RAIL_EXPIRATION=1560095439082;
RAIL_DEVICEID=P2wunHEkKFe9MgTM56h-NxsWiIGNkK6JLCOVaG0DHzRm-RxYa7YnDwftPoumiZ0wL7GPsQ93YBHRHgMgB_GLWwZ9Vb65tNiVuwaIOytW8lVG7B1KopI4pSyUr1u06RWpKPhvExBg3FA7ed87WxO3E-68Wg-hXZLl;
_jc_save_fromDate=2019-06-30;
_jc_save_toDate=2019-06-06;
_jc_save_showIns=true;
route=495c805987d0f5c8c84b14f60212447d;
BIGipServerotn=300941834.24610.0000;
BIGipServerpool_passport=250413578.50215.0000
下面是使用Selenium模块的get_cookies()方法得到的Cookie,可以看到和浏览器中的Cookie有很大不同,缺少了很多字段:
[{'domain': 'kyfw.12306.cn', 'httpOnly': False, 'name': 'JSESSIONID', 'path': '/otn', 'secure': False, 'value': '672BAF8C694C50C49D3EFFCF9913A745'},
{'domain': 'kyfw.12306.cn', 'httpOnly': False, 'name': 'route', 'path': '/', 'secure': False, 'value': 'c5c62a339e7744272a54643b3be5bf64'},
{'domain': 'kyfw.12306.cn', 'httpOnly': False, 'name': 'BIGipServerotn', 'path': '/', 'secure': False, 'value': '113