0

我想使用 python 抓取 AJAX 站点,我参考了这篇文章: http : //blog.motane.lu/2009/06/18/pywebkitgtk-execute-javascript-from-python/ 它使用 gtk 和 pywebkitgtk。

但我想知道如何同时抓取页面(多线程)。

我在下面写代码,似乎pool.apply_async不能调用do_crawl函数。如果使用 pool.apply,将调用 do_crawl。

import gtk
import webkit
from multiprocessing.pool import ThreadPool

class WebView(webkit.WebView):
    def get_html(self):
        self.execute_script('oldtitle=document.title;document.title=document.documentElement.innerHTML;')
        html = self.get_main_frame().get_title()
        self.execute_script('document.title=oldtitle;')
        return html

class Crawler(gtk.Window):
    def __init__(self, url):
        gtk.gdk.threads_init() # suggested by Nicholas Herriot for Ubuntu Koala
        gtk.Window.__init__(self)
        self._url = url

    def crawl(self):
        view = WebView()
        view.open(self._url)
        view.connect('load-finished', self._finished_loading)
        self.add(view)
        gtk.main()

    def _finished_loading(self, view, frame):
        view.get_html()
        gtk.main_quit()

def main():
    pool = ThreadPool(10)
    [pool.apply_async(do_crawl, ('http://google.com/')) for i in range(100)]
    pool.join()


def do_crawl(url):
    crawler = Crawler(url)
    crawler.crawl()

if __name__ == '__main__':
    main(
    )
4

0 回答 0