2

私が使っているバス会社はひどいウェブサイト (ヘブライ語英語) を運営しており、「今日の A 地点から B 地点までの時刻表」という単純なクエリが悪夢のように表示されます。コストのかかる SMS クエリ システムの使用を奨励しようとしているのではないかと思います。

可能なすべてのポイントからすべての可能なポイントへのクエリを送信することで、サイトから時刻表全体を収集しようとしています。これは合計で約 10,000 件のクエリになります。クエリ結果がポップアップ ウィンドウに表示されます。私は Web プログラミングにまったく慣れていませんが、Python の基本的な側面には精通しています。

  1. ページを解析し、ドロップダウン メニューから値を選択し、スクリプトを使用して「送信」を押す最も洗練された方法は何ですか?
  2. プログラムに新しいポップアップの内容を入力として渡すにはどうすればよいですか?

ありがとう!

4

3 に答える 3

11

Twillは、Web ブラウジング用の単純なスクリプト言語です。たまたまpython apiを使用しています。

ツイルは基本的に機械化パッケージの周りの薄いシェルです。すべての twill コマンドは commands.py ファイルに実装されており、pyparsing は入力を解析して Python コマンドに変換する作業を行います (parse.py を参照)。インタラクティブなシェル作業と readline のサポートは、(標準の Python ライブラリから) cmd モジュールを介して実装されます。

上記のリンクされたドキュメントから送信を「押す」例:

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')
于 2009-07-04T15:14:08.380 に答える
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

于 2009-07-04T15:22:14.730 に答える
7

ハンドラーリソースに直接GETまたはPOSTリクエストを行うのではなく、実際に「送信ボタンを押す」ことはめったにありません。フォームが存在するHTMLを確認し、フォームがどのURLに送信するか、およびGETメソッドかPOSTメソッドかを確認します。これらのリクエストは、urllib(2)を使用して簡単に作成できます。

于 2009-07-04T15:30:05.183 に答える