Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl从使用JavaScript动态生成的网页中获取文本?_Javascript_Html_Perl_Screen Scraping - Fatal编程技术网

如何使用Perl从使用JavaScript动态生成的网页中获取文本?

如何使用Perl从使用JavaScript动态生成的网页中获取文本?,javascript,html,perl,screen-scraping,Javascript,Html,Perl,Screen Scraping,有一个网站我正试图用Perl从中获取信息,但是我需要的页面部分是使用javascript生成的,因此您在源代码中看到的是: <div id="results"></div> 我不确定这是否可行,或者是否有人有任何想法或方法来做到这一点。 我在其他页面使用lynx源代码转储,但由于我不能直接使用屏幕刮取这个页面,所以我来这里询问它 如果有人感兴趣的话,这个页面是,我试图获取的信息是关于消费者的那一行,可能会有用。您需要对Javascript的操作进行反向工程。它是否发出A

有一个网站我正试图用Perl从中获取信息,但是我需要的页面部分是使用javascript生成的,因此您在源代码中看到的是:

<div id="results"></div>
我不确定这是否可行,或者是否有人有任何想法或方法来做到这一点。 我在其他页面使用lynx源代码转储,但由于我不能直接使用屏幕刮取这个页面,所以我来这里询问它


如果有人感兴趣的话,这个页面是,我试图获取的信息是关于消费者的那一行,可能会有用。

您需要对Javascript的操作进行反向工程。它是否发出AJAX请求来填充
?如果是这样的话,那么应该很容易使用嗅探请求,然后使用或复制请求以获取信息

如果Javascript只是执行纯DOM操作,那么这意味着数据必须存在于页面或Javascript中的其他位置。所以找出它的来源并抓住它


最后,如果这些选项都不够,您可能只需要使用真正的浏览器即可。有几个选项可以自动执行浏览器行为,如或。

由于页面内容是由某些Javascript生成的,因此您需要能够:

  • 执行一些Javascript代码
    • 甚至,可能是一些复杂的JS代码,执行Ajax请求等等
  • 并使用支持浏览器中存在的函数/方法(如DOM操作)的引擎执行此操作

一个解决方案可能是真正启动浏览器导航到该页面,然后解析它加载的页面,提取信息

我从来没有用它来抓取数据,但在这里可能会有所帮助:使用Selenium RC,您可以启动一个真正的浏览器,并对其进行试验——然后,您就可以使用函数从中获取数据


它不是很快,也很重(必须启动浏览器!),但它工作得很好:例如,你将使用Firefox导航到你的页面——这意味着一个真正的Javascript引擎,很多人每天都在使用;-)

这可能就是您想要的(在PHP中):

一旦您获得了内容,您就可以使用以下内容:解析您需要的结果或类似的perl等价物

和/或自己进行解析


仅供参考:我所做的只是使用firebug来检查请求,并使用PHP/CURL重新创建它…

来处理动态创建的HTML,您可以使用FireFox插件。
或者,如果您需要从命令行脚本工作的东西,请使用到Perl的绑定。我以前用Python做过这件事。

我也对这件事感兴趣。。。你能看到和/或访问AJAX请求URL吗(假设数据是通过AJAX填充的)?是的,我可以看到AJAX,但是在这个网站上,从AJAX查询返回的所有内容都是results.innerHTML设置的另一个js函数。非常有趣的链接。很多年来,我一直在用艰难的方式处理这件事。事实上,我有点失望,这将是一个数量级容易现在。哈哈。。。随着网站增加动态组件,我欢迎使用的方便性。。。我记得为了运行类似用途的浏览器,必须设置一个专用服务器。单台专用服务器?四个同时运行64个IE实例的专用四CPU系统如何?;-)
document.getElementById('results').innerHTML;
$url = 'http://downloadcenter.trendmicro.com/ajx/pattern_result.php';

$ch = curl_init();
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'q=patresult_page&reg=NABU');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($ch);
curl_close($ch);

echo $content;
exit;