在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_urlelse: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 = urlurl = _urlsuper(_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这个参数。