2012-06-14 2 views
2

Я пытаюсь использовать механизировать, чтобы захватить цены на метро-север железной дороги в Нью-Йорке с этого сайта:
http://as0.mta.info/mnr/fares/choosestation.cfmPython механизировать Javascript

Проблема заключается в том, что при выборе первого варианта, сайт использует JavaScript, чтобы заполнить список возможных мест назначения. Я написал эквивалентный код в python, но я не могу заставить все это работать. Вот то, что я до сих пор:

import mechanize 
import cookielib 
from bs4 import BeautifulSoup 

br = mechanize.Browser() 
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1)  Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 

br.open("http://as0.mta.info/mnr/fares/choosestation.cfm") 

br.select_form(name="form1") 
br.form.set_all_readonly(False) 

origin_control = br.form.find_control("orig_stat", type="select") 
origin_control_list = origin_control.items 
origin_control.value = [origin_control.items[0].name] 

destination_control_list = reFillList(0, origin_control_list) 

destination_control = br.form.find_control("dest_stat", type="select") 
destination_control.items = destination_control_list 
destination_control.value = [destination_control.items[0].name] 

response = br.submit() 
response_text = response.read() 
print response_text 

Я знаю, что я не дал вам код для метода reFillList(), потому что это долго, но предполагаю, что это правильно создает список объектов mechanize.option. Python ни о чем не жалуется, но на отправке я получаю html для этого предупреждения:

«Информация о тарифах на проезд между двумя линиями недоступна в режиме онлайн. Свяжитесь с нашим Информационным центром для клиентов в 511 и спросите поговорить с представителем для получения дополнительной информации ».

Я что-то упустил? Спасибо за помощь!

ответ

2

Если вы знаете идентификатор станции, это проще POST данной просьбе себя:

import mechanize 
import urllib 

post_url = 'http://as0.mta.info/mnr/fares/get_fares.cfm' 

orig = 295 #BEACON FALLS 
dest = 292 #ANSONIA 

params = urllib.urlencode({'dest_stat':dest, 'orig_stat':orig }) 
rq = mechanize.Request(post_url, params) 

fares_page = mechanize.urlopen(rq) 

print fares_page.read() 

Если у вас есть код, чтобы найти список идентификаторов назначения для заданного исходного ID (т.е. вариант refillList()), вы можете запустить этот запрос для каждой комбинации:

import mechanize 
import urllib, urllib2 
from bs4 import BeautifulSoup 

url = 'http://as0.mta.info/mnr/fares/choosestation.cfm' 
post_url = 'http://as0.mta.info/mnr/fares/get_fares.cfm' 

def get_fares(orig, dest): 
    params = urllib.urlencode({'dest_stat':dest, 'orig_stat':orig }) 
    rq = mechanize.Request(post_url, params) 

    fares_page = mechanize.urlopen(rq) 
    print(fares_page.read()) 

pool = BeautifulSoup(urllib2.urlopen(url).read()) 

#let's keep our stations organised 
stations = {} 

# dict by station id 
for option in pool.find('select', {'name':'orig_stat'}).findChildren(): 
    stations[option['value']] = {'name':option.string} 

#iterate over all routes 
for origin in stations: 
    destinations = get_list_of_dests(origin) #use your code for this 
    stations[origin]['dests'] = destinations 

    for destination in destinations: 
     print('Processing from %s to %s' % (origin, destination)) 
     get_fares(origin, destination) 
+0

Огромное спасибо за помощь! – jmetz

Смежные вопросы