我正在尝试利用PhantomJS和蜘蛛整个域名。我想从根域开始,例如www.domain.com - 拉取所有链接(a.href),然后获取每个新链接并添加新链接到que中的队列,如果它们尚未被抓取或在队列中。
想法,帮助?
提前致谢!
答案 0 :(得分:20)
您可能有兴趣查看Pjscrape(免责声明:这是我的项目),这是一个基于PhantomJS构建的开源抓取库。它内置支持抓取页面并从中逐步抓取信息。您可以使用如下的简短脚本来查看整个站点,查看每个锚点链接:
pjs.addSuite({
url: 'http://www.example.com/your_start_page.html',
moreUrls: function() {
// get all URLs from anchor links,
// restricted to the current domain by default
return _pjs.getAnchorUrls('a');
},
scraper: function() {
// scrapers can use jQuery
return $('h1').first().text();
}
});
默认情况下,这会跳过已经抓取的网页,只会关注当前网域上的链接,但这些都可以在您的设置中更改。
答案 1 :(得分:5)
这是一个老问题,但要更新,一个很棒的现代答案是http://www.nightmarejs.org/(github:https://github.com/segmentio/nightmare)
从他们的主页引用一个引人注目的例子:
RAW PHANTOMJS:
snprintf
WITH NIGHTMARE:
phantom.create(function (ph) {
ph.createPage(function (page) {
page.open('http://yahoo.com', function (status) {
page.evaluate(function () {
var el =
document.querySelector('input[title="Search"]');
el.value = 'github nightmare';
}, function (result) {
page.evaluate(function () {
var el = document.querySelector('.searchsubmit');
var event = document.createEvent('MouseEvent');
event.initEvent('click', true, false);
el.dispatchEvent(event);
}, function (result) {
ph.exit();
});
});
});
});
});
答案 2 :(得分:3)
首先,选择索引页面上的所有锚点并列出href值。您可以使用PhantomJS的文档选择器或jQuery选择器执行此操作。然后对于每个页面,执行相同的操作,直到页面不再包含任何新链接。您应该拥有所有链接的主列表以及每个页面的链接列表,以便能够确定是否已经处理了链接。您可以将Web爬行视为树。树的根节点是索引页面,子节点是从索引页面链接的页面。每个子节点可以有一个或多个子节点,具体取决于子页面包含的链接。我希望这会有所帮助。