使用Python自动点击“提交”按钮

2 投票
3 回答
11449 浏览
提问于 2025-04-15 12:41

我用的这家公交公司的网站真是糟糕透了,想在上面查“今天从A到B的时刻表”简直是一场噩梦。 我怀疑他们是想让大家使用那种收费的短信查询系统。

我想从这个网站上获取整个时刻表,方法是对每一个可能的出发点和到达点提交查询,总共大约需要提交1万次查询。查询结果会在一个弹出窗口中显示。我对网页编程还很陌生,但对Python的基本知识还是有点了解。

  1. 用脚本来解析页面、从下拉菜单中选择一个值并点击“提交”的最优雅的方法是什么?
  2. 我该如何把新弹出窗口中的内容作为输入给程序?

谢谢!

3 个回答

7

你很少需要真的去“点击提交按钮”,而是可以直接向处理资源发送GET或POST请求。看看表单的HTML代码,看看它提交了哪些参数到哪个网址,以及使用的是GET还是POST方法。你可以很简单地用urllib(2)来构造这些请求。

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

11

Twill 是一种简单的脚本语言,用于浏览网页。它还提供了一个 Python 接口

twill 本质上是一个围绕 mechanize 包的轻量级外壳。所有的 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')

撰写回答