如何确保scrapy-splash成功渲染整个页面

时间:2017-03-27 18:03:04

标签: scrapy scrapy-spider splash scrapy-splash splash-js-render

当我通过使用启动来渲染整个目标页面时整个网站被抓取时发生的问题。一些页面不是随机成功因此我错误地获得了在渲染工作完成时支持的信息。这意味着我只是从渲染结果中获取部分信息,尽管我可以从其他渲染结果中获取整个信息。

这是我的代码:

yield SplashRequest(url,self.splash_parse,args = {"wait": 3,},endpoint="render.html")

settings:
SPLASH_URL = 'XXX'  
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

# Enable SplashDeduplicateArgsMiddleware:
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

# Set a custom DUPEFILTER_CLASS:
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter

# a custom cache storage backend:
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

1 个答案:

答案 0 :(得分:3)

我这么回答是因为这个问题没有答案,因为它在谷歌搜索中可见。

我有类似的问题,我发现的唯一解决方案(除了增加wait参数,可能有效,也可能不成功,但不可靠)使用execute端点和自定义lua脚本等待一个元素。如果这听起来不必要地复杂,那就是Scrapy和Splash在我看来并没有很好的设计,但我找到了更好的东西来满足我的需求。

我的Lua脚本看起来像这样:

lua_base = '''
function main(splash)
  splash:init_cookies(splash.args.cookies)
  splash:go(splash.args.url)

  while not splash:select("{}") do
    splash:wait(0.1)
  end
  splash:wait(0.1)
  return {{
  cookies = splash:get_cookies(),
  html=splash:html()
  }}
end
'''
css = 'table > tr > td.mydata'
lua_script = lua_base.format(css)

我生成这样的请求:

        yield SplashRequest(link, self.parse, endpoint='execute',
                            args={
                                    'wait': 0.1,
                                    'images': 0,
                                    'lua_source': lua_script,
                                })

非常难看,但它确实有效。