руководство по сканированию всей сети?

ES6 предлагает новый тип строкового литерала, используя обратный тик в качестве разделителя. Эти литералы позволяют встроить встроенные интерполяционные выражения строки, которые затем автоматически анализируются и оцениваются.

let person = {name: 'RajiniKanth', age: 68, greeting: 'Thalaivaaaa!' };

let usualHtmlStr = "<p>My name is " + person.name + ",</p>\n" +
  "<p>I am " + person.age + " old</p>\n" +
  "<strong>\"" + person.greeting +"\" is what I usually say</strong>";

let newHtmlStr =
 `<p>My name is ${person.name},</p>
  <p>I am ${person.age} old</p>
  <p>"${person.greeting}" is what I usually say</strong>`;

console.log(usualHtmlStr);
console.log(newHtmlStr);

Как вы можете видеть, мы использовали ` вокруг ряда символов, которые интерпретируются в качестве строкового литерала, но любые выражения формы ${..} анализируются и оцениваются в строке сразу.

Одно действительно приятное преимущество интерполированных строковых литералов заключается в том, что им разрешено разбивать несколько строк:

var Actor = {"name" : "RajiniKanth"};

var text =
`Now is the time for all good men like ${Actor.name}
to come to the aid of their
country!`;
console.log( text );
// Now is the time for all good men
// to come to the aid of their
// country!

Интерполированные выражения

Любое допустимое выражение разрешено появляться внутри ${..} в интерполированном строковом литерале, включая вызовы функций, вызовы выражения встроенной функции и даже другие интерполированные строковые литералы!

function upper(s) {
  return s.toUpperCase();
}
var who = "reader"
var text =
`A very ${upper( "warm" )} welcome
to all of you ${upper( `${who}s` )}!`;
console.log( text );
// A very WARM welcome
// to all of you READERS!

Здесь внутренний `${who}s` интерполированный строковый литерал был немного приятнее для нас при объединении переменной who с строкой "s", в отличие от who + "s". Кроме того, чтобы сохранить примечание, интерполированный строковый литерал просто лексически ограничен, где он появляется, но не динамически ограничен каким-либо образом

function foo(str) {
  var name = "foo";
  console.log( str );
}
function bar() {
  var name = "bar";
  foo( `Hello from ${name}!` );
}
var name = "global";
bar(); // "Hello from bar!"

Использование литерала шаблона для HTML, безусловно, более читаемо, уменьшая раздражение.

Простой старый способ:

'<div class="' + className + '">' +
  '<p>' + content + '</p>' +
  '<a href="' + link + '">Let\'s go</a>'
'</div>';

С ES6:

`<div class="${className}">
  <p>${content}</p>
  <a href="${link}">Let's go</a>
</div>`
  • Ваша строка может охватывать несколько строк.
  • Вам не нужно скрывать символы котировки.
  • Вы можете избежать группировок, таких как: '">'
  • Вам не нужно использовать оператор plus.

Литералы с метками шаблонов

Мы также можем пометить строку шаблона, когда тега шаблона помечена, литералы и подстановки передаются функции, которая возвращает результирующее значение.

]
function myTaggedLiteral(strings) {
  console.log(strings);
}

myTaggedLiteral`test`; //["test"]

function myTaggedLiteral(strings,value,value2) {
  console.log(strings,value, value2);
}
let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
//["test", ""]
// "Neat"
// 5

Мы можем использовать оператор спреда здесь, чтобы передать несколько значений. Первый аргумент - мы называем его строками - это массив всех простых строк (материал между любыми интерполированными выражениями).

, мы затем собираем все последующие аргументы в массив, называемый значения, используя ... gather/rest operator, хотя вы могли бы, конечно, оставить их как индивидуальные именованные параметры, следуя параметру строк, как это было сделано выше (value1, value2 etc).

function myTaggedLiteral(strings,...values) {
  console.log(strings);
  console.log(values);    
}

let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
//["test", ""]
// "Neat"
// 5

Аргумент (ы), собранный в наши значения array - это результаты уже оцененных интерполяционных выражений, найденных в строковом литерале. Идентифицированный строковый литерал похож на этап обработки после вычисления интерполяций, но до того, как окончательное значение строки будет скомпилировано, что позволит вам более эффективно управлять строкой из литерала. Давайте посмотрим на пример создания повторно используемых шаблонов.

const Actor = {
  name: "RajiniKanth",
  store: "Landmark"
}

const ActorTemplate = templater`<article>
  <h3>${'name'} is a Actor</h3>
  <p>You can find his movies at ${'store'}.</p>

</article>`;

function templater(strings, ...keys) {
  return function(data) {
  let temp = strings.slice();
  keys.forEach((key, i) => {
  temp[i] = temp[i] + data[key];
  });
  return temp.join('');
  }
};

const myTemplate = ActorTemplate(Actor);
console.log(myTemplate);

Raw Strings

наши функции тега получают первый аргумент, который мы назвали строками, который является массивом. Но есть дополнительный бит данных: необработанные необработанные версии всех строк. Вы можете получить доступ к этим исходным строковым значениям, используя свойство .raw, например:

function showraw(strings, ...values) {
 console.log( strings );
 console.log( strings.raw );
}
showraw`Hello\nWorld`;

Как вы можете видеть, необработанная версия строки сохраняет escape-последовательность \n, а обработанная версия строки ссылается на него как на неэксклюзивную новую новую строку. ES6 поставляется со встроенной функцией, которая может использоваться в качестве строкового литерала: String.raw(..). Он просто проходит через исходные версии строк:

console.log( `Hello\nWorld` );
/* "Hello
World" */

console.log( String.raw`Hello\nWorld` );
// "Hello\nWorld"
30
задан bohohasdhfasdf 17 January 2010 в 09:10
поделиться

6 ответов

Ползать по паутине - это концептуально просто. Относитесь к паутине как к очень сложному направленному графу. Каждая страница является узлом. Каждая ссылка - это направленный край.

Можно начать с предположения, что одна хорошо подобранная отправная точка в конечном итоге приведет к каждой другой точке (в конечном счете). Это не будет строго верно, но на практике я думаю, что это в основном верно. Тем не менее, есть шанс, что вам понадобится несколько (может быть, тысячи) стартовых точек.

Вы захотите удостовериться, что не пройдете одну и ту же страницу дважды (в пределах одного обхода). На практике обход займет столько времени, что это всего лишь вопрос о том, как долго вы вернетесь в определенный узел, а также как вы будете обнаруживать и обрабатывать изменения (имеется в виду, что во второй раз, когда вы заходите на страницу, она могла измениться).

Убийца будет знать, сколько данных вам нужно хранить и что вы хотите с ними делать после того, как вы их получите.

22
ответ дан 28 November 2019 в 00:09
поделиться

Увидеть это для альтернативного решения, в зависимости от того, что вы сможете сделать с этим большим количеством данных (даже если это возможно): http://searchengenewatch.com/ 2156241

... Редактировать: Также, не забывайте, в Интернете все время меняется, поэтому даже относительно небольшие ползучие операции (например, классифицированные сайты, которые совокупные списки из множества источников) обновляют их ползти на цикл, скажем, , как 24-часовой цикл. Это когда владельцы веб-сайтов могут или не могут начать быть неудобными загрузкой, которую ваш гусеничный гусеник ставит на свои серверы. И затем в зависимости от того, как вы используете контент по заполнению, вы получили de-duping, чтобы подумать, потому что вам нужно научить вашим системам признать, отличаются ли результаты сканирования со вчерашнего дня от тех из тех из тех из тех, кто и т. Д. ... становится очень "нечетким «Не говоря уже о необходимости вычислительной мощности.

2
ответ дан 28 November 2019 в 00:09
поделиться

звучит возможны, но две реальные проблемы будут сетевыми подключением и пространством жесткого диска. Говоря как кто-то, кто знает почти ничего о вспыльчике, я бы начал с нескольких терабайт хранения и работать, как я запечатлю больше информации, и хорошее широкополосное подключение к Интернету. Глубокий карман должен для этого!

0
ответ дан 28 November 2019 в 00:09
поделиться

Обход веб-содержимого концептуально прост. Рассматривайте Web как очень сложный направленный график. Каждая страница является узлом. Каждая ссылка является направленным ребром.

Вы можете начать с предположения, что одна хорошо выбранная начальная точка в конечном итоге приведет к каждой другой точке (в конечном итоге). Это не будет строго правдой, но на практике я думаю, что вы найдете это в основном правдой. Все еще есть вероятность, что вам понадобится несколько (может быть, тысячи) отправных точек.

Вам необходимо убедиться, что вы не пересекаете одну и ту же страницу дважды (в пределах одного обхода). На практике обход займет так много времени, что это просто вопрос о том, как долго до того, как вы вернетесь к определенному узлу, а также как вы обнаруживаете и справляетесь с изменениями (то есть второй раз, когда вы приходите на страницу, она может измениться).

Убийцей будет то, сколько данных вам нужно хранить и что вы хотите сделать с ним, как только вы его получите.

-121--1336366-

Попробуйте.

    public class Foo<T> : IEquatable<Foo<T>> where T : struct
    {
        List<T> lst;

        #region IEquatable<T> Members

        public bool Equals(Foo<T> other)
        {
            if (lst.Count != other.lst.Count)
            {
                return false;
            }

            for (int i = 0; i < lst.Count; i++)
            {
                if (!lst[i].Equals(other.lst[i]))
                {
                    return false;
                }
            }
            return true;
        }

        #endregion

        public override bool Equals(object obj)
        {
            var other = obj as Foo<T>;
            return other != null && Equals(other);
        }


    }
-121--4667816-

Интересно, что весь Интернет должен быть больше 750 ГБ. Кроме того, структура данных, предназначенная для индексирования Web, также требует большого места хранения.

0
ответ дан 28 November 2019 в 00:09
поделиться

Могу поспорить, это возможно. Вам нужно только иметь квантовый CPU и квантовую оперативную память.

Серьезно, один сервер не сможет догнать рост всей сети. Google использует огромную ферму серверов (подсчитанные в десятках, если не сотни тысяч), и она не может предоставить вам немедленную индексацию.

Я думаю, если вы ограничены одним сервером и нуждаетесь в ползу всей сети, вам действительно нужны результаты этого ползания. Вместо того, чтобы сосредоточиться на «Как ползать веб», сосредоточиться на «Как извлечь данные, которые вам нужно использовать Google». Хорошая отправная точка для этого будет: Google Ajax Search API .

2
ответ дан 28 November 2019 в 00:09
поделиться

Я считаю, что вы имеете в виду статью «IRLbot: масштабирование до 6 миллиардов страниц и выше». Это был односерверный веб-сканер, написанный студентами Texas A&M.

Оставляя в стороне вопросы пропускной способности, дискового пространства, стратегий сканирования, robots.txt / вежливости - главный вопрос, который у меня возник, - «почему?» Сканирование всей сети означает, что вы используете общие ресурсы многих миллионов веб-серверов. В настоящее время большинство веб-мастеров разрешают ботам сканировать их при условии, что они ведут себя хорошо и подчиняются неявным и явным правилам вежливого сканирования.

Но каждый крупномасштабный бот, взламывающий сайт без очевидной выгоды, приводит к тому, что еще несколько сайтов закрывают двери для всего, кроме больших парней (Google, Yahoo, Bing и т. Д.).Итак, вы действительно хотите задать вопрос почему, прежде чем тратить слишком много времени на то, как.

Если предположить, что вам действительно нужно сканировать большую часть Интернета на одном сервере, тогда вам понадобится более толстый канал, гораздо больше места для хранения (например, предположим, что 2 КБ сжатого текста на страницу, поэтому 2 ТБ для страниц размером 1 ГБ ), намного больше оперативной памяти, как минимум 4 реальных ядра и т. д. Статья IRLbot будет вашим лучшим руководством. Вы также можете посмотреть в проекте crawler-commons многоразовые фрагменты кода Java.

И последнее предостережение. Невинная ошибка легко может вызвать проблемы для веб-сайта, и в это время вы попадете под огонь гнева веб-мастеров. Так что убедитесь, что у вас толстая кожа :)

7
ответ дан 28 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: