Я сделал простой краулер на simplecrawler: D
Его конструктор имеет объект набора, который содержит посещенные URL-адреса:
this.visited = new Set();
Сюда будет добавлен любой недопустимый URL:
this.visited.add(url);
В настоящее время, когда в очередь добавляется новый URL, я проверяю, посещается ли он:
if (this.visited.has(newURL))
Могу ли я иметь regEx в этом заданном объекте, чтобы заблокировать URL-адрес с определенного сайта, который будет использоваться, как показано ниже?
// to block www.xxx.com/123, www.xxx.com/456, www.xxx.com/789
this.visited.add('/www\.xxx\.com/\d/g');
if (this.visited.has(givenURL))
// do not visit
else
// visit
Если это можно сделать, как лучше всего это сделать?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете перебрать Set и проверить, соответствует ли URL элементу в наборе:
this.visited = new Set();
var BreakException = {};
this.visited.add('www\\.xxx\\.com/\\d+');
this.visited.add('www.xxx.com/123')
try {
this.visited.forEach(function(x) {
if ('www.xxx.com/123'.match(new RegExp(x))) {
var visited = true;
throw BreakException;
}
});
} catch (e) {
// do not visit
}
if (visited) {
// visit
}
Обратите внимание на URL-адрес, который я добавил в набор. Тот, который вы использовали в вопросе, не сработает.
Вы должны вызвать исключение, чтобы разорвать цикл, поскольку Array.forEach не поддерживает break;.
Я бы сделал это, вероятно, получив имя домена из url-адреса с помощью регулярного выражения, а затем добавив его в Set. Затем всякий раз, когда вы проверяете посещенный URL-адрес, а не полный URL-адрес, вы можете проверить, посещался ли домен.