2013-05-08 68 views
3

我需要廢鋼Javascript.The HREF生成的網頁是這樣的:如何向scrapy + webkit生成javascript請求?

<a href="javascript:__doPostBack('pager','4')" style="margin-right:5px;">[4]</a> 

我寫了一個scrapy和WebkitDownloader它的工作原理。

class WebkitDownloader(object): 
def process_request(self, request, spider): 
    if spider.name in settings.WEBKIT_DOWNLOADER: 
     if(type(request) is not FormRequest): 
      print '===================Processing non-FormRequest==================' 
      webview = webkit.WebView() 
      webview.connect('load-finished', lambda v,f: gtk.main_quit()) 
      webview.load_uri(request.url) 
      gtk.main() 
      js = jswebkit.JSContext(webview.get_main_frame().get_global_context()) 
      renderedBody = str(js.EvaluateScript('document.documentElement.innerHTML')) 
      #print renderedBody 
      return HtmlResponse(request.url, body=renderedBody) 

我仍然不知道如何請求在我的蜘蛛解析模塊發送到WebkitDownloader。 我可以使用這樣的東西:request.append('javascript:__doPostBack('pager','4')')並將JavaScript請求發送到WebkitDownloader?或者如何構建Javascript請求?

回答

0

你可以在你的中間件使用此代碼

from scrapy.http import HtmlResponse 

import gtk 
import webkit 
import jswebkit 

class WebkitDownloader(object): 

    def stop_gtk(self, v, f): 
     gtk.main_quit() 

    def _get_webview(self): 
     webview = webkit.WebView() 
     props = webview.get_settings() 
     props.set_property('enable-java-applet', False) 
     props.set_property('enable-plugins', False) 
     props.set_property('enable-page-cache', False) 
     return webview 

    def process_request(self, request, spider): 
     if 'renderjs' in request.meta: 
      webview = self._get_webview() 
      webview.connect('load-finished', self.stop_gtk) 
      webview.load_uri(request.url) 
      gtk.main() 
      ctx = jswebkit.JSContext(webview.get_main_frame().get_global_context()) 
      url = ctx.EvaluateScript('window.location.href') 
      html = ctx.EvaluateScript('document.documentElement.innerHTML') 
      return HtmlResponse(url, encoding='utf-8', body=html.encode('utf-8'))