如何并行抓取带有子页面的网页?
How to scrape web with the subpage in parallel?
我看了很多网页抓取教程,但我找不到可以抓取带有子页面的网页的模式。
这是顺序
- 抓取第一页找到几个URLs
- 去每个URLs,找到几个URLs
- 进入另一层URLs,从table
读取内容
我可以找到很多 URL 教如何执行第 1 步。但再往下我找不到任何好的例子。此外,我尝试了 X 射线,但效果不佳,因为我的 URL 是父项的一部分。
下面是一些示例代码:
var request = require('request');
var cheerio = require('cheerio');
var url = 'https://news.ycombinator.com';
request(url, function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
$('span.comhead').each(function(i, element){
// Obtain the URL of the news
var a = $(this).prev();
var subUrl = a.attr('href');
// Go to that news and obtain the title
request(subUrl, function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
var title = $("title").text();
console.log(title);
}
});
});
}
});
但是 cheerios each
应该是 运行 按顺序排列。有什么方法可以并行抓取页面吗?
感谢帮助
您可以使用 X 射线轻松完成此操作。例如,请参见以下代码:
var Xray = require('x-ray');
var x = Xray();
var baseUrl = 'https://news.ycombinator.com'; // set base url
x(baseUrl, { // scrape base url
title1: x('a', [{links1:'@href'}]) // store links in array
})(function(err, obj1) { // pass array to next fx
obj1.forEach(function(links.link) {
// assuming links.link stores '/sample-link-to-crawl-83792',
x(baseUrl+links.link, { // append base url to link and crawl
title2: x('a', [{links2:'@href'}])
})(function(err, obj2){
obj2.forEach(function(links2.link) { // for each link in obj2
console.log(link) // should print link to console
});
});
});
});
您可以像这样继续或简单地创建一个 returns 承诺的函数,并随时将扫描的 url 传递给它。然后你观察完成的承诺并用返回的数据做你想做的事。
我看了很多网页抓取教程,但我找不到可以抓取带有子页面的网页的模式。
这是顺序
- 抓取第一页找到几个URLs
- 去每个URLs,找到几个URLs
- 进入另一层URLs,从table 读取内容
我可以找到很多 URL 教如何执行第 1 步。但再往下我找不到任何好的例子。此外,我尝试了 X 射线,但效果不佳,因为我的 URL 是父项的一部分。
下面是一些示例代码:
var request = require('request');
var cheerio = require('cheerio');
var url = 'https://news.ycombinator.com';
request(url, function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
$('span.comhead').each(function(i, element){
// Obtain the URL of the news
var a = $(this).prev();
var subUrl = a.attr('href');
// Go to that news and obtain the title
request(subUrl, function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
var title = $("title").text();
console.log(title);
}
});
});
}
});
但是 cheerios each
应该是 运行 按顺序排列。有什么方法可以并行抓取页面吗?
感谢帮助
您可以使用 X 射线轻松完成此操作。例如,请参见以下代码:
var Xray = require('x-ray');
var x = Xray();
var baseUrl = 'https://news.ycombinator.com'; // set base url
x(baseUrl, { // scrape base url
title1: x('a', [{links1:'@href'}]) // store links in array
})(function(err, obj1) { // pass array to next fx
obj1.forEach(function(links.link) {
// assuming links.link stores '/sample-link-to-crawl-83792',
x(baseUrl+links.link, { // append base url to link and crawl
title2: x('a', [{links2:'@href'}])
})(function(err, obj2){
obj2.forEach(function(links2.link) { // for each link in obj2
console.log(link) // should print link to console
});
});
});
});
您可以像这样继续或简单地创建一个 returns 承诺的函数,并随时将扫描的 url 传递给它。然后你观察完成的承诺并用返回的数据做你想做的事。