我正在尝试通过Python脚本调用Splash来渲染和抓取交互式网站,基本上遵循以下tutorial:
import scrapy
from scrapy_splash import SplashRequest
class MySpider(scrapy.Spider):
start_urls = ["http://example.com"]
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, self.parse,
endpoint='render.html',
args={'wait': 0.5},
)
def parse(self, response):
filename = 'mywebsite-%s.html' % '1'
with open(filename, 'wb') as f:
f.write(response.body)
输出看起来不错,但是缺少一两秒钟后通过ajax加载的网站部分,而这正是我真正需要的内容。现在很奇怪的是,如果我通过Web界面直接在容器内访问Splash,设置相同的URL,然后单击“渲染”按钮,则返回的响应是正确的。因此,唯一的问题是,为什么当Python脚本调用它时,它不能正确呈现网站?
答案 0 :(得分:1)
我尝试了adrihanu的建议,但没有成功。过了一会儿,我想知道会发生什么,以及是否有可能执行与Splash UI正在执行的脚本相同的脚本。因此,我了解到可以将lua脚本作为参数传递,并且可以正常工作!
script1 = """
function main(splash, args)
assert (splash:go(args.url))
assert (splash:wait(0.5))
return {
html = splash: html(),
png = splash:png(),
har = splash:har(),
}
end
"""
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, self.parse,
endpoint='execute',
args={
'html': 1,
'lua_source': self.script1,
'wait': 0.5,
}