Python train crawling 12306

Obtaining railway station

stations.py

#import certifi
#import urllib3
import re
import requests
from pprint import pprint


url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9001'
response = requests.get(url, verify=False)
stations = re.findall('([\u4e00-\u9fa5]+)\|([A-Z]+)',response.text)
print(dict(stations))
#pprint(dict(stations),indent=4)

Based on origin, destination, time of the query

# ! / Usr / bin / Python the env 
# Coding: UTF-. 8 
"" " ticket viewer command 
the Usage: 
    12306 [-gdtkz] <from> <to> <DATE> 

the Options: 
    -H, - Help display help 
    -g high-speed rail 
    -d EMU 
    -t Express 
    -k fast 
    -z direct 

Example: 
    12306 Shanghai Beijing 2016-12-16 
    12306 -dg Shanghai Beijing 2016-12-16 
    
PIP install Requests Prettytable docopt Colorama 
#prettytable formatting tools 
#docopt is location parameter parsing command line tool python3 
#colorama display color is to add 

"" " 
Import Requests
 from docopt Import docopt
 Import SYS
# Sys.path.append (R & lt "/ Py / Stations") 
from Stations Import Stations
 Import JSON
 from Prettytable Import Prettytable 

class TrainsCollections: 
    header = ' train station over time First Second soft sleeper seat with no seat ' .split ()
     DEF  the __init__ (Self, available_tranins, Options): 
        self.available_tranins = available_tranins 
        self.options = Options
     DEF _get_duration (Self, raw_train): 
        durations = raw_train.get ( ' Lishi' ) .Replace ( ' : ' , ' h ' ) + ' points ' 
        return durations 
        
    # decorators, this function is defined as the attribute, the function to be called other 
    @Property
     DEF Trains (Self):
         for raw_train in self.available_tranins : 
            train_no = raw_train [ ' station_train_code ' ] 
            Initial = train_no [0] .lower ()
             IF  Not self.options or Initial   in  self.options:
                Train = [
                train_no,
                '\n'.join([raw_train['from_station_name'],raw_train['to_station_name']]),
                '\n'.join([raw_train['start_time'],raw_train['arrive_time']]),
                self._get_duration(raw_train),
                raw_train['zy_num'],
                raw_train['ze_num'],
                raw_train['rw_num'],
                raw_train['yw_num'],
                raw_train['yz_num'],
                raw_train['wz_num'],
                ]
                #print(train)
                #生成器,一次返回一项
                yield train

    def pretty_print(self):
        pt = PrettyTable()
        pt._set_field_names(self.header)
        for train in self.trains:
            pt.add_row(train)
            print(pt)
    
def cli():
    '''
    {
    '-d':True,
    '-g':True,
    '-k':False,
    '-t':False,
    '-z':False,
    '<date>':'2017-03-23',
    '<from>':'海口',
    '<to>':'北京'}
    '''
    arguments = docopt(__doc__)
    print(arguments)
    from_station = stations.get(arguments['<from>'])
    to_station = stations.get(arguments['<to>'])
    date = arguments['<date>
    options =Get parameters, a list of analytical#]
    '''.join([k for k,v in arguments.items() if v is True])
    url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(date,from_station,to_station)
    #url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'
    r = requests.get(url,verify=False)
    print(url)
    #jjj = json.loads(str(r))
    available_tranins1 = r.json()['data']
    available_tranins = []
    for available_tranins2 in available_tranins1:
       available_tranins.append(available_tranins2['queryLeftNewDTO'])
        #available_tranins = list(available_tranins.keys())
       # print(available_tranins)
        #TrainsCollections(available_tranins,options).pretty_print()
    #available_tranins = available_tranins2['queryLeftNewDTO']
    #print(available_tranins)
    #print(type(available_tranins[0]))
    TrainsCollections(available_tranins,options).pretty_print()

if __name__ == '__main__':
    #TrainsCollections.cli()
    cli()

 

Guess you like

Origin www.cnblogs.com/linyouyi/p/11409910.html