任务目标: 设置乘车人,出发地、目的地、乘车时间、乘车车次后,通过selenium实现12306网站自动抢票
由于12306系统的验证码系统比较复杂,破解验证码难度较高,且网站放票时间是固定的,因此,可以使用手动扫码的方式提前登陆网站,等待系统自动抢票。
selenium是模拟人的行为对浏览器进行操作,因此,只需要手动买一次票,记录流程,编码实现即可。
具体流程为:
- 打开12306的登陆页面 https://kyfw.12306.cn/otn/resources/login.html
- 手机扫码登陆,跳转至个人欢迎页面 https://kyfw.12306.cn/otn/view/index.html
- 在个人欢迎页面,点击车票栏下的“单程”,跳转到车票查询页面 https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc
- 在车票查询页面,选择出发地,目的地和出发日,点击查询
- 查询出车票后,查看自己想要购买的车次,点击预定,跳转到选择乘客界面,选择乘车人和席别后,点击提交订单,弹出核对信息窗口
- 核对信息后,点击确定,跳转到订单支付页面,至此,抢票流程完成
根据以上流程编写相应代码:
注意点有:
- 登录页,由于是手动扫码登录,因此,只需判断url的转变,即可判断是否登录成功,跳转至个人欢迎页面
- 在各个页面跳转或信息交互过程中,需要短暂的等待页面元素的加载,此时可使用显式等待
- 在选择出发地和目的地时,是通过城市代号完成的,因此需根据12306城市代码表来进行转换
12306城市代码表,点击查看
# 12306城市代码表
city = {
'北京北': 'VAP',
'北京东': 'BOP',
'北京': 'BJP',
'北京南': 'VNP',
'北京西': 'BXP',
'广州南': 'IZQ',
'重庆北': 'CUW',
'重庆': 'CQW',
'重庆南': 'CRW',
'广州东': 'GGQ',
'上海': 'SHH',
'上海南': 'SNH',
'上海虹桥': 'AOH',
'上海西': 'SXH',
'天津北': 'TBP',
'天津': 'TJP',
'天津南': 'TIP',
'天津西': 'TXP',
'长春': 'CCT',
'长春南': 'CET',
'长春西': 'CRT',
'成都东': 'ICW',
'成都南': 'CNW',
'成都': 'CDW',
'长沙': 'CSQ',
'长沙南': 'CWQ',
'福州': 'FZS',
'福州南': 'FYS',
'贵阳': 'GIW',
'广州': 'GZQ',
'广州西': 'GXQ',
'哈尔滨': 'HBB',
'哈尔滨东': 'VBB',
'哈尔滨西': 'VAB',
'合肥': 'HFH',
'呼和浩特东': 'NDC',
'呼和浩特': 'HHC',
'海口东': 'HMQ',
'海口': 'VUQ',
'杭州东': 'HGH',
'杭州': 'HZH',
'杭州南': 'XHH',
'济南': 'JNK',
'济南东': 'JAK',
'济南西': 'JGK',
'昆明': 'KMM',
'昆明西': 'KXM',
'拉萨': 'LSO',
'兰州东': 'LVJ',
'兰州': 'LZJ',
'兰州西': 'LAJ',
'南昌': 'NCG',
'南京': 'NJH',
'南京南': 'NKH',
'南宁': 'NNZ',
'石家庄北': 'VVP',
'石家庄': 'SJP',
'沈阳': 'SYT',
'沈阳北': 'SBT',
'沈阳东': 'SDT',
'太原北': 'TBV',
'太原东': 'TDV',
'太原': 'TYV',
'武汉': 'WHN',
'王家营西': 'KNM',
'乌鲁木齐南': 'WMR',
'西安北': 'EAY',
'西安': 'XAY',
'西安南': 'CAY',
'西宁西': 'XXO',
'银川': 'YIJ',
'郑州': 'ZZF',
'阿尔山': 'ART',
'安康': 'AKY',
'阿克苏': 'ASR',
'阿里河': 'AHX',
'阿拉山口': 'AKR',
'安平': 'APT',
'安庆': 'AQH',
'安顺': 'ASW',
'鞍山': 'AST',
'安阳': 'AYF',
'北安': 'BAB',
'蚌埠': 'BBH',
'白城': 'BCT',
'北海': 'BHZ',
'白河': 'BEL',
'白涧': 'BAP',
'宝鸡': 'BJY',
'滨江': 'BJB',
'博克图': 'BKX',
'百色': 'BIZ',
'白山市': 'HJL',
'北台': 'BTT',
'包头东': 'BDC',
'包头': 'BTC',
'北屯市': 'BXR',
'本溪': 'BXT',
'白云鄂博': 'BEC',
'白银西': 'BXJ',
'亳州': 'BZH',
'赤壁': 'CBN',
'常德': 'VGQ',
'承德': 'CDP',
'长甸': 'CDT',
'赤峰': 'CFD',
'茶陵': 'CDG',
'苍南': 'CEH',
'昌平': 'CPP',
'崇仁': 'CRG',
'昌图': 'CTT',
'长汀镇': 'CDB',
'曹县': 'CXK',
'楚雄': 'COM',
'陈相屯': 'CXT',
'长治北': 'CBF',
'长征': 'CZJ',
'池州': 'IYH',
'常州': 'CZH',
'郴州': 'CZQ',
'长治': 'CZF',
'沧州': 'COP',
'崇左': 'CZZ',
'大安北': 'RNT',
'大成': 'DCT',
'丹东': 'DUT',
'东方红': 'DFB',
'东莞东': 'DMQ',
'大虎山': 'DHD',
'敦煌': 'DHJ',
'敦化': 'DHL',
'德惠': 'DHT',
'东京城': 'DJB',
'大涧': 'DFP',
'都江堰': 'DDW',
'大连北': 'DFT',
'大理': 'DKM',
'大连': 'DLT',
'定南': 'DNG',
'大庆': 'DZX',
'东胜': 'DOC',
'大石桥': 'DQT',
'大同': 'DTV',
'东营': 'DPK',
'大杨树': 'DUX',
'都匀': 'RYW',
'邓州': 'DOF',
'达州': 'RXW',
'德州': 'DZP',
'额济纳': 'EJC',
'二连': 'RLC',
'恩施': 'ESN',
'福鼎': 'FES',
'风陵渡': 'FLV',
'涪陵': 'FLW',
'富拉尔基': 'FRX',
'抚顺北': 'FET',
'佛山': 'FSQ',
'阜新': 'FXD',
'阜阳': 'FYH',
'格尔木': 'GRO',
'广汉': 'GHW',
'古交': 'GJV',
'桂林北': 'GBZ',
'古莲': 'GRX',
'桂林': 'GLZ',
'固始': 'GXN',
'广水': 'GSN',
'干塘': 'GNJ',
'广元': 'GYW',
'广州北': 'GBQ',
'赣州': 'GZG',
'公主岭': 'GLT',
'公主岭南': 'GBT',
'淮安': 'AUH',
'鹤北': 'HMB',
'淮北': 'HRH',
'淮滨': 'HVN',
'河边': 'HBV',
'潢川': 'KCN',
'韩城': 'HCY',
'邯郸': 'HDP',
'横道河子': 'HDB',
'鹤岗': 'HGB',
'皇姑屯': 'HTT',
'红果': 'HEM',
'黑河': 'HJB',
'怀化': 'HHQ',
'汉口': 'HKN',
'葫芦岛': 'HLD',
'海拉尔': 'HRX',
'霍林郭勒': 'HWD',
'海伦': 'HLB',
'侯马': 'HMV',
'哈密': 'HMR',
'淮南': 'HAH',
'桦南': 'HNB',
'海宁西': 'EUH',
'鹤庆': 'HQM',
'怀柔北': 'HBP',
'怀柔': 'HRP',
'黄石东': 'OSN',
'华山': 'HSY',
'黄石': 'HSN',
'黄山': 'HKH',
'衡水': 'HSP',
'衡阳': 'HYQ',
'菏泽': 'HIK',
'贺州': 'HXZ',
'汉中': 'HOY',
'惠州': 'HCQ',
'吉安': 'VAG',
'集安': 'JAL',
'江边村': 'JBG',
'晋城': 'JCF',
'金城江': 'JJZ',
'景德镇': 'JCG',
'嘉峰': 'JFF',
'加格达奇': 'JGX',
'井冈山': 'JGG',
'蛟河': 'JHL',
'金华南': 'RNH',
'金华西': 'JBH',
'九江': 'JJG',
'吉林': 'JLL',
'荆门': 'JMN',
'佳木斯': 'JMB',
'济宁': 'JIK',
'集宁南': 'JAC',
'酒泉': 'JQJ',
'*': 'JUH',
'吉首': 'JIQ',
'九台': 'JTL',
'镜铁山': 'JVJ',
'鸡西': 'JXB',
'蓟县': 'JKP',
'绩溪县': 'JRH',
'嘉峪关': 'JGJ',
'江油': 'JFW',
'锦州': 'JZD',
'金州': 'JZT',
'库尔勒': 'KLR',
'开封': 'KFF',
'岢岚': 'KLV',
'凯里': 'KLW',
'喀什': 'KSR',
'昆山南': 'KNH',
'奎屯': 'KTR',
'开原': 'KYT',
'六安': 'UAH',
'灵宝': 'LBF',
'芦潮港': 'UCH',
'隆昌': 'LCW',
'陆川': 'LKZ',
'利川': 'LCN',
'临川': 'LCG',
'潞城': 'UTP',
'鹿道': 'LDL',
'娄底': 'LDQ',
'临汾': 'LFV',
'良各庄': 'LGP',
'临河': 'LHC',
'漯河': 'LON',
'绿化': 'LWJ',
'隆化': 'UHP',
'丽江': 'LHM',
'临江': 'LQL',
'龙井': 'LJL',
'吕梁': 'LHV',
'醴陵': 'LLG',
'柳林南': 'LKV',
'滦平': 'UPP',
'六盘水': 'UMW',
'灵丘': 'LVV',
'旅顺': 'LST',
'陇西': 'LXJ',
'澧县': 'LEQ',
'兰溪': 'LWH',
'临西': 'UEP',
'龙岩': 'LYS',
'耒阳': 'LYQ',
'洛阳': 'LYF',
'洛阳东': 'LDF',
'连云港东': 'UKH',
'临沂': 'LVK',
'洛阳龙门': 'LLF',
'柳园': 'DHR',
'凌源': 'LYD',
'辽源': 'LYL',
'立志': 'LZX',
'柳州': 'LZZ',
'辽中': 'LZD',
'麻城': 'MCN',
'免渡河': 'MDX',
'牡丹江': 'MDB',
'莫尔道嘎': 'MRX',
'满归': 'MHX',
'明光': 'MGH',
'漠河': 'MVX',
'茂名东': 'MDQ',
'茂名': 'MMZ',
'密山': 'MSB',
'马三家': 'MJT',
'麻尾': 'VAW',
'绵阳': 'MYW',
'梅州': 'MOQ',
'满洲里': 'MLX',
'宁波东': 'NVH',
'宁波': 'NGH',
'南岔': 'NCB',
'南充': 'NCW',
'南丹': 'NDZ',
'南大庙': 'NMP',
'南芬': 'NFT',
'讷河': 'NHX',
'嫩江': 'NGX',
'内江': 'NJW',
'南平': 'NPS',
'南通': 'NUH',
'南阳': 'NFF',
'碾子山': 'NZX',
'平顶山': 'PEN',
'盘锦': 'PVD',
'平凉': 'PIJ',
'平凉南': 'POJ',
'平泉': 'PQP',
'坪石': 'PSQ',
'萍乡': 'PXG',
'凭祥': 'PXZ',
'郫县西': 'PCW',
'攀枝花': 'PRW',
'蕲春': 'QRN',
'青城山': 'QSW',
'青岛': 'QDK',
'清河城': 'QYP',
'黔江': 'QNW',
'曲靖': 'QJM',
'前进镇': 'QEB',
'齐齐哈尔': 'QHX',
'七台河': 'QTB',
'沁县': 'QVV',
'泉州东': 'QRS',
'泉州': 'QYS',
'衢州': 'QEH',
'融安': 'RAZ',
'汝箕沟': 'RQJ',
'瑞金': 'RJG',
'日照': 'RZK',
'双城堡': 'SCB',
'绥芬河': 'SFB',
'韶关东': 'SGQ',
'山海关': 'SHD',
'绥化': 'SHB',
'三间房': 'SFX',
'苏家屯': 'SXT',
'舒兰': 'SLL',
'三明': 'SMS',
'神木': 'OMY',
'三门峡': 'SMF',
'商南': 'ONY',
'遂宁': 'NIW',
'四平': 'SPT',
'商丘': 'SQF',
'上饶': 'SRG',
'韶山': 'SSQ',
'宿松': 'OAH',
'汕头': 'OTQ',
'邵武': 'SWS',
'涉县': 'OEP',
'三亚': 'SEQ',
'邵阳': 'SYQ',
'十堰': 'SNN',
'双鸭山': 'SSB',
'*': 'VYT',
'深圳': 'SZQ',
'苏州': 'SZH',
'随州': 'SZN',
'宿州': 'OXH',
'朔州': 'SUV',
'深圳西': 'OSQ',
'塘豹': 'TBQ',
'塔尔气': 'TVX',
'潼关': 'TGY',
'塘沽': 'TGP',
'塔河': 'TXX',
'通化': 'THL',
'泰来': 'TLX',
'吐鲁番': 'TFR',
'通辽': 'TLD',
'铁岭': 'TLT',
'陶赖昭': 'TPT',
'图们': 'TML',
'铜仁': 'RDQ',
'唐山北': 'FUP',
'田师府': 'TFT',
'泰山': 'TAK',
'唐山': 'TSP',
'天水': 'TSJ',
'通远堡': 'TYT',
'太阳升': 'TQT',
'泰州': 'UTH',
'桐梓': 'TZW',
'通州西': 'TAP',
'五常': 'WCB',
'武昌': 'WCN',
'瓦房店': 'WDT',
'威海': 'WKK',
'芜湖': 'WHH',
'乌海西': 'WXC',
'吴家屯': 'WJT',
'武隆': 'WLW',
'乌兰浩特': 'WWT',
'渭南': 'WNY',
'威舍': 'WSM',
'歪头山': 'WIT',
'武威': 'WUJ',
'武威南': 'WWJ',
'无锡': 'WXH',
'乌西': 'WXR',
'乌伊岭': 'WPB',
'武夷山': 'WAS',
'万源': 'WYY',
'万州': 'WYW',
'梧州': 'WZZ',
'温州': 'RZH',
'温州南': 'VRH',
'西昌': 'ECW',
'许昌': 'XCF',
'西昌南': 'ENW',
'香坊': 'XFB',
'轩岗': 'XGV',
'兴国': 'EUG',
'宣汉': 'XHY',
'新会': 'EFQ',
'新晃': 'XLQ',
'锡林浩特': 'XTC',
'兴隆县': 'EXP',
'厦门北': 'XKS',
'厦门': 'XMS',
'厦门高崎': 'XBS',
'秀山': 'ETW',
'小市': 'XST',
'向塘': 'XTG',
'宣威': 'XWM',
'新乡': 'XXF',
'信阳': 'XUN',
'咸阳': 'XYY',
'襄阳': 'XFN',
'熊岳城': 'XYT',
'兴义': 'XRZ',
'新沂': 'VIH',
'新余': 'XUG',
'徐州': 'XCH',
'延安': 'YWY',
'宜宾': 'YBW',
'亚布力南': 'YWB',
'叶柏寿': 'YBD',
'宜昌东': 'HAN',
'永川': 'YCW',
'宜昌': 'YCN',
'盐城': 'AFH',
'运城': 'YNV',
'伊春': 'YCB',
'榆次': 'YCV',
'杨村': 'YBP',
'宜春西': 'YCG',
'伊尔施': 'YET',
'燕岗': 'YGW',
'永济': 'YIV',
'延吉': 'YJL',
'营口': 'YKT',
'牙克石': 'YKX',
'阎良': 'YNY',
'玉林': 'YLZ',
'榆林': 'ALY',
'一面坡': 'YPB',
'伊宁': 'YMR',
'阳平关': 'YAY',
'玉屏': 'YZW',
'原平': 'YPV',
'延庆': 'YNP',
'阳泉曲': 'YYV',
'玉泉': 'YQB',
'阳泉': 'AQP',
'玉山': 'YNG',
'营山': 'NUW',
'燕山': 'AOP',
'榆树': 'YRT',
'鹰潭': 'YTG',
'烟台': 'YAK',
'伊图里河': 'YEX',
'玉田县': 'ATP',
'义乌': 'YWH',
'阳新': 'YON',
'义县': 'YXD',
'益阳': 'AEQ',
'岳阳': 'YYQ',
'永州': 'AOQ',
'扬州': 'YLH',
'淄博': 'ZBK',
'镇城底': 'ZDV',
'自贡': 'ZGW',
'珠海': 'ZHQ',
'珠海北': 'ZIQ',
'湛江': 'ZJZ',
'镇江': 'ZJH',
'张家界': 'DIQ',
'张家口': 'ZKP',
'张家口南': 'ZMP',
'周口': 'ZKN',
'哲里木': 'ZLC',
'扎兰屯': 'ZTX',
'驻马店': 'ZDN',
'肇庆': 'ZVQ',
'周水子': 'ZIT',
'昭通': 'ZDW',
'中卫': 'ZWJ',
'资阳': 'ZYW',
'遵义': 'ZIW',
'枣庄': 'ZEK',
'资中': 'ZZW',
'株洲': 'ZZQ',
'枣庄西': 'ZFK',
'昂昂溪': 'AAX',
'阿城': 'ACB',
'安达': 'ADX',
'安德': 'ARW',
'安定': 'ADP',
'安广': 'AGT',
'艾河': 'AHP',
'安化': 'PKQ',
'艾家村': 'AJJ',
'鳌江': 'ARH',
'安家': 'AJB',
'阿金': 'AJD',
'阿克陶': 'AER',
'安口窑': 'AYY',
'敖力布告': 'ALD',
'安龙': 'AUZ',
'阿龙山': 'ASX',
'安陆': 'ALN',
'阿木尔': 'JTX',
'阿南庄': 'AZM',
'安庆西': 'APH',
'鞍山西': 'AXT',
'安塘': 'ATV',
'安亭北': 'ASH',
'阿图什': 'ATR',
'安图': 'ATL',
'安溪': 'AXS',
'博鳌': 'BWQ',
'北碚': 'BPW',
'白壁关': 'BGV',
'蚌埠南': 'BMH',
'巴楚': 'BCR',
'板城': 'BUP',
'北戴河': 'BEP',
'保定': 'BDP',
'宝坻': 'BPP',
'八达岭': 'ILP',
'巴东': 'BNN',
'柏果': 'BGM',
'布海': 'BUT',
'白河东': 'BIY',
'贲红': 'BVC',
'宝华山': 'BWH',
'白河县': 'BEY',
'白芨沟': 'BJJ',
'碧鸡关': 'BJM',
'北滘': 'IBQ',
'碧江': 'BLQ',
'白鸡坡': 'BBM',
'笔架山': 'BSB',
'八角台': 'BTD',
'保康': 'BKD',
'白奎堡': 'BKB',
'白狼': 'BAT',
'百浪': 'BRZ',
'博乐': 'BOR',
'宝拉格': 'BQC',
'巴林': 'BLX',
'宝林': 'BNB',
'北流': 'BOZ',
'勃利': 'BLB',
'布列开': 'BLR',
'宝龙山': 'BND',
'八面城': 'BMD',
'班猫箐': 'BNM',
'八面通': 'BMB',
'北马圈子': 'BRP',
'北票南': 'RPD',
'白旗': 'BQP',
'宝泉岭': 'BQB',
'白泉': 'BQL',
'白沙': 'BSW',
'巴山': 'BAY',
'白水江': 'BSY',
'白沙坡': 'BPM',
'白石山': 'BAL',
'白水镇': 'BUM',
'坂田': 'BTQ',
'泊头': 'BZP',
'北屯': 'BYP',
'本溪湖': 'BHT',
'博兴': 'BXK',
'八仙筒': 'VXD',
'白音察干': 'BYC',
'背荫河': 'BYB',
'北营': 'BIV',
'巴彦高勒': 'BAC',
'白音他拉': 'BID',
'鲅鱼圈': 'BYT',
'白银市': 'BNJ',
'白音胡硕': 'BCD',
'巴中': 'IEW',
'霸州': 'RMP',
'北宅': 'BVP',
'赤壁北': 'CIN',
'查布嘎': 'CBC',
'长城': 'CEJ',
'长冲': 'CCM',
'承德东': 'CCP',
'赤峰西': 'CID',
'嵯岗': 'CAX',
'柴岗': 'CGT',
'长葛': 'CEF',
'柴沟堡': 'CGV',
'城固': 'CGY',
'陈官营': 'CAJ',
'成高子': 'CZB',
'草海': 'WBW',
'柴河': 'CHB',
'册亨': 'CHZ',
'草河口': 'CKT',
'崔黄口': 'CHP',
'巢湖': 'CIH',
'蔡家沟': 'CJT',
'成吉思汗': 'CJX',
'岔江': 'CAM',
'蔡家坡': 'CJY',
'昌乐': 'CLK',
'超梁沟': 'CYP',
'慈利': 'CUQ',
'昌黎': 'CLP',
'长岭子': 'CLT',
'晨明': 'CMB',
'长农': 'CNJ',
'昌平北': 'VBP',
'常平': 'DAQ',
'长坡岭': 'CPM',
'辰清': 'CQB',
'楚山': 'CSB',
'长寿': 'EFW',
'磁山': 'CSP',
'苍石': 'CST',
'草市': 'CSL',
'察素齐': 'CSC',
'长山屯': 'CVT',
'长汀': 'CES',
'昌图西': 'CPT',
'春湾': 'CQQ',
'磁县': 'CIP',
'岑溪': 'CNZ',
'辰溪': 'CXQ',
'磁西': 'CRP',
'长兴南': 'CFH',
'磁窑': 'CYK',
'朝阳': 'CYD',
'春阳': 'CAL',
'城阳': 'CEK',
'创业村': 'CEX',
'朝阳川': 'CYL',
'朝阳地': 'CDD',
'长垣': 'CYF',
'朝阳镇': 'CZL',
'滁州北': 'CUH',
'常州北': 'ESH',
'滁州': 'CXH',
'潮州': 'CKQ',
'常庄': 'CVK',
'曹子里': 'CFP',
'车转湾': 'CWM',
'郴州西': 'ICQ',
'沧州西': 'CBP',
'德安': 'DAG',
'大安': 'RAT',
'大坝': 'DBJ',
'大板': 'DBC',
'大巴': 'DBD',
'到保': 'RBT',
'定边': 'DYJ',
'东边井': 'DBB',
'德伯斯': 'RDT',
'打柴沟': 'DGJ',
'德昌': 'DVW',
'滴道': 'DDB',
'大磴沟': 'DKJ',
'刀尔登': 'DRD',
'得耳布尔': 'DRX',
'东方': 'UFQ',
'丹凤': 'DGY',
'东丰': 'DIL',
'都格': 'DMM',
'大官屯': 'DTT',
'大关': 'RGW',
'东光': 'DGP',
'东海': 'DHB',
'大灰厂': 'DHP',
'大红旗': 'DQD',
'东海县': 'DQH',
'德惠西': 'DXT',
'达家沟': 'DJT',
'东津': 'DKB',
'杜家': 'DJL',
'大口屯': 'DKP',
'东来': 'RVD',
'德令哈': 'DHO',
'大陆号': 'DLC',
'带岭': 'DLB',
'大林': 'DLD',
'达拉特旗': 'DIC',
'独立屯': 'DTX',
'豆罗': 'DLV',
'达拉特西': 'DNC',
'东明村': 'DMD',
'洞庙河': 'DEP',
'东明县': 'DNF',
'大拟': 'DNZ',
'大平房': 'DPD',
'大盘石': 'RPP',
'大埔': 'DPI',
'大堡': 'DVT',
'大其拉哈': 'DQX',
'道清': 'DML',
'对青山': 'DQB',
'德清西': 'MOH',
'大庆西': 'RHX',
'东升': 'DRQ',
'独山': 'RWW',
'砀山': 'DKH',
'登沙河': 'DWT',
'读书铺': 'DPM',
'大石头': 'DSL',
'东胜西': 'DYC',
'大石寨': 'RZT',
'东台': 'DBH',
'定陶': 'DQK',
'灯塔': 'DGT',
'大田边': 'DBM',
'东通化': 'DTL',
'丹徒': 'RUH',
'大屯': 'DNT',
'东湾': 'DRJ',
'大武口': 'DFJ',
'低窝铺': 'DWJ',
'大王滩': 'DZZ',
'大湾子': 'DFM',
'大兴沟': 'DXL',
'大兴': 'DXX',
'定西': 'DSJ',
'甸心': 'DXM',
'东乡': 'DXG',
'代县': 'DKV',
'定襄': 'DXV',
'东戌': 'RXP',
'东辛庄': 'DXD',
'丹阳': 'DYH',
'大雁': 'DYX',
'德阳': 'DYW',
'当阳': 'DYN',
'丹阳北': 'EXH',
'大英东': 'IAW',
'东淤地': 'DBV',
'大营': 'DYV',
'定远': 'EWH',
'岱岳': 'RYV',
'大元': 'DYZ',
'大营镇': 'DJP',
'大营子': 'DZD',
'大战场': 'DTJ',
'德州东': 'DIP',
'低庄': 'DVQ',
'东镇': 'DNV',
'道州': 'DFZ',
'东至': 'DCH',
'东庄': 'DZV',
'兑镇': 'DWV',
'豆庄': 'ROP',
'定州': 'DXP',
'大竹园': 'DZY',
'大杖子': 'DAP',
'豆张庄': 'RZP',
'峨边': 'EBW',
'二道沟门': 'RDP',
'二道湾': 'RDX',
'二龙': 'RLD',
'二龙山屯': 'ELA',
'峨眉': 'EMW',
'二密河': 'RML',
'二营': 'RYJ',
'鄂州': 'ECN',
'福安': 'FAS',
'丰城': 'FCG',
'丰城南': 'FNG',
'肥东': 'FIH',
'发耳': 'FEM',
'富海': 'FHX',
'福海': 'FHR',
'凤凰城': 'FHT',
'奉化': 'FHH',
'富锦': 'FIB',
'范家屯': 'FTT',
'福利屯': 'FTB',
'丰乐镇': 'FZB',
'阜南': 'FNH',
'阜宁': 'AKH',
'抚宁': 'FNP',
'福清': 'FQS',
'福泉': 'VMW',
'丰水村': 'FSJ',
'丰顺': 'FUQ',
'繁峙': 'FSV',
'抚顺': 'FST',
'福山口': 'FKP',
'扶绥': 'FSZ',
'冯屯': 'FTX',
'浮图峪': 'FYP',
'富县东': 'FDY',
'凤县': 'FXY',
'富县': 'FEY',
'费县': 'FXK',
'凤阳': 'FUH',
'汾阳': 'FAV',
'扶余北': 'FBT',
'分宜': 'FYG',
'富源': 'FYM',
'扶余': 'FYT',
'富裕': 'FYX',
'抚州北': 'FBG',
'凤州': 'FZY',
'丰镇': 'FZC',
'范镇': 'VZK',
'固安': 'GFP',
'广安': 'VJW',
'高碑店': 'GBP',
'沟帮子': 'GBD',
'甘草店': 'GDJ',
'谷城': 'GCN',
'藁城': 'GEP',
'高村': 'GCV',
'古城镇': 'GZB',
'广德': 'GRH',
'贵定': 'GTW',
'贵定南': 'IDW',
'古东': 'GDV',
'贵港': 'GGZ',
'官高': 'GVP',
'葛根庙': 'GGT',
'干沟': 'GGL',
'甘谷': 'GGJ',
'高各庄': 'GGP',
'甘河': 'GAX',
'根河': 'GEX',
'郭家店': 'GDT',
'孤家子': 'GKT',
'古浪': 'GLJ',
'皋兰': 'GEJ',
'高楼房': 'GFM',
'归流河': 'GHT',
'关林': 'GLF',
'甘洛': 'VOW',
'郭磊庄': 'GLP',
'高密': 'GMK',
'公庙子': 'GMC',
'工农湖': 'GRT',
'广宁寺': 'GNT',
'广南卫': 'GNM',
'高平': 'GPF',
'甘泉北': 'GEY',
'共青城': 'GAG',
'甘旗卡': 'GQD',
'甘泉': 'GQY',
'高桥镇': 'GZD',
'赶水': 'GSW',
'灌水': 'GST',
'孤山口': 'GSP',
'果松': 'GSL',
'高山子': 'GSD',
'嘎什甸子': 'GXD',
'高台': 'GTJ',
'高滩': 'GAY',
'古田': 'GTS',
'官厅': 'GTP',
'官厅西': 'KEP',
'贵溪': 'GXG',
'涡阳': 'GYH',
'巩义': 'GXF',
'高邑': 'GIP',
'巩义南': 'GYF',
'固原': 'GUJ',
'菇园': 'GYL',
'公营子': 'GYD',
'光泽': 'GZS',
'古镇': 'GNQ',
'瓜州': 'GZJ',
'高州': 'GSQ',
'固镇': 'GEH',
'盖州': 'GXT',
'官字井': 'GOT',
'革镇堡': 'GZT',
'冠豸山': 'GSS',
'盖州西': 'GAT',
'红安': 'HWN',
'淮安南': 'AMH',
'红安西': 'VXN',
'海安县': 'HIH',
'黄柏': 'HBL',
'海北': 'HEB',
'鹤壁': 'HAF',
'华城': 'VCQ',
'合川': 'WKW',
'河唇': 'HCZ',
'汉川': 'HCN',
'海城': 'HCT',
'黑冲滩': 'HCJ',
'黄村': 'HCP',
'海城西': 'HXT',
'化德': 'HGC',
'洪洞': 'HDV',
'霍尔果斯': 'HFR',
'横峰': 'HFG',
'韩府湾': 'HXJ',
'汉沽': 'HGP',
'红光镇': 'IGW',
'浑河': 'HHT',
'红花沟': 'VHD',
'黄花筒': 'HUD',
'贺家店': 'HJJ',
'和静': 'HJR',
'红江': 'HFM',
'黑井': 'HIM',
'获嘉': 'HJF',
'河津': 'HJV',
'涵江': 'HJS',
'华家': 'HJT',
'河间西': 'HXP',
'花家庄': 'HJM',
'河口南': 'HKJ',
'黄口': 'KOH',
'湖口': 'HKG',
'呼兰': 'HUB',
'葫芦岛北': 'HPD',
'浩良河': 'HHB',
'哈拉海': 'HIT',
'鹤立': 'HOB',
'桦林': 'HIB',
'黄陵': 'ULY',
'海林': 'HRB',
'虎林': 'VLB',
'寒岭': 'HAT',
'和龙': 'HLL',
'海龙': 'HIL',
'哈拉苏': 'HAX',
'呼鲁斯太': 'VTJ',
'火连寨': 'HLT',
'黄梅': 'VEH',
'蛤蟆塘': 'HMT',
'韩麻营': 'HYP',
'黄泥河': 'HHL',
'海宁': 'HNH',
'惠农': 'HMJ',
'和平': 'VAQ',
'花棚子': 'HZM',
'花桥': 'VQH',
'宏庆': 'HEY',
'怀仁': 'HRV',
'华容': 'HRN',
'华山北': 'HDY',
'黄松甸': 'HDL',
'和什托洛盖': 'VSR',
'红山': 'VSB',
'汉寿': 'VSQ',
'衡山': 'HSQ',
'黑水': 'HOT',
'惠山': 'VCH',
'虎什哈': 'HHP',
'红寺堡': 'HSJ',
'虎石台': 'HUT',
'海石湾': 'HSO',
'衡山西': 'HEQ',
'红砂岘': 'VSJ',
'黑台': 'HQB',
'桓台': 'VTK',
'和田': 'VTR',
'会同': 'VTQ',
'海坨子': 'HZT',
'黑旺': 'HWK',
'海湾': 'RWH',
'红星': 'VXB',
'徽县': 'HYY',
'红兴隆': 'VHB',
'换新天': 'VTB',
'红岘台': 'HTJ',
'红彦': 'VIX',
'合阳': 'HAY',
'海阳': 'HYK',
'衡阳东': 'HVQ',
'华蓥': 'HUW',
'汉阴': 'HQY',
'黄羊滩': 'HGJ',
'汉源': 'WHW',
'湟源': 'HNO',
'河源': 'VIQ',
'花园': 'HUN',
'黄羊镇': 'HYJ',
'湖州': 'VZH',
'化州': 'HZZ',
'黄州': 'VON',
'霍州': 'HZV',
'惠州西': 'VXQ',
'巨宝': 'JRT',
'靖边': 'JIY',
'金宝屯': 'JBD',
'晋城北': 'JEF',
'金昌': 'JCJ',
'鄄城': 'JCK',
'交城': 'JNV',
'建昌': 'JFD',
'峻德': 'JDB',
'井店': 'JFP',
'鸡东': 'JOB',
'江都': 'UDH',
'鸡冠山': 'JST',
'金沟屯': 'VGP',
'静海': 'JHP',
'金河': 'JHX',
'锦河': 'JHB',
'精河': 'JHR',
'精河南': 'JIR',
'江华': 'JHZ',
'建湖': 'AJH',
'纪家沟': 'VJD',
'晋江': 'JJS',
'江津': 'JJW',
'姜家': 'JJB',
'金坑': 'JKT',
'芨岭': 'JLJ',
'金马村': 'JMM',
'江门': 'JWQ',
'角美': 'JES',
'莒南': 'JOK',
'井南': 'JNP',
'建瓯': 'JVS',
'经棚': 'JPC',
'江桥': 'JQX',
'九三': 'SSX',
'金山北': 'EGH',
'京山': 'JCN',
'建始': 'JRN',
'嘉善': 'JSH',
'稷山': 'JVV',
'吉舒': 'JSL',
'建设': 'JET',
'甲山': 'JOP',
'建三江': 'JIB',
'嘉善南': 'EAH',
'金山屯': 'JTB',
'江所田': 'JOM',
'景泰': 'JTJ',
'九台南': 'JNL',
'吉文': 'JWX',
'进贤': 'JUG',
'莒县': 'JKK',
'嘉祥': 'JUK',
'介休': 'JXV',
'井陉': 'JJP',
'嘉兴': 'JXH',
'嘉兴南': 'EPH',
'夹心子': 'JXT',
'简阳': 'JYW',
'揭阳': 'JRQ',
'建阳': 'JYS',
'姜堰': 'UEH',
'巨野': 'JYK',
'江永': 'JYZ',
'靖远': 'JYJ',
'缙云': 'JYH',
'江源': 'SZL',
'济源': 'JYF',
'靖远西': 'JXJ',
'胶州北': 'JZK',
'焦作东': 'WEF',
'靖州': 'JEQ',
'荆州': 'JBN',
'金寨': 'JZH',
'晋州': 'JXP',
'胶州': 'JXK',
'锦州南': 'JOD',
'焦作': 'JOF',
'旧庄窝': 'JVP',
'金杖子': 'JYD',
'开安': 'KAT',
'库车': 'KCR',
'康城': 'KCP',
'库都尔': 'KDX',
'宽甸': 'KDT',
'克东': 'KOB',
'开江': 'KAW',
'康金井': 'KJB',
'喀喇其': 'KQX',
'开鲁': 'KLC',
'克拉玛依': 'KHR',
'口前': 'KQL',
'奎山': 'KAB',
'昆山': 'KSH',
'克山': 'KSB',
'开通': 'KTT',
'康熙岭': 'KXZ',
'昆阳': 'KAM',
'克一河': 'KHX',
'开原西': 'KXT',
'康庄': 'KZP',
'来宾': 'UBZ',
'老边': 'LLT',
'灵宝西': 'LPF',
'龙川': 'LUQ',
'乐昌': 'LCQ',
'黎城': 'UCP',
'聊城': 'UCK',
'蓝村': 'LCK',
'林东': 'LRC',
'乐都': 'LDO',
'梁底下': 'LDP',
'六道河子': 'LVP',
'鲁番': 'LVM',
'廊坊': 'LJP',
'落垡': 'LOP',
'廊坊北': 'LFP',
'老府': 'UFD',
'兰岗': 'LNB',
'龙骨甸': 'LGM',
'芦沟': 'LOM',
'龙沟': 'LGJ',
'拉古': 'LGB',
'临海': 'UFH',
'林海': 'LXX',
'拉哈': 'LHX',
'凌海': 'JID',
'柳河': 'LNL',
'六合': 'KLH',
'龙华': 'LHP',
'滦河沿': 'UNP',
'六合镇': 'LEX',
'亮甲店': 'LRT',
'刘家店': 'UDT',
'刘家河': 'LVT',
'连江': 'LKS',
'李家': 'LJB',
'罗江': 'LJW',
'廉江': 'LJZ',
'庐江': 'UJH',
'两家': 'UJT',
'龙江': 'LJX',
'龙嘉': 'UJL',
'莲江口': 'LHB',
'蔺家楼': 'ULK',
'李家坪': 'LIJ',
'兰考': 'LKF',
'林口': 'LKB',
'路口铺': 'LKQ',
'老莱': 'LAX',
'拉林': 'LAB',
'陆良': 'LRM',
'龙里': 'LLW',
'零陵': 'UWZ',
'临澧': 'LWQ',
'兰棱': 'LLB',
'卢龙': 'UAP',
'喇嘛甸': 'LMX',
'里木店': 'LMB',
'洛门': 'LMJ',
'龙南': 'UNG',
'梁平': 'UQW',
'罗平': 'LPM',
'落坡岭': 'LPP',
'六盘山': 'UPJ',
'乐平市': 'LPG',
'临清': 'UQK',
'龙泉寺': 'UQJ',
'乐山北': 'UTW',
'乐善村': 'LUM',
'冷水江东': 'UDQ',
'连山关': 'LGT',
'流水沟': 'USP',
'陵水': 'LIQ',
'罗山': 'LRN',
'鲁山': 'LAF',
'丽水': 'USH',
'梁山': 'LMK',
'灵石': 'LSV',
'露水河': 'LUL',
'庐山': 'LSG',
'林盛堡': 'LBT',
'柳树屯': 'LSD',
'龙山镇': 'LAS',
'梨树镇': 'LSB',
'李石寨': 'LET',
'黎塘': 'LTZ',
'轮台': 'LAR',
'芦台': 'LTP',
'龙塘坝': 'LBM',
'濑湍': 'LVZ',
'骆驼巷': 'LTJ',
'李旺': 'VLJ',
'莱芜东': 'LWK',
'狼尾山': 'LRJ',
'灵武': 'LNJ',
'莱芜西': 'UXK',
'朗乡': 'LXB',
'陇县': 'LXY',
'临湘': 'LXQ',
'芦溪': 'LUG',
'莱西': 'LXK',
'林西': 'LXC',
'滦县': 'UXP',
'略阳': 'LYY',
'辽阳': 'LYT',
'临沂北': 'UYK',
'凌源东': 'LDD',
'连云港': 'UIH',
'临颍': 'LNF',
'老营': 'LXL',
'龙游': 'LMH',
'罗源': 'LVS',
'林源': 'LYX',
'涟源': 'LAQ',
'涞源': 'LYP',
'耒阳西': 'LPQ',
'临泽': 'LEJ',
'龙爪沟': 'LZT',
'雷州': 'UAQ',
'六枝': 'LIW',
'鹿寨': 'LIZ',
'来舟': 'LZS',
'龙镇': 'LZA',
'拉鲊': 'LEM',
'马鞍山': 'MAH',
'毛坝': 'MBY',
'毛坝关': 'MGY',
'麻城北': 'MBN',
'渑池': 'MCF',
'明城': 'MCL',
'庙城': 'MAP',
'渑池南': 'MNF',
'茅草坪': 'KPM',
'猛洞河': 'MUQ',
'磨刀石': 'MOB',
'弥渡': 'MDF',
'帽儿山': 'MRB',
'明港': 'MGN',
'梅河口': 'MHL',
'马皇': 'MHZ',
'孟家岗': 'MGB',
'美兰': 'MHQ',
'汨罗东': 'MQQ',
'马莲河': 'MHB',
'茅岭': 'MLZ',
'庙岭': 'MLL',
'茂林': 'MLD',
'穆棱': 'MLB',
'马林': 'MID',
'马龙': 'MGM',
'汨罗': 'MLQ',
'木里图': 'MUD',
'玛纳斯湖': 'MNR',
'冕宁': 'UGW',
'沐滂': 'MPQ',
'马桥河': 'MQB',
'闽清': 'MQS',
'民权': 'MQF',
'明水河': 'MUT',
'麻山': 'MAB',
'眉山': 'MSW',
'漫水湾': 'MKW',
'茂舍祖': 'MOM',
'米沙子': 'MST',
'美溪': 'MEB',
'勉县': 'MVY',
'麻阳': 'MVQ',
'密云北': 'MUP',
'米易': 'MMW',
'麦园': 'MYS',
'墨玉': 'MUR',
'庙庄': 'MZJ',
'米脂': 'MEY',
'明珠': 'MFQ',
'宁安': 'NAB',
'农安': 'NAT',
'南博山': 'NBK',
'南仇': 'NCK',
'南城司': 'NSP',
'宁村': 'NCZ',
'宁德': 'NES',
'南观村': 'NGP',
'南宫东': 'NFP',
'南关岭': 'NLT',
'宁国': 'NNH',
'宁海': 'NHH',
'南河川': 'NHJ',
'南华': 'NHS',
'泥河子': 'NHD',
'宁家': 'NVT',
'南靖': 'NJS',
'牛家': 'NJB',
'能家': 'NJD',
'南口': 'NKP',
'南口前': 'NKT',
'南朗': 'NNQ',
'乃林': 'NLD',
'尼勒克': 'NIR',
'那罗': 'ULZ',
'宁陵县': 'NLF',
'奈曼': 'NMD',
'宁明': 'NMZ',
'南木': 'NMX',
'南平南': 'NNS',
'那铺': 'NPZ',
'南桥': 'NQD',
'那曲': 'NQO',
'暖泉': 'NQJ',
'南台': 'NTT',
'南头': 'NOQ',
'宁武': 'NWV',
'南湾子': 'NWP',
'南翔北': 'NEH',
'宁乡': 'NXQ',
'内乡': 'NXF',
'牛心台': 'NXT',
'南峪': 'NUP',
'娘子关': 'NIP',
'南召': 'NAF',
'南杂木': 'NZT',
'平安': 'PAL',
'蓬安': 'PAW',
'平安驿': 'PNO',
'磐安镇': 'PAJ',
'平安镇': 'PZT',
'蒲城东': 'PEY',
'蒲城': 'PCY',
'裴德': 'PDB',
'偏店': 'PRP',
'平顶山西': 'BFF',
'坡底下': 'PXJ',
'瓢儿屯': 'PRT',
'平房': 'PFB',
'平岗': 'PGL',
'平关': 'PGM',
'盘关': 'PAM',
'平果': 'PGZ',
'徘徊北': 'PHP',
'平河口': 'PHM',
'盘锦北': 'PBD',
'潘家店': 'PDP',
'皮口': 'PKT',
'普兰店': 'PLT',
'偏岭': 'PNT',
'平山': 'PSB',
'彭山': 'PSW',
'皮山': 'PSR',
'彭水': 'PHW',
'磐石': 'PSL',
'平社': 'PSV',
'平台': 'PVT',
'平田': 'PTM',
'莆田': 'PTS',
'葡萄菁': 'PTW',
'普湾': 'PWT',
'平旺': 'PWV',
'平型关': 'PGV',
'普雄': 'POW',
'郫县': 'PWW',
'平洋': 'PYX',
'彭阳': 'PYJ',
'平遥': 'PYV',
'平邑': 'PIK',
'平原堡': 'PPJ',
'平原': 'PYK',
'平峪': 'PYP',
'彭泽': 'PZG',
'邳州': 'PJH',
'平庄': 'PZD',
'泡子': 'POD',
'平庄南': 'PND',
'乾安': 'QOT',
'庆安': 'QAB',
'迁安': 'QQP',
'祁东北': 'QRQ',
'七甸': 'QDM',
'曲阜东': 'QAK',
'庆丰': 'QFT',
'奇峰塔': 'QVP',
'曲阜': 'QFK',
'琼海': 'QYQ',
'秦皇岛': 'QTP',
'千河': 'QUY',
'清河': 'QIP',
'清河门': 'QHD',
'清华园': 'QHP',
'渠旧': 'QJZ',
'綦江': 'QJW',
'潜江': 'QJN',
'全椒': 'INH',
'秦家': 'QJB',
'祁家堡': 'QBT',
'清涧县': 'QNY',
'秦家庄': 'QZV',
'七里河': 'QLD',
'渠黎': 'QLZ',
'秦岭': 'QLY',
'青龙山': 'QGH',
'祁门': 'QIH',
'前磨头': 'QMP',
'青山': 'QSB',
'确山': 'QSN',
'清水': 'QUJ',
'前山': 'QXQ',
'戚墅堰': 'QYH',
'青田': 'QVH',
'桥头': 'QAT',
'青铜峡': 'QTJ',
'前卫': 'QWD',
'前苇塘': 'QWP',
'渠县': 'QRW',
'祁县': 'QXV',
'青县': 'QXP',
'桥西': 'QXJ',
'清徐': 'QUV',
'旗下营': 'QXC',
'千阳': 'QOY',
'沁阳': 'QYF',
'泉阳': 'QYL',
'祁阳北': 'QVQ',
'七营': 'QYJ',
'庆阳山': 'QSJ',
'清远': 'QBQ',
'清原': 'QYT',
'钦州东': 'QDZ',
'钦州': 'QRZ',
'青州市': 'QZK',
'瑞安': 'RAH',
'荣昌': 'RCW',
'瑞昌': 'RCG',
'如皋': 'RBH',
'容桂': 'RUQ',
'任丘': 'RQP',
'乳山': 'ROK',
'融水': 'RSZ',
'热水': 'RSD',
'容县': 'RXZ',
'饶阳': 'RVP',
'汝阳': 'RYF',
'绕阳河': 'RHD',
'汝州': 'ROF',
'石坝': 'OBJ',
'上板城': 'SBP',
'施秉': 'AQW',
'上板城南': 'OBP',
'世博园': 'ZWT',
'双城北': 'SBB',
'商城': 'SWN',
'莎车': 'SCR',
'顺昌': 'SCS',
'舒城': 'OCH',
'神池': 'SMV',
'沙城': 'SCP',
'石城': 'SCT',
'山城镇': 'SCL',
'山丹': 'SDJ',
'顺德': 'ORQ',
'绥德': 'ODY',
'邵东': 'SOQ',
'水洞': 'SIL',
'商都': 'SXC',
'十渡': 'SEP',
'四道湾': 'OUD',
'顺德学院': 'OJQ',
'绅坊': 'OLH',
'双丰': 'OFB',
'四方台': 'STB',
'水富': 'OTW',
'三关口': 'OKJ',
'桑根达来': 'OGC',
'韶关': 'SNQ',
'上高镇': 'SVK',
'上杭': 'JBS',
'沙海': 'SED',
'松河': 'SBM',
'沙河': 'SHP',
'沙河口': 'SKT',
'赛汗塔拉': 'SHC',
'沙河市': 'VOP',
'沙后所': 'SSD',
'山河屯': 'SHL',
'三河县': 'OXP',
'四合永': 'OHD',
'三汇镇': 'OZW',
'双河镇': 'SEL',
'石河子': 'SZR',
'三合庄': 'SVP',
'三家店': 'ODP',
'水家湖': 'SQH',
'沈家河': 'OJJ',
'松江河': 'SJL',
'尚家': 'SJB',
'孙家': 'SUB',
'沈家': 'OJB',
'松江': 'SAH',
'三江口': 'SKD',
'司家岭': 'OLK',
'松江南': 'IMH',
'石景山南': 'SRP',
'邵家堂': 'SJJ',
'三江县': 'SOZ',
'三家寨': 'SMM',
'十家子': 'SJD',
'松江镇': 'OZL',
'施家嘴': 'SHM',
'深井子': 'SWT',
'什里店': 'OMP',
'疏勒': 'SUR',
'疏勒河': 'SHJ',
'舍力虎': 'VLD',
'石磷': 'SPB',
'双辽': 'ZJD',
'绥棱': 'SIB',
'石岭': 'SOL',
'石林': 'SLM',
'石林南': 'LNM',
'石龙': 'SLQ',
'萨拉齐': 'SLC',
'索伦': 'SNT',
'商洛': 'OLY',
'沙岭子': 'SLP',
'石门县北': 'VFQ',
'三门峡南': 'SCF',
'三门县': 'OQH',
'石门县': 'OMQ',
'三门峡西': 'SXF',
'肃宁': 'SYP',
'宋': 'SOB',
'双牌': 'SBZ',
'四平东': 'PPT',
'遂平': 'SON',
'沙坡头': 'SFJ',
'商丘南': 'SPF',
'水泉': 'SID',
'石泉县': 'SXY',
'石桥子': 'SQT',
'石人城': 'SRB',
'石人': 'SRL',
'山市': 'SQB',
'神树': 'SWB',
'鄯善': 'SSR',
'三水': 'SJQ',
'泗水': 'OSK',
'石山': 'SAD',
'松树': 'SFT',
'首山': 'SAT',
'三十家': 'SRD',
'三十里堡': 'SST',
'松树镇': 'SSL',
'松桃': 'MZQ',
'索图罕': 'SHX',
'三堂集': 'SDH',
'石头': 'OTB',
'神头': 'SEV',
'沙沱': 'SFM',
'上万': 'SWP',
'孙吴': 'SKB',
'沙湾县': 'SXR',
'遂溪': 'SXZ',
'沙县': 'SAS',
'绍兴': 'SOH',
'歙县': 'OVH',
'石岘': 'SXL',
'上西铺': 'SXM',
'石峡子': 'SXJ',
'绥阳': 'SYB',
'沭阳': 'FMH',
'寿阳': 'SYV',
'水洋': 'OYP',
'三阳川': 'SYJ',
'上腰墩': 'SPJ',
'三营': 'OEJ',
'顺义': 'SOP',
'三义井': 'OYD',
'三源浦': 'SYL',
'三原': 'SAY',
'上虞': 'BDH',
'上园': 'SUD',
'水源': 'OYJ',
'桑园子': 'SAJ',
'绥中北': 'SND',
'苏州北': 'OHH',
'宿州东': 'SRH',
'深圳东': 'BJQ',
'深州': 'OZP',
'孙镇': 'OZY',
'绥中': 'SZD',
'尚志': 'SZB',
'师庄': 'SNM',
'松滋': 'SIN',
'师宗': 'SEM',
'苏州园区': 'KAH',
'苏州新区': 'ITH',
'泰安': 'TMK',
'台安': 'TID',
'通安驿': 'TAJ',
'桐柏': 'TBF',
'通北': 'TBB',
'汤池': 'TCX',
'桐城': 'TTH',
'郯城': 'TZK',
'铁厂': 'TCL',
'桃村': 'TCK',
'通道': 'TRQ',
'田东': 'TDZ',
'天岗': 'TGL',
'土贵乌拉': 'TGC',
'通沟': 'TOL',
'太谷': 'TGV',
'塔哈': 'THX',
'棠海': 'THM',
'唐河': 'THF',
'泰和': 'THG',
'太湖': 'TKH',
'团结': 'TIX',
'谭家井': 'TNJ',
'陶家屯': 'TOT',
'唐家湾': 'PDQ',
'统军庄': 'TZP',
'泰康': 'TKX',
'吐列毛杜': 'TMD',
'图里河': 'TEX',
'亭亮': 'TIZ',
'田林': 'TFZ',
'铜陵': 'TJH',
'铁力': 'TLB',
'铁岭西': 'PXT',
'天门': 'TMN',
'天门南': 'TNN',
'太姥山': 'TLS',
'土牧尔台': 'TRC',
'土门子': 'TCJ',
'潼南': 'TVW',
'洮南': 'TVT',
'太平川': 'TIT',
'太平镇': 'TEB',
'图强': 'TQX',
'台前': 'TTK',
'天桥岭': 'TQL',
'土桥子': 'TQJ',
'汤山城': 'TCT',
'桃山': 'TAB',
'塔石嘴': 'TIM',
'通途': 'TUT',
'汤旺河': 'THB',
'同心': 'TXJ',
'土溪': 'TSW',
'桐乡': 'TCH',
'田阳': 'TRZ',
'天义': 'TND',
'汤阴': 'TYF',
'驼腰岭': 'TIL',
'太阳山': 'TYJ',
'汤原': 'TYB',
'塔崖驿': 'TYP',
'滕州东': 'TEK',
'台州': 'TZH',
'天祝': 'TZJ',
'滕州': 'TXK',
'天镇': 'TZV',
'桐子林': 'TEW',
'天柱山': 'QWH',
'文安': 'WBP',
'武安': 'WAP',
'王安镇': 'WVP',
'旺苍': 'WEW',
'五叉沟': 'WCT',
'文昌': 'WEQ',
'温春': 'WDB',
'五大连池': 'WRB',
'文登': 'WBK',
'五道沟': 'WDL',
'五道河': 'WHP',
'文地': 'WNZ',
'卫东': 'WVT',
'武当山': 'WRN',
'望都': 'WDP',
'乌尔旗汗': 'WHX',
'潍坊': 'WFK',
'万发屯': 'WFB',
'王府': 'WUT',
'瓦房店西': 'WXT',
'王岗': 'WGB',
'武功': 'WGY',
'湾沟': 'WGL',
'吴官田': 'WGM',
'乌海': 'WVC',
'苇河': 'WHB',
'卫辉': 'WHF',
'吴家川': 'WCJ',
'五家': 'WUB',
'威箐': 'WAM',
'午汲': 'WJP',
'渭津': 'WJL',
'王家湾': 'WJJ',
'倭肯': 'WQB',
'五棵树': 'WKT',
'五龙背': 'WBT',
'乌兰哈达': 'WLC',
'万乐': 'WEB',
'瓦拉干': 'WVX',
'温岭': 'VHH',
'五莲': 'WLK',
'乌拉特前旗': 'WQC',
'乌拉山': 'WSC',
'卧里屯': 'WLX',
'渭南北': 'WBY',
'乌奴耳': 'WRX',
'万宁': 'WNQ',
'万年': 'WWG',
'渭南南': 'WVY',
'渭南镇': 'WNJ',
'沃皮': 'WPT',
'吴堡': 'WUY',
'吴桥': 'WUP',
'汪清': 'WQL',
'武清': 'WWP',
'武山': 'WSJ',
'文水': 'WEV',
'魏善庄': 'WSP',
'王瞳': 'WTP',
'五台山': 'WSV',
'王团庄': 'WZJ',
'五五': 'WVR',
'无锡东': 'WGH',
'卫星': 'WVB',
'闻喜': 'WXV',
'武乡': 'WVV',
'无锡新区': 'IFH',
'武穴': 'WXN',
'吴圩': 'WYZ',
'王杨': 'WYB',
'五营': 'WWB',
'武义': 'RYH',
'瓦窑田': 'WIM',
'五原': 'WYC',
'苇子沟': 'WZL',
'韦庄': 'WZY',
'五寨': 'WZV',
'王兆屯': 'WZB',
'微子镇': 'WQP',
'魏杖子': 'WKD',
'新安': 'EAM',
'兴安': 'XAZ',
'新安县': 'XAF',
'新保安': 'XAP',
'下板城': 'EBP',
'西八里': 'XLP',
'宣城': 'ECH',
'兴城': 'XCD',
'小村': 'XEM',
'新绰源': 'XRX',
'下城子': 'XCB',
'新城子': 'XCT',
'喜德': 'EDW',
'小得江': 'EJM',
'西大庙': 'XMP',
'小董': 'XEZ',
'小东': 'XOD',
'息烽': 'XFW',
'信丰': 'EFG',
'襄汾': 'XFV',
'新干': 'EGG',
'孝感': 'XGN',
'西固城': 'XUJ',
'夏官营': 'XGJ',
'西岗子': 'NBB',
'襄河': 'XXB',
'新和': 'XIR',
'宣和': 'XWJ',
'斜河涧': 'EEP',
'新华屯': 'XAX',
'新华': 'XHB',
'新化': 'EHQ',
'宣化': 'XHP',
'兴和西': 'XEC',
'小河沿': 'XYD',
'下花园': 'XYP',
'小河镇': 'EKY',
'徐家': 'XJB',
'峡江': 'EJG',
'新绛': 'XJV',
'辛集': 'ENP',
'新江': 'XJM',
'西街口': 'EKM',
'许家屯': 'XJT',
'许家台': 'XTJ',
'谢家镇': 'XMT',
'兴凯': 'EKB',
'小榄': 'EAQ',
'香兰': 'XNB',
'兴隆店': 'XDD',
'新乐': 'ELP',
'新林': 'XPX',
'小岭': 'XLB',
'新李': 'XLJ',
'西林': 'XYB',
'西柳': 'GCT',
'仙林': 'XPH',
'新立屯': 'XLD',
'兴隆镇': 'XZB',
'新立镇': 'XGT',
'新民': 'XMD',
'西麻山': 'XMB',
'下马塘': 'XAT',
'孝南': 'XNV',
'咸宁北': 'XRN',
'兴宁': 'ENQ',
'咸宁': 'XNN',
'犀浦东': 'XAW',
'西平': 'XPN',
'兴平': 'XPY',
'新坪田': 'XPM',
'霞浦': 'XOS',
'溆浦': 'EPQ',
'犀浦': 'XIW',
'新青': 'XQB',
'新邱': 'XQD',
'兴泉堡': 'XQJ',
'仙人桥': 'XRL',
'小寺沟': 'ESP',
'杏树': 'XSB',
'夏石': 'XIZ',
'浠水': 'XZN',
'下社': 'XSV',
'徐水': 'XSP',
'小哨': 'XAM',
'新松浦': 'XOB',
'杏树屯': 'XDT',
'许三湾': 'XSJ',
'湘潭': 'XTQ',
'邢台': 'XTP',
'仙桃西': 'XAN',
'*子': 'EIP',
'徐闻': 'XJQ',
'新窝铺': 'EPD',
'修武': 'XWF',
'新县': 'XSN',
'西乡': 'XQY',
'湘乡': 'XXQ',
'西峡': 'XIF',
'孝西': 'XOV',
'小新街': 'XXM',
'新兴县': 'XGQ',
'西小召': 'XZC',
'小西庄': 'XXP',
'向阳': 'XDB',
'旬阳': 'XUY',
'旬阳北': 'XBY',
'襄阳东': 'XWN',
'兴业': 'SNZ',
'小雨谷': 'XHM',
'信宜': 'EEQ',
'小月旧': 'XFM',
'小扬气': 'XYX',
'祥云': 'EXM',
'襄垣': 'EIF',
'夏邑县': 'EJH',
'新友谊': 'EYB',
'新阳镇': 'XZJ',
'徐州东': 'UUH',
'新帐房': 'XZX',
'悬钟': 'XRP',
'新肇': 'XZT',
'忻州': 'XXV',
'汐子': 'XZD',
'西哲里木': 'XRD',
'新杖子': 'ERP',
'姚安': 'YAC',
'依安': 'YAX',
'永安': 'YAS',
'永安乡': 'YNB',
'亚布力': 'YBB',
'元宝山': 'YUD',
'羊草': 'YAB',
'秧草地': 'YKM',
'阳澄湖': 'AIH',
'迎春': 'YYB',
'叶城': 'YER',
'盐池': 'YKJ',
'砚川': 'YYY',
'阳春': 'YQQ',
'宜城': 'YIN',
'应城': 'YHN',
'禹城': 'YCK',
'羊场': 'YED',
'阳城': 'YNF',
'阳岔': 'YAL',
'郓城': 'YPK',
'雁翅': 'YAP',
'云彩岭': 'ACP',
'虞城县': 'IXH',
'营城子': 'YCT',
'永登': 'YDJ',
'英德': 'YDQ',
'尹地': 'YDM',
'永定': 'YGS',
'雁荡山': 'YGH',
'于都': 'YDG',
'园墩': 'YAJ',
'英德西': 'IIQ',
'永丰营': 'YYM',
'杨岗': 'YRB',
'阳高': 'YOV',
'阳谷': 'YIK',
'友好': 'YOB',
'余杭': 'EVH',
'沿河城': 'YHP',
'岩会': 'AEP',
'羊臼河': 'YHM',
'永嘉': 'URH',
'营街': 'YAM',
'盐津': 'AEW',
'余江': 'YHG',
'叶集': 'YCH',
'燕郊': 'AJP',
'姚家': 'YAT',
'岳家井': 'YGJ',
'一间堡': 'YJT',
'英吉沙': 'YIR',
'云居寺': 'AFP',
'燕家庄': 'AZK',
'永康': 'RFH',
'营口东': 'YGT',
'银浪': 'YJX',
'永郎': 'YLW',
'宜良北': 'YSM',
'永乐店': 'YDY',
'伊拉哈': 'YLX',
'伊林': 'YLB',
'杨陵': 'YSY',
'彝良': 'ALW',
'杨林': 'YLM',
'余粮堡': 'YLD',
'杨柳青': 'YQP',
'月亮田': 'YUM',
'亚龙湾': 'TWQ',
'义马': 'YMF',
'玉门': 'YXJ',
'云梦': 'YMN',
'元谋': 'YMM',
'阳明堡': 'YVV',
'一面山': 'YST',
'沂南': 'YNK',
'宜耐': 'YVM',
'伊宁东': 'YNR',
'营盘水': 'YZJ',
'羊堡': 'ABM',
'阳泉北': 'YPP',
'乐清': 'UPH',
'焉耆': 'YSR',
'源迁': 'AQK',
'姚千户屯': 'YQT',
'阳曲': 'YQV',
'榆树沟': 'YGP',
'月山': 'YBF',
'玉石': 'YSJ',
'偃师': 'YSF',
'沂水': 'YUK',
'榆社': 'YSV',
'窑上': 'ASP',
'元氏': 'YSP',
'杨树岭': 'YAD',
'野三坡': 'AIP',
'榆树屯': 'YSX',
'榆树台': 'YUT',
'鹰手营子': 'YIP',
'源潭': 'YTQ',
'牙屯堡': 'YTZ',
'烟筒山': 'YSL',
'烟筒屯': 'YUX',
'羊尾哨': 'YWM',
'越西': 'YHW',
'攸县': 'YOG',
'玉溪': 'YXM',
'永修': 'ACG',
'弋阳': 'YIG',
'酉阳': 'AFW',
'余姚': 'YYH',
'岳阳东': 'YIQ',
'阳邑': 'ARP',
'鸭园': 'YYL',
'鸳鸯镇': 'YYJ',
'燕子砭': 'YZY',
'宜州': 'YSZ',
'仪征': 'UZH',
'兖州': 'YZK',
'迤资': 'YQM',
'羊者窝': 'AEM',
'杨杖子': 'YZD',
'镇安': 'ZEY',
'治安': 'ZAD',
'招柏': 'ZBP',
'张百湾': 'ZUP',
'枝城': 'ZCN',
'子长': 'ZHY',
'诸城': 'ZQK',
'邹城': 'ZIK',
'赵城': 'ZCV',
'章党': 'ZHT',
'肇东': 'ZDB',
'照福铺': 'ZFM',
'章古台': 'ZGD',
'赵光': 'ZGB',
'中和': 'ZHX',
'中华门': 'VNH',
'枝江北': 'ZIN',
'钟家村': 'ZJY',
'朱家沟': 'ZUB',
'紫荆关': 'ZYP',
'周家': 'ZOB',
'诸暨': 'ZDH',
'镇江南': 'ZEH',
'周家屯': 'ZOD',
'褚家湾': 'CWJ',
'湛江西': 'ZWQ',
'朱家窑': 'ZUJ',
'曾家坪子': 'ZBW',
'张兰': 'ZLV',
'镇赉': 'ZLT',
'枣林': 'ZIV',
'扎鲁特': 'ZLD',
'扎赉诺尔西': 'ZXX',
'樟木头': 'ZOQ',
'中牟': 'ZGF',
'中宁东': 'ZDJ',
'中宁': 'VNJ',
'中宁南': 'ZNJ',
'镇平': 'ZPF',
'漳平': 'ZPS',
'泽普': 'ZPR',
'枣强': 'ZVP',
'张桥': 'ZQY',
'章丘': 'ZTK',
'朱日和': 'ZRC',
'泽润里': 'ZLM',
'中山北': 'ZGQ',
'樟树东': 'ZOG',
'中山': 'ZSQ',
'柞水': 'ZSY',
'钟山': 'ZSZ',
'樟树': 'ZSG',
'珠窝': 'ZOP',
'张维屯': 'ZWB',
'彰武': 'ZWD',
'棕溪': 'ZOY',
'钟祥': 'ZTN',
'资溪': 'ZXS',
'镇西': 'ZVT',
'张辛': 'ZIP',
'正镶白旗': 'ZXC',
'*': 'ZVY',
'枣阳': 'ZYN',
'竹园坝': 'ZAW',
'张掖': 'ZYJ',
'镇远': 'ZUW',
'朱杨溪': 'ZXW',
'漳州东': 'GOS',
'漳州': 'ZUS',
'壮志': 'ZUX',
'子洲': 'ZZY',
'中寨': 'ZZM',
'涿州': 'ZXP',
'咋子': 'ZAL',
'卓资山': 'ZZC',
'株洲西': 'ZAQ',
'安仁': 'ARG',
'安阳东': 'ADF',
'栟茶': 'FWH',
'保定东': 'BMP',
'滨海': 'FHP',
'滨海北': 'FCP',
'宝鸡南': 'BBY',
'茶陵南': 'CNG',
'长寿北': 'COW',
'潮汕': 'CBQ',
'长兴': 'CBH',
'长阳': 'CYN',
'潮阳': 'CNQ',
'东安东': 'DCZ',
'东戴河': 'RDD',
'东二道河': 'DRB',
'东莞': 'RTQ',
'大苴': 'DIM',
'大荔': 'DNY',
'大青沟': 'DSD',
'德清': 'DRH',
'大冶北': 'DBN',
'定州东': 'DOP',
'鄂州东': 'EFN',
'防城港北': 'FBZ',
'富川': 'FDZ',
'丰都': 'FUW',
'涪陵北': 'FEW',
'抚远': 'FYB',
'抚州': 'FZG',
'广安南': 'VUW',
'高碑店东': 'GMP',
'葛店南': 'GNN',
'革居': 'GEM',
'光明城': 'IMQ',
'桂平': 'GAZ',
'广通北': 'GPM',
'高邑西': 'GNP',
'鹤壁东': 'HFF',
'寒葱沟': 'HKB',
'邯郸东': 'HPP',
'惠东': 'KDQ',
'洪洞西': 'HTV',
'合肥北城': 'COH',
'黄冈': 'KGN',
'黄冈东': 'KAN',
'横沟桥东': 'HNN',
'黄冈西': 'KXN',
'洪河': 'HPB',
'花湖': 'KHN',
'鲘门': 'KMQ',
'虎门': 'IUQ',
'哈密南': 'HLR',
'侯马西': 'HPV',
'衡南': 'HNG',
'淮南东': 'HOH',
'合浦': 'HVZ',
'霍邱': 'FBH',
'怀仁东': 'HFV',
'华容东': 'HPN',
'华容南': 'KRN',
'黄石北': 'KSN',
'贺胜桥东': 'HLN',
'花山南': 'KNN',
'霍州东': 'HWV',
'惠州南': 'KNQ',
'军粮城北': 'JMP',
'将乐': 'JLS',
'建宁县北': 'JCS',
'江宁': 'JJH',
'句容西': 'JWH',
'建水': 'JSM',
'界首市': 'JUN',
'介休东': 'JDV',
'晋中': 'JZV',
'库伦': 'KLD',
'葵潭': 'KTQ',
'来宾北': 'UCZ',
'灵璧': 'GMH',
'离堆公园': 'INW',
'陆丰': 'LLQ',
'禄丰南': 'LQM',
'临汾西': 'LXV',
'滦河': 'UDP',
'漯河西': 'LBN',
'灵石东': 'UDV',
'龙市': 'LAG',
'溧水': 'LDH',
'黎塘西': 'UKZ',
'溧阳': 'LEH',
'明港东': 'MDN',
'玛纳斯': 'MSR',
'庙山': 'MSN',
'蒙自北': 'MBM',
'南城': 'NDG',
'南昌西': 'NXG',
'南丰': 'NFG',
'南湖东': 'NDN',
'尼木': 'NMO',
'普安': 'PAN',
'普宁': 'PEQ',
'平南南': 'PAZ',
'平遥古城': 'PDV',
'彭州': 'PMW',
'青岛北': 'QHK',
'祁东': 'QMQ',
'前锋': 'QFB',
'岐山': 'QAY',
'庆盛': 'QSQ',
'曲水县': 'QSO',
'祁县东': 'QGV',
'祁阳': 'QWQ',
'全州南': 'QNZ',
'仁布': 'RUO',
'如东': 'RIH',
'日喀则': 'RKO',
'饶平': 'RVQ',
'泗洪': 'GQH',
'三明北': 'SHS',
'山坡东': 'SBN',
'沈丘': 'SQN',
'汕尾': 'OGQ',
'绍兴北': 'SLH',
'泗县': 'GPH',
'泗阳': 'MPH',
'上虞北': 'SSH',
'山阴': 'SNV',
'深圳北': 'IOQ',
'神州': 'SRQ',
'深圳坪山': 'IFQ',
'石嘴山': 'QQJ',
'石柱县': 'OSW',
'土地堂东': 'TTN',
'太谷西': 'TIV',
'通海': 'TAM',
'通化县': 'TXL',
'泰宁': 'TNS',
'汤逊湖': 'THN',
'藤县': 'TAZ',
'太原南': 'TNV',
'乌龙泉南': 'WFN',
'五女山': 'WET',
'瓦屋山': 'WAH',
'闻喜西': 'WOV',
'梧州南': 'WBZ',
'兴安北': 'XDZ',
'许昌东': 'XVF',
'项城': 'ERN',
'西丰': 'XFT',
'襄汾西': 'XTV',
'孝感北': 'XJN',
'咸宁东': 'XKN',
'咸宁南': 'UNN',
'协荣': 'ROO',
'邢台东': 'EDP',
'新乡东': 'EGF',
'西阳村': 'XQF',
'信阳东': 'OYN',
'咸阳秦都': 'XOY',
'迎宾路': 'YFW',
'运城北': 'ABV',
'岳池': 'AWW',
'永福南': 'YBZ',
'雨格': 'VTM',
'洋河': 'GTH',
'永济北': 'AJV',
'炎陵': 'YAG',
'杨陵南': 'YEY',
'永泰': 'YTS',
'尤溪': 'YXS',
'云霄': 'YBS',
'宜兴': 'YUH',
'应县': 'YZV',
'攸县南': 'YXG',
'余姚北': 'CTH',
'诏安': 'ZDS',
'正定机场': 'ZHP',
'纸坊东': 'ZMN',
'织金': 'IZW',
'左岭': 'ZSN',
'驻马店西': 'ZLN',
'漳浦': 'ZCS',
'庄桥': 'ZQH',
'涿州东': "ZAP",
'卓资东': 'ZDC',
'郑州东': 'ZAF'
}
新建py文件stations12306.py,将上面的12306城市代码表的内容复制进来。
新建py文件selenium12306.py,参考代码如下:
# 通过selenium实现12306网站抢票
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, ElementNotVisibleException, \
ElementNotInteractableException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from stations12306 import city
chrome = webdriver.Chrome()
# 9:商务舱,M:一等座,O:二等座,3:硬卧,4:软卧,1:硬座
class TrainSpider(object):
login_url = 'https://kyfw.12306.cn/otn/resources/login.html'
personal_url = 'https://kyfw.12306.cn/otn/view/index.html'
left_ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc'
confirm_passengers_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc'
def __init__(self, from_station, to_station, train_date, trains, passengers):
"""
:param from_station 出发地, 字符串
:param to_station 目的地, 字符串
:param train_date 乘车日期, 字符串、格式: '2020-10-20'
:param trains: 需要购买的车次,格式: {"G529": {"O", "M"}, {"G415": {"O"}}
:param passengers: 乘客, 列表格式
"""
self.from_station = from_station
self.to_station = to_station
self.train_date = train_date
self.trains = trains
self.passengers = passengers
self.station_codes = city
def login(self):
chrome.get(self.login_url)
# 通过url的转变,判断是否登录成功
WebDriverWait(chrome, 1000).until(
EC.url_to_be(self.personal_url)
)
print('登录成功')
def search_left_ticket(self):
chrome.get(self.left_ticket_url)
from_code = self.station_codes[self.from_station]
to_code = self.station_codes[self.to_station]
from_station_input = chrome.find_element_by_id('fromStation')
to_station_input = chrome.find_element_by_id('toStation')
chrome.execute_script("arguments[0].value='{}'".format(from_code), from_station_input)
chrome.execute_script("arguments[0].value='{}'".format(to_code), to_station_input)
train_date_input = chrome.find_element_by_id('train_date')
chrome.execute_script("arguments[0].value='{}'".format(self.train_date), train_date_input)
while True:
chrome.find_element_by_id('query_ticket').click()
WebDriverWait(chrome, 1000).until(
EC.presence_of_element_located((By.XPATH, '//tbody[@id="queryLeftTable"]/tr'))
)
train_trs = chrome.find_elements_by_xpath('//tbody[@id="queryLeftTable"]/tr[contains(@id, "ticket")]')
is_searched = False
for train_tr in train_trs:
train_infos = train_tr.text.replace('\n', ' ').split(' ')
number = train_infos[0] # 车次
if number in self.trains:
seat_types = self.trains[number]
for seat_type in seat_types:
if seat_type == 'O':
count = train_infos[9]
if count == '有' or int(train_infos[9] > 0):
is_searched = True
break
elif seat_type == 'M':
count = train_infos[8]
if count == '有' or int(train_infos[9] > 0):
is_searched = True
break
if is_searched:
train_tr.find_element_by_xpath('.//a[@class="btn72"]').click()
return
def confirm_passengers(self):
WebDriverWait(chrome, 1000).until(
EC.url_contains(self.confirm_passengers_url)
)
WebDriverWait(chrome, 1000).until(
EC.presence_of_element_located((By.XPATH, '//ul[@id="normal_passenger_id"]/li'))
)
passenger_lis = chrome.find_elements_by_xpath('//ul[@id="normal_passenger_id"]/li')
for passenger_li in passenger_lis:
passenger_label = passenger_li.find_element_by_xpath('./label')
if passenger_label.text in self.passengers:
passenger_label.click()
select_label = Select(chrome.find_element_by_id('seatType_1'))
train = chrome.find_element_by_xpath('//strong[@class="ml5"]') # 车次
seat_types = self.trains[train.text]
final_seat_type = None
for seat_type in seat_types:
try:
select_label.select_by_value(seat_type)
final_seat_type = seat_type
except NoSuchElementException:
continue
else:
break
chrome.find_element_by_id('submitOrder_id').click()
WebDriverWait(chrome, 1000).until(
EC.presence_of_element_located((By.XPATH, '//div[@class="up-box-bd ticket-check"]'))
)
WebDriverWait(chrome, 1000).until(
EC.element_to_be_clickable((By.ID, 'qr_submit_id'))
)
while True:
try:
chrome.find_element_by_id('qr_submit_id').click()
except ElementNotVisibleException:
break
except ElementNotInteractableException:
break
print('恭喜!成功抢到【{}】车次的【{}】席位'.format(train.text, final_seat_type))
def run(self):
self.login()
self.search_left_ticket()
self.confirm_passengers()
def main():
# 座位类别: 9:商务舱,M:一等座,O:二等座,3:硬卧,4:软卧,1:硬座
# 传入参数的格式参考如下
spider = TrainSpider('北京', '上海', '2020-10-20', {'G9': {'O', 'M'}}, ['乘客名字'])
spider.run()
if __name__ == '__main__':
main()
在main函数中事先定义好抢票信息,运行程序,扫码登陆,即可自动抢票。
该程序仅供学习参考,真实抢票程序还需另请高明。