用PHP抓取动态Javascript站点

用PHP抓取动态Javascript站点,javascript,php,curl,web-scraping,Javascript,Php,Curl,Web Scraping,我已经多次遇到这个问题,并在这里发现了许多类似的请求,但没有一个能提供我能够使用的简单解决方案(请相信我,我不是一个程序员!) 在过去,我已经构建了相当多的php脚本来使用curl刮取页面,从概念上讲,这非常简单——刮取页面的所有html都被拉入,我可以搜索任何相关的内容。很简单,连我都能做到!;-) 但是我遇到了越来越多的动态加载内容的网站,这意味着curl不会返回最终显示的html。简言之,我希望能够像以前那样工作,最终的HTML可以通过curl获得,但它似乎不是这样工作的 我不知道我是否清

我已经多次遇到这个问题,并在这里发现了许多类似的请求,但没有一个能提供我能够使用的简单解决方案(请相信我,我不是一个程序员!)

在过去,我已经构建了相当多的php脚本来使用curl刮取页面,从概念上讲,这非常简单——刮取页面的所有html都被拉入,我可以搜索任何相关的内容。很简单,连我都能做到!;-)

但是我遇到了越来越多的动态加载内容的网站,这意味着curl不会返回最终显示的html。简言之,我希望能够像以前那样工作,最终的HTML可以通过curl获得,但它似乎不是这样工作的

我不知道我是否清楚,所以这里有几个使用廉价航空公司网站的例子。。。问题在每种情况下都有点不同,但在这两种情况下,我只想要最终的内容!(不得不删掉所有URL的前面,因为它不允许我发布超过2个链接):

深入链接easyjet.com将产生以下两个结果之一。。。如果航班正在出售,例如本例,那么它最初将重定向到/en/buy/flights,然后立即重定向到/en/buy/seats:

/deeplink?dep=LPL&dest=ACE&dd=2018-09-01&xdfn=7157&apax=1

如果它们不在销售中,它将在/en/buy/flights上停止:

/deeplink?dep=LPL&dest=ACE&dd=2020-09-01&xdfn=7157&apax=1

但是,curl不能跟随重定向。以下脚本将返回/en/buy/flights作为重定向URL:

<? 

 $url="http://www.easyjet.com/deeplink?dep=LPL&dest=ACE&dd=2018-09-01&xdfn=7157&apax=1";   

  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);           

  $html = curl_exec($ch);

  $redirectedUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

  curl_close($ch);

  echo "Original URL:   " . $url . "<BR>";
  echo "Redirected URL: " . $redirectedUrl . "\n<BR><BR>";
?>

我的另一个例子更容易解释

最初不加载任何内容,除了在圆中旋转的平面的“加载”类型图标。关闭javascript,这就是您在浏览器中看到的所有内容

任何试图使用curl刮页面的行为都会导致我的脚本无限期地挂起

 <?

     $url="https://www.ryanair.com/gb/en/";              

      $ch = curl_init();

      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);           

      $html = curl_exec($ch);

      curl_close($ch);
    ?>

我希望不必把所有的javascript都分离出来,而只需找到一种方法直接访问加载到浏览器上的内容。我也希望这样做,而不必安装和学习如何使用太多不同的技术。。。除此之外,我的廉价主机服务提供商将服务器锁定,并且在安装任何非标准软件包、扩展等时都毫无帮助


祝你好运…

你必须实际运行Javascript,没有办法。所以curl是不可能的,您需要一个(无头)浏览器来运行站点,决定等待多长时间,然后读取DOM。没有“页面现在完成”事件,这是动态网站的本质。谢谢Ingo。所以我看到了类似的回答,而PhantomJS似乎是最受欢迎的选择。我的理解正确吗?PhantomJS本身是一个独立的包,需要安装在服务器上,然后我需要使用PHP PhantomJS库从PHP内部控制它?还有一个问题。。。如果我使用python而不是PHP,这会使情况变得更简单吗?你必须实际运行Javascript,没有办法。所以curl是不可能的,您需要一个(无头)浏览器来运行站点,决定等待多长时间,然后读取DOM。没有“页面现在完成”事件,这是动态网站的本质。谢谢Ingo。所以我看到了类似的回答,而PhantomJS似乎是最受欢迎的选择。我的理解正确吗?PhantomJS本身是一个独立的包,需要安装在服务器上,然后我需要使用PHP PhantomJS库从PHP内部控制它?还有一个问题。。。如果我使用python而不是PHP,会不会让情况变得更简单?