【问题标题】:Extract value from javascript object in site using xpath and import.io使用 xpath 和 import.io 从站点中的 javascript 对象中提取值
【发布时间】:2015-10-29 20:29:42
【问题描述】:

我想提取站点中javascript对象提供的数字,但我真的不明白我在做什么。

我在import.io 站点和其他教程站点中使用类似的示例和指南尝试了不同的版本,但我只得到了两个结果中的一个:提取给定页面上的所有数字或什么都没有。

我试过了,例如//[contains(.,"Unikālo apmeklējumu skaits:")]@type ; //[contains(.,"Unikālo apmeklējumu skaits:")] 。很可能需要在其中添加其他内容,但我就是不知道。

我有兴趣从中提取的链接是:https://www.ss.lv/msg/lv/clothes-footwear/womens-clothes/trousers/ikcbb.html,必要的信息是文本“Unikālo apmeklējumu skaits:”后面的数字,由 javascript 给出。

希望有人能帮我解决这个问题。

【问题讨论】:

    标签: xpath import.io


    【解决方案1】:

    对于网络抓取的新手来说,这应该是一项艰巨的任务,我会解释一下。首先,到达该位置的 xpath 可能是这样的:

    '//td[@class="msg_footer" and contains(text(), "Unik")]'
    

    现在您有了该标签(以及它包含的内容),但如果您检查它不包含您需要的数字,则该内容正在使用 javascript 动态加载,而 javascript 就是这个:

    <script type="text/javascript"><!-- 
    
    var ss_w='rādīt numuru';
    document.write( '<scr'+'ipt id="contacts_js" src="/js/2015-10-27/37863/VHoBGkpqSV8bfwkdTX9AXEpZXCVDlASIQ1ZV3kK.js?t='+new Date()+'"></scr'+'ipt>' );
    
    --></script>
    

    可以从这个 xpath 的响应中得到:

    '//script[contains(text(), "contacts_js")]/text()'
    

    从该字符串中,您应该复制 src 中的 url,例如这个 url:

    /js/2015-10-27/37863/VHoBGkpqSV8bfwkdTX9AXEpZXCVDlASIQ1ZV3kK.js?t=
    

    并将当前日期添加到末尾,因为javascript 使用new Date() 创建它。然后你应该向那个 url 发出请求(添加以前的响应域),比如:

    https://www.ss.lv/js/2015-10-27/37863/VHoBGkpqSV8bfwkdTX9AXEpZXCVDlASIQ1ZV3kK.js?t=Wed%20Oct%2028%202015%2020:56:42%20GMT-0500%20(PET)
    

    检查日期是否为 urlencoded。它应该返回如下响应:

    var PHONE_CNT=-1;var PHONE_CNT2=-1;var PHONE_CNT3=-1;var EMAIL_CNT=-1;var SHOW_CNT=22;var PH_c="";var PH_1=0;var PH_2=0;var PH_3=0;
    

    pcc_id=0;PH_1=gpzd("JTg3aCU3QyU1QnolN0MlN0JYcWh6JTVCdCU5NSU4QyU5MnV4ayU5QXElN0IlOTQlNUNweiU5MGtvJTdCJThFJTVF","55937369");

    您可以在其中检查SHOW_CNT 中的值是否是您想要的数字。

    如果您想知道我是如何找出哪个请求和哪个脚本填充了该响应标记,那么我使用firebug 进行了,在涉及调用您的 URL 的所有响应中搜索SHOW_CNT,这指向我指定的请求,然后尝试检查谁在请求该请求。

    希望对您有所帮助。

    【讨论】:

    • 非常感谢您非常非常详细的解释,它帮助很大!我刚收到两个小问题:1)我可以在没有时间说明的情况下只写一个简单的 =Thu%Oct%29%2015 的当前日期,因为我和他们在同一个时区,然后有什么不同吗?我也检查了没有日期,它仍然给出了计数。 2)所以基本上对于每个项目,我应该首先提取 JS url,从中使用 ss.lv 和日期部分创建新的 url,并使用新的提取器运行它们以获得必要的信息,对吗?抱歉有问题,只是想确保我没问题;)
    • 再来一次。所以我做了所有事情,然后在浏览器中检查了一切都像魅力一样工作,但问题出在 import.io -> 然后训练它工作正常,但然后尝试保存它,它不保存 API,所以很可能再次出现问题..有可能吗,因为有用于制作该信息的javasript?我只是沮丧...
    • 我没有使用 import.io,所以我帮不上忙,我描述了使用任何请求获取该信息的方法
    • 再次感谢您,您的 cmets 提供了令人难以置信的帮助,并且与 @CavemanDan 链接相结合,它可以工作!我可以得到这些信息-yupiiiiii!
    【解决方案2】:

    support@import.io 是可以与之交谈的人,他们总是提供免费建议并帮助解决此类问题。

    您可以使用各种技巧和窍门……例如 import.io 提供的(未记录的 beta)JavaScript 预渲染服务可能在这种情况下对您有用。 API 发布失败有时是由于等待站点呈现 JS 时超时导致的,这将解决该问题。

    http://support.import.io/knowledgebase/articles/623235-infinite-scroll-and-javascript-prerender-beta

    我希望这会有所帮助。

    【讨论】:

    • 非常感谢您的建议!它就像一个魅力!

      我写了关于第一个问题的 import.io,他们非常有帮助)他们没有给出具体的答案,因为这不是他们的工作,但给出了从哪里开始和查看的方向,他们是对的!)。所以再一次 huuuuuge thanx!

    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多