# -*- coding: utf-8 -*- # wymagana wersja pythona >=2.4 <3.0 import urllib2, re, codecs, time from operator import itemgetter def getPrzystanekId(przystanek): global przystankiId global autoId przystanek = ' '.join(przystanek.split()) # usuwanie nadmiarowych spacji if przystanek.endswith(u' NŻ') : # usuwanie NŻ przystanek = przystanek[:-3] if przystanek.endswith(u' (NŻ)') : # usuwanie (NŻ) przystanek = przystanek[:-5] try : id = przystankiId[przystanek] except KeyError: przystankiId[przystanek]=autoId id = autoId autoId += 1 #raise KeyError('nie znaleziono przystanku: ', arg, '->', przystanek) return (unicode(id), przystanek) def sortedDictByVal(adict): return sorted(adict.items(), key = itemgetter(1)) def rozkladyOut (fname, rozklady, first, last) : global godziny1Re global godziny2Re global godziny3Re global godziny4Re global godziny5Re global godziny6Re global godziny7Re global powszedniRe global sobotyRe global swietaRe global waznRe global sourceEncoding global przystankiId f = codecs.open(fname, 'w', targetEncoding) f.write(linia+'\n') f.write(first+'\n') f.write(last+'\n') for r in rozklady : # dla kazdego przystanku danej linii w danym kierunku id = getPrzystanekId(unicode(r.group('przystanek'),sourceEncoding))[0] f.write( id + unicode('\n') ) html = urllib2.urlopen(baseurl+dir+r.group('url')).read() pow = powszedniRe.match(html) sob = sobotyRe.match(html) sw = swietaRe.match(html) ptSobSw = ptSobSwRe.match(html) czwPtSobSw = czwPtSobSwRe.match(html) if (czwPtSobSw is not None) : ptSobSw = pow = sob = sw = None if (pow is not None) & (sob is None) & (sw is None) : # powszednie regExp = godziny1Re elif (pow is not None) & (sob is None) & (sw is not None) : # powszednie i swieta regExp = godziny2Re elif (pow is not None) & (sob is not None) & (sw is not None) : #powszednie, soboty i swieta regExp = godziny3Re elif (pow is None) & (sob is None) & (sw is not None) : # swieta regExp = godziny4Re elif (pow is None) & (sob is not None) & (sw is not None) : # soboty i swieta regExp = godziny5Re elif (pow is not None) & (sob is not None) & (sw is None) : # powszednie i soboty regExp = godziny6Re elif (pow is None) & (sob is not None) & (sw is None) : # soboty regExp = godziny7Re elif (ptSobSw is not None) : # soboty i swieta (613) regExp = godziny4Re # wyrazenie dla swiat elif (czwPtSobSw is not None) : regExp = godziny3Re # wyrazenie dla powszednie, soboty i swieta else : raise NameError('inna tablica rozkladow:', pow, sob, sw) godziny = regExp.finditer(html) wazn = waznRe.search(html) wazn = wazn.group('data') powszednie = [] soboty = [] swieta = [] for g in godziny : try : for minuty in g.group('m_pow').split() : if (minuty != '-' ) : #przypis = minuty[2:] # na przyszlosc... powszednie.append((g.group('h_pow') + minuty[:2]).zfill(4)) except IndexError: pass try : for minuty in g.group('m_sob').split() : if (minuty != '-' ) : #przypis = minuty[2:] soboty.append((g.group('h_sob')+minuty[:2]).zfill(4)) except IndexError: pass try : for minuty in g.group('m_sw').split() : if (minuty != '-' ) : #przypis = minuty[2:] swieta.append((g.group('h_sw')+minuty[:2]).zfill(4)) except IndexError: pass powszednie.sort() soboty.sort() swieta.sort() powszednie = ','.join(powszednie) soboty = ','.join(soboty) swieta = ','.join(swieta) if not powszednie : powszednie = 'BRAK' if not soboty : soboty = 'BRAK' if not swieta : swieta = 'BRAK' if (pow is None) & (sob is None) & (sw is None) & (ptSobSw is not None) : #613 - wyrazenie dla swiat, a rozklad wspolny dla sobot i swiat soboty = swieta f.write(powszednie+"\n") f.write(soboty+"\n") f.write(swieta+"\n") print '.', f.write(getPrzystanekId(last)[0]) f.close() return time.strptime(wazn,'%d.%m.%Y') baseurl = 'http://rozklady.mpk.krakow.pl/' dir = '' file = '' sourceEncoding = 'iso-8859-2"' targetEncoding = 'utf-8' anchorUrlRe = re.compile('[^\"]*)\".*>(?P.*)',re.IGNORECASE) przystankiUrlRe = re.compile('
  • \s*[^\"]*)\"\s*>(?P[^<>]*)\s*
  • ',re.IGNORECASE) frameLRe = re.compile('[^\"]*)\"\s+name=\"L\">', re.IGNORECASE) kierunkiUrlRe = re.compile('[^\"]*)\"[^>]*>(?P[^<>]*)', re.IGNORECASE) rozkladyUrlRe = re.compile('[^\"]*)\"\s+target=\"R\"\s*>()?(?P[^<>]*)()?', re.IGNORECASE) firstLastRe = re.compile('([^<>]*)', re.IGNORECASE) powszedniRe = re.compile('.*]*>\s*Dzie. powszedni\s*.*', re.IGNORECASE ) sobotyRe = re.compile('.*]*>\s*Soboty\s*.*', re.IGNORECASE ) swietaRe = re.compile('.*]*>\s*.wi.ta\s*.*', re.IGNORECASE) ptSobSwRe = re.compile('.*]*>\s*Pt\./Sob\., Sob\./.w\.\s*.*',re.IGNORECASE) czwPtSobSwRe = re.compile('.*]*>\s*Pon\.-Czw\.\s*.*]*>\s*Pt\./Sob\.,\s*Sob\./.w\.\s*.*]*>\s*.wi.ta\s*.*',re.IGNORECASE) Re = re.compile('.*]*>\s*Pt\./Sob\., Sob\./.w\.\s*.*',re.IGNORECASE) godziny1Re = re.compile('[^<>]*]*>(?P[^<>]*)]*>(?P[^<>]*)') godziny2Re = re.compile('[^<>]*]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)') godziny3Re = re.compile('[^<>]*]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)') godziny4Re = re.compile('[^<>]*]*>(?P[^<>]*)]*>(?P[^<>]*)') godziny5Re = re.compile('[^<>]*]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)') godziny6Re = re.compile('[^<>]*]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)]*>(?P[^<>]*)') godziny7Re = re.compile('[^<>]*]*>(?P[^<>]*)]*>(?P[^<>]*)') waznRe = re.compile('Rozk.ad jazdy wa.ny od\s*(?P\d{2}\.\d{2}\.\d{4})\s*do odwo.ania') linieUrl = dict() przystankiId = dict() pliki = [] # lista plikow z liniami autoId = 0 m = anchorUrlRe.finditer(urllib2.urlopen(baseurl+'linie.aspx').read()) for s in m : tmp = unicode(s.group('nr'),sourceEncoding) linieUrl[tmp] = s.group('url') print len(linieUrl), " linii" # test #linieUrl = {'601':linieUrl['601'], '603':linieUrl['603'], '604':linieUrl['604'], '605':linieUrl['605'], '608':linieUrl['608'], '609':linieUrl['609'], '610':linieUrl['610'], '613':linieUrl['613'], '618':linieUrl['618'], '902':linieUrl['902'] } #linieUrl = {'24':linieUrl['24']} wazn = time.strptime("01.01.1900", "%d.%m.%Y") for linia in linieUrl.iterkeys() : # dla kazdej linii ( '1', '2', ... ) print linia, ( dir, file) = linieUrl[linia].rsplit('/',1) dir = dir + '/' frameUrl = frameLRe.search(urllib2.urlopen(baseurl+linieUrl[linia]).read()).group('url') #url lewej ramki z przystankami i kierunkami frame = urllib2.urlopen(baseurl+dir+frameUrl).read() kierunki = kierunkiUrlRe.finditer(frame[frame.rfind('Inne kierunki:'):]) # pozostale kierunki rozklady = rozkladyUrlRe.finditer(frame) # iterator z rozkladem z przystanku w danym kierunku m = firstLastRe.findall(frame) first = getPrzystanekId( unicode(m[1],sourceEncoding) )[1] last =getPrzystanekId( unicode(m[-2],sourceEncoding) )[1] i = 0 print '\n', first, '-', last, fname = '%s-%d.txt' % (linia.zfill(4),i) pliki.append(fname) tmp = rozkladyOut('rozklad/'+fname, rozklady, first, last) if ( tmp > wazn) : wazn = tmp for k in kierunki : # pobieranie rozkladow dla pozostalych kierunkow frameUrl = frameLRe.search(urllib2.urlopen(baseurl+dir+k.group('url')).read()).group('url') #url lewej ramki z przystankami i kierunkami frame = urllib2.urlopen(baseurl+dir+frameUrl).read() rozklady = rozkladyUrlRe.finditer(frame) m = firstLastRe.findall(frame) first = getPrzystanekId( unicode(m[1],sourceEncoding) )[1] last = getPrzystanekId( unicode(m[-2],sourceEncoding) )[1] print '\n', first, '-', last, i += 1 fname = '%s-%d.txt' % (linia.zfill(4),i) pliki.append(fname) tmp = rozkladyOut('rozklad/'+fname, rozklady, first, last) if ( tmp > wazn) : wazn = tmp print '\n' pliki.sort() f = codecs.open('rozklad/linie.txt', 'w', targetEncoding) for fname in pliki : f.write(fname+'\n') f.close() f = codecs.open('rozklad/przystanki.txt', 'w', targetEncoding) for p in sortedDictByVal(przystankiId) : f.write(unicode(p[1])+" "+p[0]+"\n") f.close() f=codecs.open('rozklad/info.txt','w', targetEncoding) f.write(u'Kraków\n') f.write(time.strftime("%d.%m.%Y",wazn)+'\n') #data ważności - najnowsza ze wszystkich rozkladow f.write(time.strftime("%d.%m.%Y",time.localtime())+'\n') #dzis f.write(u'owiec\n') f.write(u'powcarz+transportoid@gmail.com\n') f.write(u'Rozkład linii nocnych: noc z piątku na sobote jest traktowana jako sobota (nawet jeśli jest to piątek 23:33). Podobna sytuacja ma się do nocy poprzedzającej niedziele i święta') f.close() print 'done'