scrapy-splash 无法呈现此页面 - 未呈现动态内容?

scrapy-splash can't render this page - dynamic content not rendered?

我最近决定尝试 Scrapy-Splash 插件,但是 Splash 无法呈现该网站 http://orka.sejm.gov.pl/proc6.nsf/

# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest


class BasicSpider(scrapy.Spider):
    name = 'basic'

    start_urls = ['http://orka.sejm.gov.pl/proc6.nsf/']


    def start_requests(self):
            for url in self.start_urls:
                yield SplashRequest(url, callback=self.parse,
                    endpoint='render.html',
                    args={'wait': 20},)



    def parse(self, response):
        item = {}
        item["data"] = response.xpath('//html').extract()
        return item 

所以结果是这样的:

['<html><head>\n<title>Proces Legislacyjny 6 kadencja</title>\n<script language="JavaScript" type="text/javascript">\n<!-- \nself._domino_name = "_Main";\n// -->\n</script>\n</head>\n\n<frameset frameborder="0" border="0" cols="169,1*">\n\n<frame frameborder="0" noresize name="Left" src="/proc6.nsf/start?OpenPage&amp;BaseTarget=Main">\n\n<frameset frameborder="0" rows="70,1*">\n\n<frame frameborder="0" noresize scrolling="no" name="Maintop" src="/proc6.nsf/pgHeader?OpenPage">\n\n<frame frameborder="0" noresize name="Main" src="/proc6.nsf/Przebieg%20procesu%20legislacyjnego%20-%20projekty%20ustaw?OpenView">\n</frameset>\n</frameset>\n\n</html>']

很明显,您可以看到这与您使用常规浏览器访问该站点时不同。没有 table 数据和链接以及漂亮的标签。

Scrapy-Splash 缺少一些东西。

Splash 正确呈现页面,但您使用的 render.html 是主页的 return html,而不是其中的框架。在这种情况下,您需要使用 render.json 并将 iframes 设置为 1。

详情见下期

https://github.com/scrapinghub/splash/issues/413

编辑-1

我在页面上 运行 下面的 Lua 脚本,它给了我所有帧的内容

function main(splash, args)
  assert(splash:go(args.url))
  assert(splash:wait(5))

  local getFramesHtml = splash:jsfunc([[
   function test() { 
      var data = [];
      for (var i = 0 ; i < window.frames.length; i++)
       {
          data.push(window.frames[i].document.documentElement.outerHTML);
       }
      return data;
    }
    ]]);

  return {
    html = splash:html(),
    frames = getFramesHtml()
  }
end