您可以使用 Python 通过pywebkitgtk 自动执行 Web 任务。它是WebKitGtk的Python绑定,使用WebKit引擎,和chrome一样的引擎。
感谢这篇博文,pywebkitgtk - Execute JavaScript from Python,我创建了webkit.WebView 的子类来简化这些任务。
import gtk
import webkit
import json
class WebView(webkit.WebView):
def eval_script(self, script):
self.execute_script('oldtitle=document.title;document.title="!!!!";document.title=JSON.stringify(eval(' + json.dumps(script) + '));')
result = json.loads(self.get_main_frame().get_title())
self.execute_script('document.title=oldtitle;')
return result
def wait_for_load(self):
handle = None
def load_status_cb(view, frame):
if frame == view.get_main_frame():
self.disconnect(handle)
gtk.main_quit()
handle = self.connect('load-finished', load_status_cb)
gtk.main()
我添加了名为eval_script 的函数,类似于execute_script,但您可以将函数的结果作为Python 对象获得。您只需要确保您正在评估的内容是 JSON 可序列化的。
另外,我添加了一个 wait_for_load 函数,该函数非常不言自明。
要设置 UI,您首先必须创建一个窗口、一个滚动窗口和一个 Web 视图。
# window
window = gtk.Window()
window.set_default_size(800, 600)
# scroll view
scroll_view = gtk.ScrolledWindow()
scroll_view.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
scroll_view.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
# web view
web_view = WebView()
# events
window.connect('delete-event', lambda window, event: gtk.main_quit())
# show
scroll_view.add(web_view)
window.add(scroll_view)
window.show_all()
然后你就可以开始自动化了!例如,这段代码加载了 StackOverflow 的登录页面,点击 Facebook 登录按钮,填写用户名和密码(本例中为“test”)。最后,它显示了登录按钮文本。
# the script is here
web_view.open('http://www.stackoverflow.com/users/login')
web_view.wait_for_load()
web_view.execute_script('openid.signin("facebook")')
web_view.wait_for_load()
web_view.execute_script('document.querySelector("#email").value = "test"')
web_view.execute_script('document.querySelector("#pass").value = "test"')
print "Login's button text is:", web_view.eval_script('document.querySelector("#buttons input[type=\\"submit\\"]").value')
在我的例子中,Facebook 的界面是泰语的,我可以看到登录按钮的文字。
登录按钮文字为:เข้าสู่ระบบ
您也可以让它实际单击提交按钮,只需在该元素上调用click()。 (注意:click() 适用于按钮元素,不适用于链接)
web_view.execute_script('document.querySelector("#buttons input[type=\\"submit\\"]").click()')
web_view.wait_for_load()
您会注意到,在所有脚本完成后,应用程序会自行关闭而无需等待。
如果您想在应用程序完成所有脚本后继续运行,您需要添加最后一行:
gtk.main()
此外,如果您删除 window.show_all() 行和最后一个 gtk.main() 行。然后您的应用程序将在没有 GUI 的情况下运行。 (注意:您仍然需要一个显示服务器。)
目前,我们还没有好的 pywebkitgtk 文档,因此您必须改为查看 WebKitGtk's documentation。祝你好运。