2014-01-20 35 views
2

我想刮的实际动态创建的URL在本网页的菜单中使用PHP:如何使用PHP从动态网页中删除页面链接?

http://groceries.iceland.co.uk/

我以前使用过这样的事情:

<?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');  
    } 
} 
?> 

,但它没有这样做这个特定页面的工作。例如,我的代码返回一个网址,如:

groceries.iceland.co.uk//frozen-chips-and-potato-products

,但我希望它给我: groceries.iceland.co.uk//frozen/chips-and-potato-products/c/FRZCAP?q=:relevance&view=list

浏览器增加了"/c/FRZCAP?q=:relevance&view=list"到底,这就是我想要的。

希望你能帮助 感谢

+2

一个简单的说明是,我认为你最好不要在HTML上使用'substr()'(我不认为通过将整个HTML加载到'DOMDocument'中将会有任何主要的性能折衷)。至于这个问题,如果额外的数据在页面加载后由JS追加,PHP将永远无法看到这一点。您需要尝试基于JS的无头浏览器,如[PhantomJS](http://phantomjs.org/),[SlimerJS](http://slimerjs.org/),[Zombie.js](http:// zombie.labnotes.org/)等。 – Sam

+1

这些问题的第一步是在浏览器中关闭JavaScript,刷新所需的页面,然后查看数据是否仍然存在。如果是这样,你可以用一个基于cURL的库来做你想做的事情(基于Guzzle,Goutte非常出色)。如果不是,那么你需要一个(较慢)的无头浏览器(参见@ Sam的评论)。 – halfer

+1

观察萤幕灯/镀铬检查器的网络标签。他们添加到页面的信息来自某处,通常是从页面加载后运行的远程休息API获取。有时api拥有一切你想要的一个漂亮的清洁包,你甚至不需要刮... – dandavis

回答

1

编辑:只是为了确认,我在看你想凑关闭JavaScript的网站,它看来,Mainnav网址是使用JavaScript生成的,所以如果不使用无头浏览器,您将无法刮取页面。

Per @Sam和@ halfer的评论,如果你需要抓取一个由JavaScript生成动态URL的网站,那么你将需要使用一个支持JavaScript的刮板。

如果你想在PHP中完成大部分的开发工作,那么我建议不要试图通过PHP使用无头浏览器,而应该依靠一个服务来抓取JavaScript呈现的页面并返回内容。

我发现最好的之一,而我们在我们的项目中使用,是https://phantomjscloud.com/

它的廉价,快捷,应该做你需要的一切。

祝你好运!

+0

感谢您的帮助,非常有用 – Bam

相关问题