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