我想使用 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(
)