使用XPath和import.io从网站中提取JavaScript对象的值

3
我想提取网站上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提供。
希望有人能够帮助我解决这个问题。
2个回答

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() 创建它。然后您应该向该网址发出请求(添加前一个响应域),类似于:

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

检查日期是否进行了url编码。它应该返回类似以下的响应:

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网址,从中制作新的网址https://www.ss.lv/和日期部分,并使用新的提取器运行它们以获取必要的信息,对吗?非常抱歉询问这些问题,只是想确保自己理解正确;) - BigTLV
再次问候。所以我做了所有的事情,然后在浏览器中检查了一切,一切都像魅力一样工作,但问题出现在import.io上-->当训练它时,它运行得很好,但是当尝试保存它时,它不会保存API,所以很可能又出现了一些问题...这是可能的吗,因为有javascript用于制作那些信息?我只是感到沮丧... - BigTLV
我没有使用过import.io,所以无法提供帮助。我只是描述了如何使用requests获取该信息。 - eLRuLL
再次感谢您,您的评论非常有帮助,再加上@CavemanDan提供的链接,现在可以获取所需的信息了——耶! - BigTLV

0

非常感谢您的建议!它完美地解决了我的问题!关于第一个问题,我向import.io写了一封邮件,他们非常乐意提供帮助。虽然他们没有给出具体的答案,因为那不是他们的工作,但他们给了方向和指导,并且是正确的。再次感谢! - BigTLV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接