python - Scrapy with Splash 不会等待网站加载
问题描述
我正在尝试通过 Python 脚本调用 Splash 来渲染和抓取交互式网站,基本上遵循本教程:
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,然后点击 Render 按钮,返回的响应是正确的。那么,唯一的问题是,为什么当 Python 脚本调用它时,它没有正确呈现网站?
解决方案
我已经尝试过 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,
}
推荐阅读
- python - 如何检测python列表中是否存在'\ n'?
- asp.net-core - 如何从 ActionFilter 中识别模型并将 json 数据绑定到该模型
- amazon-cloudformation - Cloudformation 模板验证器
- windows - Electron:在图标上拖放文件
- macos - 在控制台 hello world 应用程序中运行代码时未显示 NSNotification
- android - Android Studio 3.5 ...升级后出现错误默认活动未找到
- flutter - 如何使用 PageView.builder 为新日期显示新页面
- flutter - 当我触摸浮动按钮时如何停止flutter_webview的WebView的触摸响应
- ios - X 轴值重叠 - iOS 图表
- javascript - 如何制作多级上下文菜单?