3

我需要废弃一个由 Javascript 生成的网页。href 是这样的:

<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 请求?

4

1 回答 1

1

您可以在中间件中使用此代码

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'))
于 2013-06-07T07:20:33.660 回答