Автоматическое нажатие кнопки "отправить" с использованием Python
Автобусная компания, которой я пользуюсь, ведет ужасный веб-сайт (на иврите, английском), который делает простой запрос "От А до Б сегодня" - кошмаром. Я подозреваю, что они пытаются поощрять использование дорогостоящей системы SMS-запросов.
Я пытаюсь собрать все расписание с сайта, отправив запрос для каждой возможной точки в каждую возможную точку, что в сумме составит около 10 тыс. Запросов. Результат запроса появится во всплывающем окне. Я довольно новичок в веб-программировании, но знаком с основными аспектами Python.
- Какой самый элегантный способ проанализировать страницу, выбрать значение в раскрывающемся меню и нажать "Отправить" с помощью скрипта?
- Как мне дать программе содержимое нового всплывающего окна в качестве входных данных?
Спасибо!
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) достаточно легко.