你可以使用Python通过
pywebkitgtk 自动化Web任务。它是针对WebKitGtk的Python绑定,使用的是与Chrome相同的WebKit引擎。
感谢这篇博客文章
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 = gtk.Window()
window.set_default_size(800, 600)
scroll_view = gtk.ScrolledWindow()
scroll_view.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
scroll_view.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
web_view = WebView()
window.connect('delete-event', lambda window, event: gtk.main_quit())
scroll_view.add(web_view)
window.add(scroll_view)
window.show_all()
然后你就可以开始自动化了!例如,这段代码加载了Stack Overflow的登录页面,点击Facebook登录按钮,填写用户名和密码(在本例中为“test”)。最后,它显示登录按钮文本。
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("
web_view.wait_for_load()
您会注意到,在所有脚本都完成后,该应用程序会在不等待的情况下自动关闭。
如果您希望在完成其中所有脚本后继续运行该应用程序,您需要添加以下最后一行代码:
gtk.main()
如果您删除 window.show_all()
行和最后一行的 gtk.main()
,那么您的应用程序将在没有 GUI 的情况下运行。(注意:您仍需要显示服务器。)
现在我们还没有好的 pywebkitgtk 文档,所以您必须查看 WebKitGtk 的文档。祝好运。
wget
是你的好帮手! - Kyle Wild