使用Spynner基于Webkit从最底层模拟浏览器行为

WebKit是开源的Web浏览器引擎,苹果的Safari、谷歌的Chrome浏览器都是基于这个框架来开发的。WebKit 还支持移动设备和手机,包括iPhone和Android手机都是使用WebKit做为浏览器的核心。了解更多>>>

由于是直接使用浏览器引擎,所以能够访问和修改浏览器的各项底层属性,能够与其进行深度的交互。例如,可以进行代理设置、HTTP头读取和修改、Cookie读取和设置、缓存控制、URL过滤。另外,Webkit方案还能够跨平台使用。

Qt库是一个跨平台C++图形用户界面应用程序开发框架,QtWebKit是Webkit在Qt库中的封装。

PyQt4是Qt库的Python实现,我们可以直接使用PyQt4.QtWebKit来实现一个自定义功能的浏览器。

spynner是一个对PyQt4.QtWebKit 的封装库,使得QtWebKit更易于使用,该开源项目的位置在https://github.com/makinacorpus/spynner

spynner的例子可以参考https://github.com/makinacorpus/spynner/blob/master/src/spynner/tests/spynner.rst

Spynner is a stateful programmatic web browser module for Python. It is based upon PyQT and WebKit. It supports Javascript, AJAX, and every other technology that !WebKit is able to handle (Flash, SVG, ...). Spynner takes advantage of JQuery. a powerful Javascript library that makes the interaction with pages and event simulation really easy.

Using Spynner you would able to simulate a web browser with no GUI (though a browsing window can be opened for debugging purposes), so it may be used to implement crawlers or acceptance testing tools.

一个简单的完整例子:

import spynner

if __name__ == "__main__":
    browser = spynner.Browser()
    # 设置代理
    #browser.set_proxy('http://host:port')
    browser.show()
    try:
        browser.load(url='http://duckduckgo.com', load_timeout=120, tries=1)
    except spynner.SpynnerTimeout:
        print 'Timeout.'
    else:
        # 输入搜索关键字
        browser.wk_fill('input[id="search_form_input_homepage"]', 'something')
        # 点击搜索按钮,并等待页面加载完毕
        browser.wk_click('input[id="search_button_homepage"]', wait_load=True)
        # 获取页面的HTML
        html = browser.html
        if html:
            html = html.encode('utf-8')
            open('search_results.html', 'w').write(html)
    browser.close()
原文地址:https://www.cnblogs.com/leonbond/p/3070847.html