2009-07-04 4 views
1

Автобусная компания, которую я использую, запускает ужасный сайт (Hebrew, English), который делает простой «От A до B расписания сегодня» запросить кошмар. Я подозреваю, что они пытаются поощрять использование дорогостоящей системы запросов SMS.Автоматическое нажатие кнопки «отправить» с помощью python

Я пытаюсь собрать все расписание с сайта, отправив запрос на все возможные точки на все возможные точки, которые суммируют примерно до 10 тыс. Запросов. Результат запроса появляется во всплывающем окне. Я новичок в веб-программировании, но знаком с основными аспектами python.

  1. Самый элегантный способ разобрать страницу, выбрать значение для раскрывающегося меню и нажать «отправить» с помощью сценария?
  2. Как я могу предоставить программе содержимое нового всплывающего окна в качестве входных данных?

Спасибо!

ответ

10

Twill - это простой язык сценариев для просмотра веб-страниц. Это происходит со спортом python api.

twill is essentially a thin shell around the mechanize package. All twill commands are implemented in the commands.py file, and pyparsing does the work of parsing the input and converting it into Python commands (see parse.py). Interactive shell work and readline support is implemented via the cmd module (from the standard Python library).

Пример "кнопки" отправить из вышеприведенного, связанного документ:

from twill.commands import go, showforms, formclear, fv, submit 

go('http://issola.caltech.edu/~t/qwsgi/qwsgi-demo.cgi/') 
go('./widgets') 
showforms() 

formclear('1') 
fv("1", "name", "test") 
fv("1", "password", "testpass") 
fv("1", "confirm", "yes") 
showforms() 

submit('0') 
+0

Мне нужно было использовать submit() не submit ('0') из-за ошибки: экземпляр HiddenControl не имеет атрибута '_click'. см.: lists.idyll.org/pipermail/twill/2006-August/000526.html – user391339

10

Я хотел бы предложить вам использовать mechanize. Вот фрагмент кода с их страницы, которая показывает, как отправить форму:


import re 
from mechanize import Browser 

br = Browser() 
br.open("http://www.example.com/") 
# follow second link with element text matching regular expression 
response1 = br.follow_link(text_regex=r"cheese\s*shop", nr=1) 
assert br.viewing_html() 
print br.title() 
print response1.geturl() 
print response1.info() # headers 
print response1.read() # body 
response1.close() # (shown for clarity; in fact Browser does this for you) 

br.select_form(name="order") 
# Browser passes through unknown attributes (including methods) 
# to the selected HTMLForm (from ClientForm). 
br["cheeses"] = ["mozzarella", "caerphilly"] # (the method here is __setitem__) 
response2 = br.submit() # submit current form 

# print currently selected form (don't call .submit() on this, use br.submit()) 
print br.form 

7

Вы очень редко хотите на самом деле «нажмите кнопку отправки», а не делать GET или POST запросов к ресурсу обработчика непосредственно. Посмотрите на HTML, где находится форма, и посмотрите, какие параметры передают на какой URL-адрес, и если это метод GET или POST. Вы можете сформировать эти запросы с помощью urllib (2) достаточно легко.

+1

Механизированный пакет избавляет вас от большей части скучной детали «... посмотрите, какие параметры отправляются ...». Twill берет механизацию и обеспечивает более высокий уровень абстракции. – gimel