2013-05-08 98 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'))