집단지성프로그래밍 05....

4
In [ ]: In [ ]: # kayak http://www.kayak.com/flights/SEL-JFK/2015-05-22/2015-05-22 http://www.programmableweb.com/api/kayak # http://www.kayak.com/labs/api/search "deprecated" # minidom : XML DOM >>>import xml.dom.minidom >>>dom=xml.dom.minidom.parseString('<data><rec>Hello!</rec></data)') >>>dom <xml.dom.minidom.Document instance at 0x00980C28> >>>r=dom.getElementsByTagName('rec') # getElementsByTagName('rec') >>>r [<DOM Element: rec at 0xa42350>] >>>r[0].firstChild # firstChild, "Hello" [DOM Text node "Hello!"] >>>r[0].firstChild.data # data, u'Hello!' # # - getkayaksession() import time import urllib2 import xml.dom.minidom kayakkey='YOUR KEY HERE' def getkayaksession(): # URL url='http://www.kayak.com/k/ident/apisession?token=%s&version=1' % kayakkey # XML doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read()) # <sid>xxxxxxxx</sid> sid=doc.getElementsByTagName('sid')[0].firstChild.data return sid

Upload: jieun-kim

Post on 07-Aug-2015

63 views

Category:

Science


4 download

TRANSCRIPT

Page 1: 집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522

In [ ]:

In [ ]:

# kayakhttp://www.kayak.com/flights/SEL-JFK/2015-05-22/2015-05-22http://www.programmableweb.com/api/kayak

# 개발자 키 다운로드 http://www.kayak.com/labs/api/search

"deprecated"

# minidom 패키지: XML 문서를 객체 트리로 다루는 표준 방법인 DOM인턴페이스의 경량 구현물

>>>import xml.dom.minidom>>>dom=xml.dom.minidom.parseString('<data><rec>Hello!</rec></data)')>>>dom<xml.dom.minidom.Document instance at 0x00980C28>>>>r=dom.getElementsByTagName('rec')   # getElementsByTagName('rec')>>>r[<DOM Element: rec at 0xa42350>]>>>r[0].firstChild       # firstChild, "Hello"텍스트를 가진 노드[DOM Text node "Hello!"]>>>r[0].firstChild.data   # data, 보통 유니코드 문자열u'Hello!'

# 비행편 검색# 개발자 키를 사용하여 새로운 카약 세션 얻기- getkayaksession()

import timeimport urllib2import xml.dom.minidom

kayakkey='YOUR KEY HERE'

def getkayaksession(): # 세션을 시작할 URL을 생성 url='http://www.kayak.com/k/ident/apisession?token=%s&version=1' % kayakkey # 결과로 나온 XML을 파싱 doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read()) # <sid>xxxxxxxx</sid> 찾기 sid=doc.getElementsByTagName('sid')[0].firstChild.data return sid

Page 2: 집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522

In [ ]:

# 비행편을 검색하는 함수- flightsearch()

def flightsearch(sid,origin,destination,depart_date): # 검색 Url을 생성 url='http://www.kayak.com/s/apisearch?basicmode=true&oneway=y&origin=%s' % origin url+='&destination=%s&depart_date=%s' % (destination,depart_date) url+='&return_date=none&depart_time=a&return_time=a' url+='&travelers=1&cabin=e&action=doFlights&apimode=1' url+='&_sid_=%s&version=1' % (sid)

# XML 얻기 doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read())

# 검색 ID 추출, 검색 Url이 길어서 필요한 정보를 추출하여 리턴 searchid=doc.getElementsByTagName('searchid')[0].firstChild.data

return searchid

# 더 이상 결과가 없을 때까지 요청하는 함수- flightsearchresults()- parseprice()

# flight url, 결과를 제공하는 카약 함수

Page 3: 집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522

In [ ]:

In [ ]:

def flightsearchresults(sid,searchid): # 앞의 $, 콤마를 없애고 숫자를 실수로 반환 def parseprice(p): return float(p[1:].replace(',',''))

# Polling loop(확인 루프) while 1: time.sleep(2)

# 확인용 url 생성 url='http://www.kayak.com/s/basic/flight?' url+='searchid=%s&c=5&apimode=1&_sid_=%s&version=1' % (searchid,sid) doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read())

# morepending tag를 찾고 true가 아닐때까지 기다림, 완료되기 전까지는 true를 포함하고 있음 morepending=doc.getElementsByTagName('morepending')[0].firstChild if morepending==None or morepending.data=='false': break

# 완전한 목록을 다운로드 url='http://www.kayak.com/s/basic/flight?' url+='searchid=%s&c=999&apimode=1&_sid_=%s&version=1' % (searchid,sid) doc=xml.dom.minidom.parseString(urllib2.urlopen(url).read())

# 여러 요소들을 리스트로 얻음 prices=doc.getElementsByTagName('price') departures=doc.getElementsByTagName('depart') arrivals=doc.getElementsByTagName('arrive')

# price, depart, arrive 태그를 얻어옴 # zip(), 리스트 내의 튜플로 합치기 return zip([p.firstChild.data.split(' ')[1] for p in departures], [p.firstChild.data.split(' ')[1] for p in arrivals], [parseprice(p.firstChild.data) for p in prices])

# 실제 비행편검색수행이 잘 동작하는지 확인

impork kayaksid=kayak.getkayaksession()sid=getkayaksession()searchid=kayak.flightsearch(sid,'BOS','LGA','11/17/2006') # 날짜는 원하는 시점으로~f=kayak.flightsearchresults(sid,searchid)f[0:3]

# 사람별로 처리하기- createschedule()

# 사람별로 루프를 돌면서, 출발지와 도착지로 비행편을 검색하기

Page 4: 집단지성프로그래밍 05. 최적화(kayak.ipynb) 김지은_20150522

In [ ]:

In [ ]:

In [ ]:

def createschedule(people,dest,dep,ret): # 검색용 세션 id얻기 sid=getkayaksession() flights={} for p in people: name,origin=p # 출발 비행편 searchid=flightsearch(sid,origin,dest,dep) flights[(origin,dest)]=flightsearchresults(sid,searchid) # 도착 비행편 searchid=flightsearch(sid,dest,origin,ret) flights[(dest,origin)]=flightsearchresults(sid,searchid) return flights

# 실제 비행편 데이터를 사용하여 가족비행편 최적화 (책에서는 시간문제로 2명만 적용함)

reload(kayak)f=kayak.createschedule(optimization.people[0:2],'LGA','11/17/2006','11/19/2006'optimizationflights=fdomain=[(0,30)]*len(f)optimization.geneticoptimize(domain,optimization.schedulecost)

770.0703.0...

optimization.printschedule(s)

seymour BOS 16:00-17:20 $85.0 19:00-20:28 $65.0Franny   DAL 08:00-17:25 $205.0 18:55-00:15 $133.0