dont_process_response参数在scrapy-splash中的作用

在scrapy中使用scrapy-splash处理动态页面时,我们需要使用SplashRequest来创建请求对象。

SplashRequest有一个参数dont_process_response,字面上来理解就是用来设置是否处理响应消息的。

其值默认为False,就是SplashMiddleware会对响应消息做下加工,返回一个scrapy.Response的子类对象,通常是SplashTextResponse或SplashJsonResponse。否则返回原始的scrapy.Response。

那么,SplashMiddleware具体对响应消息做了哪些处理了?

我们从源码中可以看到,SplashResponse、SplashTextResponse和SplashJsonResponse这几个类都派生自_SplashResponseMixin。而_SplashResponseMixin初始化函数主要对response.url进行了处理,将其替换为我们真正想访问的url,而不是访问splash时使用的url。

class _SplashResponseMixin(object):
    “””
    This mixin fixes response.url and adds response.real_url
    “””
    def __init__(self, url, *args, **kwargs):
        real_url = kwargs.pop(‘real_url’, None)
        if real_url is not None:
            self.real_url = real_url
        else:
            self.real_url = None
            # FIXME: create a .request @property with a setter?
            # Scrapy doesn’t pass request to Response constructor;
            # it is worked around in SplashMiddleware.
            request = kwargs[‘request’]
            splash_args = self._splash_args(request)
            _url = splash_args.get(‘url’)
            if _url is not None:
                self.real_url = url
                url = _url
        super(_SplashResponseMixin, self).__init__(url, *args, **kwargs)

比如。如果你通过splash访问http://www.baidu.com/,scrapy发送给splash的url为

http://127.0.0.1:8050/render.html?url=http://www.baidu.com/

这里假设你的splash地址为http://127.0.0.1:8050.

如果保持dont_process_response为默认的False,我们得到的response.url就是http://www.baidu.com。

如果设置dont_process_response为True,我们得到的response.url就是http://127.0.0.1:8050/render.html。这显然不满足需求。

因此,大多数情况下,创建SplashRequest对象时,不要去设置dont_process_response这个参数。