我想抓取页面并检查相应页面中的超链接,并按照这些超链接并从页面中捕获数据
答案 0 :(得分:16)
通常,浏览器JavaScript只能在其来源的域内进行抓取,因为抓取页面将通过Ajax来完成,Same-Origin Policy受限制。
如果运行抓取工具脚本的网页位于 www.example.com ,则该脚本可以抓取www.example.com上的所有网页,但不能抓取任何其他来源的网页(除非某些边缘情况适用,例如,为另一台服务器上的页面设置Access-Control-Allow-Origin标头。
如果确实想要在浏览器JS中编写功能齐全的抓取工具,您可以编写一个浏览器扩展名:例如,Chrome extensions是打包的Web应用程序,具有特殊权限,包括cross-origin Ajax。这种方法的难点在于,如果要支持多个浏览器,则必须编写多个版本的爬网程序。 (如果爬虫只是供个人使用,那可能不是问题。)
答案 1 :(得分:7)
如果您使用服务器端JavaScript,则可以。 你应该看一下 node.js
可以在下面的链接中找到爬虫的示例:
http://www.colourcoding.net/blog/archive/2010/11/20/a-node.js-web-spider.aspx
答案 2 :(得分:2)
我们可以在无头webkit的帮助下使用来自服务器端的Javascript来抓取页面。对于爬行,我们有很少的库,如PhantomJS,CasperJS,还有一个名为Nightmare JS的PhantomJS上的新包装器,使工作更容易。
答案 3 :(得分:1)
我的典型设置是使用设置了跨域权限的浏览器扩展,这会注入爬虫代码和jQuery。
对Javascript抓取工具的另一种看法是使用无头浏览器,如phantomJS或casperJS(可提升幻影的功能)
答案 4 :(得分:1)
有很多方法可以用JS来规避同源策略。我为facebook写了一个爬虫,它收集了来自朋友和我朋友的朋友的Facebook个人资料中的信息,并允许按性别,当前位置,年龄,军事状态(你抓住我的漂移)过滤结果。这很简单。我刚从控制台运行它。这样,您的脚本将获得在当前域上执行请求的特权。您还可以制作书签以从书签中运行脚本。
另一种方法是提供PHP代理。您的脚本将访问当前域上的代理,并使用PHP从另一个域请求文件。请小心那些。如果您不小心,这些可能会被第三方劫持并用作公共代理。
祝你好运,也许你像我一样在这个过程中交了一两个朋友: - )答案 5 :(得分:1)
这就是你需要的http://zugravu.com/products/web-crawler-spider-scraping-javascript-regular-expression-nodejs-mongodb 他们使用NodeJS,MongoDB和ExtJs作为GUI
答案 6 :(得分:0)
是的,这是可能的
答案 7 :(得分:0)
使用Firefox Greasemonkey扩展,有一种客户端方法。使用Greasemonkey,您可以创建每次打开指定URL时执行的脚本。
这里有一个例子:
如果你有这样的网址:
http://www.example.com/products/pages/1
http://www.example.com/products/pages/2
然后您可以使用类似的东西打开包含产品列表的所有页面(手动执行)
var j = 0;
for(var i=1;i<5;i++)
{
setTimeout(function(){
j = j + 1;
window.open('http://www.example.com/products/pages/ + j, '_blank');
}, 15000 * i);
}
然后您可以创建一个脚本,在每个产品列表页面的新窗口中打开所有产品,并在Greasemonkey中包含此URL。
http://www.example.com/products/pages/ *
然后是每个产品页面的脚本,用于提取数据并调用Web服务传递数据和关闭窗口等。
答案 8 :(得分:0)
我在github上做了一个javascript crawler示例。
它是事件驱动的,并使用内存中队列来存储所有资源(即。url)。
如何在节点环境中使用
var Crawler = require('../lib/crawler')
var crawler = new Crawler('http://www.someUrl.com');
// crawler.maxDepth = 4;
// crawler.crawlInterval = 10;
// crawler.maxListenerCurrency = 10;
// crawler.redisQueue = true;
crawler.start();
这里我只是向您展示一个javascript爬虫的2核心方法。
Crawler.prototype.run = function() {
var crawler = this;
process.nextTick(() => {
//the run loop
crawler.crawlerIntervalId = setInterval(() => {
crawler.crawl();
}, crawler.crawlInterval);
//kick off first one
crawler.crawl();
});
crawler.running = true;
crawler.emit('start');
}
Crawler.prototype.crawl = function() {
var crawler = this;
if (crawler._openRequests >= crawler.maxListenerCurrency) return;
//go get the item
crawler.queue.oldestUnfetchedItem((err, queueItem, index) => {
if (queueItem) {
//got the item start the fetch
crawler.fetchQueueItem(queueItem, index);
} else if (crawler._openRequests === 0) {
crawler.queue.complete((err, completeCount) => {
if (err)
throw err;
crawler.queue.getLength((err, length) => {
if (err)
throw err;
if (length === completeCount) {
//no open Request, no unfetcheditem stop the crawler
crawler.emit("complete", completeCount);
clearInterval(crawler.crawlerIntervalId);
crawler.running = false;
}
});
});
}
});
};
这是github链接https://github.com/bfwg/node-tinycrawler。 它是一个用1000行代码编写的javascript网页爬虫。 这应该会让你走上正确的轨道。
答案 9 :(得分:0)
Google's Chrome team has released puppeteer,这是一个节点库,为无头和无头Chrome提供高级API(无头Chrome可用since 59)。
它使用Chromium的嵌入式版本,因此可以保证开箱即用。如果您想使用特定的Chrome版本,可以通过启动带有可执行路径作为参数的puppeteer来实现,例如:
const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});
导航到网页并截取屏幕截图的示例显示它有多简单(取自GitHub页面):
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'example.png'});
await browser.close();
})();
答案 10 :(得分:0)
您可以制作一个由远程json文件驱动的Web搜寻器,该文件会在每个标签页加载后立即打开新标签页中页面的所有链接,但已打开的标签页除外。如果您设置了带有在基本浏览器中运行的浏览器扩展名(除了Web浏览器和Internet配置程序之外没有运行任何其他东西),并且将其安装并安装在具有良好Internet的位置,则可以使用一台旧计算机来制作网页数据库。那只需要检索每个选项卡的内容。与大多数对搜索引擎成本的估计相反,您可以花大约2000美元来做到这一点。您只需要基本使您的算法可以根据页面的innerText属性中出现的术语,关键字和描述的数量来提供页面。您还可以设置另一台PC来从一次性数据库中检索旧页面并添加更多内容。我估计大约需要3个月的时间,最多需要20000美元。