Автоматическое нажатие кнопки "отправить" с использованием Python

Автобусная компания, которой я пользуюсь, ведет ужасный веб-сайт (на иврите, английском), который делает простой запрос "От А до Б сегодня" - кошмаром. Я подозреваю, что они пытаются поощрять использование дорогостоящей системы SMS-запросов.

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

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

Спасибо!

3 ответа

Решение

Twill - это простой язык сценариев для просмотра веб-страниц. Это случается со спортом Python API.

твил - это по существу тонкая оболочка вокруг механизированной упаковки. Все команды twill реализованы в файле commands.py, а pyparsing выполняет синтаксический анализ входных данных и преобразовывает их в команды Python (см. Parse.py). Работа с интерактивной оболочкой и поддержка readline реализованы через модуль cmd (из стандартной библиотеки Python).

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

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')

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


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

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

Другие вопросы по тегам