1. 现状
爬虫在爬取网页信息时,最普遍的问题就是存在异步加载的内容无法获取的情况,比如淘宝的商品评论、新闻网站的滚动加载等。这时候需要采用其他方法获取异步加载的内容。
2. 异步加载的原理
异步加载是指在加载网页的时候,只加载网页的部分内容,而另外的部分是通过ajax技术动态加载的。异步加载可以使网页更加流畅,提高用户体验。
3. 解决方案
3.1 使用selenium
Selenium是一款自动化测试工具,可以模拟人工操作,获取网页内容。Selenium支持多种浏览器,并且可以处理JavaScript的异步数据。我们可以使用Selenium来模拟人工操作,让浏览器自动加载异步数据,然后再获取获取数据。
$driver = RemoteWebDriver::create($host, DesiredCapabilities::firefox());
$driver->get($url);
$driver->executeScript("window.scrollTo(0,document.body.scrollHeight);"); //滚动页面
sleep(5); //等待5秒,让异步数据完全加载
$html = $driver->getPageSource();
注意:使用selenium时需要注意性能问题,尽量减少页面滚动等操作。
3.2 分析异步加载的接口
有些网站会把异步加载的数据封装在接口中,我们可以分析接口,直接获取数据。
$url = "http://xxxxx.com/api/xxxx";
$data = file_get_contents($url);
$json = json_decode($data, true);
注意:如果接口需要登录等其他操作,需要先进行相应的操作,再获取数据。
3.3 使用PhantomJS
PhantomJS可以模拟浏览器,并且可以处理JavaScript的异步数据,获取完整的网页内容。我们可以使用PhantomJS来获取页面的异步内容。
$js = "var page = require('webpage').create();
page.open('".$url."', function(status) {
if (status === 'success') {
console.log(page.content);
}
phantom.exit();
});";
$html = exec("phantomjs -e '".$js."'");
注意:使用PhantomJS时,需要安装PhantomJS,并且PHP需要开启exec函数。
4. 总结
异步加载的内容是爬虫需要重点关注的问题。通过使用Selenium、分析接口、使用PhantomJS等方法,可以有效地获取异步加载的数据。