Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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
Javascript 如何使用PHP从动态网页中刮取页面链接?_Javascript_Php_Html - Fatal编程技术网

Javascript 如何使用PHP从动态网页中刮取页面链接?

Javascript 如何使用PHP从动态网页中刮取页面链接?,javascript,php,html,Javascript,Php,Html,我想使用PHP在该网页的菜单中获取动态创建的URL的实际值: 我以前用过这样的东西: <?php $baseurls = array("http://groceries.iceland.co.uk/"); foreach ($baseurls as $source) { $html = file_get_contents($source); $start = strpos($html,'<nav id="mainNavigation"'); $end

我想使用PHP在该网页的菜单中获取动态创建的URL的实际值:

我以前用过这样的东西:

<?php
$baseurls = array("http://groceries.iceland.co.uk/");

foreach ($baseurls as $source) 
{
    $html = file_get_contents($source);

    $start = strpos($html,'<nav id="mainNavigation"');
    $end = strpos($html,'</nav>',$start);
    $mainarea = substr($html,$start,$end-$start);

    $dom = new DOMDocument();
    @$dom->loadHTML($mainarea);

    // grab all the urls on the page
    $xpath = new DOMXPath($dom);
    $hrefs = $xpath->evaluate("/html/body//a");

    for ($i = 0; $i < $hrefs->length; $i++) 
    {
        $href = $hrefs->item($i);
        $url = $href->getAttribute('href');       
    }
}
?>

但它不适合这一特定页面。例如,我的代码返回一个url,如:

groceries.冰岛.co.uk//冷冻薯条和土豆制品

但我希望它能给我:
groceries.冰岛.co.uk//freezed/chips and potato products/c/FRZCAP?q=:relevance&view=list

浏览器在末尾添加了
“/c/FRZCAP?q=:relevance&view=list”
,这就是我想要的

希望你能帮忙
谢谢

编辑:我只是想确认一下,我看了一下你在关闭JavaScript的情况下试图抓取的网站,它显示Mainnav URL是使用JavaScript生成的,因此如果不使用无头浏览器,你将无法抓取页面

根据@Sam和@halfer的评论,如果您需要刮取一个包含JavaScript生成的动态URL的站点,那么您需要使用支持JavaScript的刮取器

如果您想在PHP中完成大部分开发,那么我建议您不要尝试通过PHP使用无头浏览器,而是依赖一个可以刮取JavaScript呈现页面并为您返回内容的服务

我发现的最好的一个,也是我们在项目中使用的一个,是

它便宜、快捷,可以满足您的所有需求


祝你好运

一个简单的提示是,我认为您最好不要在HTML上使用
substr()
(我不认为将整个HTML加载到
DOMDocument
)会有任何重大的性能权衡。至于这个问题,如果额外的数据在页面加载后由JS追加,PHP将永远无法看到这一点。您需要尝试一种基于JS的无头浏览器,如、、等。遇到类似问题的第一步是关闭浏览器中的JavaScript,刷新所需页面,然后查看数据是否仍然存在。如果是的话,你可以用一个基于卷曲的库来做你想做的事情(Goutte很好,基于Guzzle)。如果不是,那么你需要一个(速度较慢的)无头浏览器(参见@Sam的评论)。观看firebug/chrome inspector的网络选项卡。他们添加到页面中的信息来自某个地方,通常来自页面加载后运行的远程rest API。有时候,api在一个干净漂亮的包中包含了你想要的一切,你甚至不需要刮去它……你真的需要使用php吗?当我这样做时,我倾向于在firebug中编写一些jquery,手动运行它,并在页面加载后获取所有链接。如果您想一次性(而不是按计划)完成此操作,请告诉我,我将向您展示如何使用jquery完成此操作。感谢您的帮助,非常有用