我正在抓一个使用React作为前端的网站。到目前为止,似乎我必须使用他们的搜索表单才能到达结果页面。
问题是,每次刷新页面时,网站都会从下拉列表(state
)中清除搜索表单中的所选选项,因此它会使抓取速度明显变慢。我知道它按预期工作,但如果有一种方法我可以直接操纵状态,那么它可以加速我的刮刀,而不是从小按钮重新选择所有选择。
我认为它根本不会使用任何类型的持久存储或本地存储,因为每个选择都不会,否则表单可能不会刷新时清除。
我可以看到表单的年份选项始终存在于data-
属性(data-years=["2017", "2016", ...]
)中,但仅存在多年。当选择一年(或下拉列表中的任何选项)时,会使用<input type="hidden" name="year" value="2017">
等值填充隐藏字段。
这就是React用于临时存储(又名。州) - 隐藏字段吗?
对于我的问题的第二部分,当状态发生变化时会触发什么类型的事件?我怎么能手动触发它?例如,当我选择一年时,我希望表单能够为我提供下一个下拉菜单的选项 - 给出年份。
答案 0 :(得分:3)
React根本不使用DOM来维护状态。您提供的示例只是一个写得不好的React应用程序。通常情况下,所有内容都将保留在内存中(关闭代码,因此窗口/全局中没有任何内容),React将根据需要更新DOM。 :)
这意味着我不认为你能够从外部读取/检测React的内在状态变化。交互式抓取应该像使用该页面的用户一样工作,没有任何暗示它真正使用的技术。
根据您用于抓取的技术,您确实可以模拟或生成真实的DOM事件。当我们需要使用无处不在的Selenium服务器为React应用程序编写一些端到端测试时,我们通常必须在按钮,选项等上手动click
并留出时间让React应用程序做出相应的反应并执行其操作魔法(比如获取更多数据和更新页面),然后读取文档内容以验证一切正常。它基本上是“刮擦”所需的输出来验证你的测试断言。
如果您只是在抓取静态页面(卷曲样式:获取HTML并使用原始HTML响应按照您的方式工作),我认为您无法处理Javascript表单。你需要你的刮刀是互动的。
除了上面提到的Selenium / WebDriver之外,像PhantomJS这样的东西可能会有所帮助。