Основные идеи
Происхождение: Мастер: Начиная с определенной категории Википедии (такой как страница авианосца (ключ), узнайте все цели, содержащие ключ (авианосца самолета), в атрибуте заголовка ссылки, и добавьте их в очередь, которые будут заполнены. из класса ширины, чтобы выполнить эту задачу.
Идея 2 (Происхождение: Кошка): ползание по классификации. Обратите внимание, что в Википедии категории начинаются с категории:. Поскольку Википедия имеет хорошую структуру документов, ее легко начать с любой категории и всегда ползти все категории под ней. Этот алгоритм извлекает подкатегоризации для классификации страниц и захватывает все страницы под ним параллельно. Это быстро и может сохранить структуру классификации, но на самом деле есть много дублирующих страниц, но это может быть легко обработано, написав сценарий на более позднем этапе.
Выбор библиотеки
Я начал использовать JSDOM. Хотя я чувствовал, что это было мощно, это было также довольно "тяжелым". Самым серьезным было то, что документ по объяснению был недостаточно хорош. Я только упомянул его преимущества, но не имел всестороннего объяснения. Поэтому, если вы переходите на Cheerio, он легкий и имеет относительно полные функции. По крайней мере, у вас может быть всеобъемлющая концепция с первого взгляда. На самом деле, после этого я понял, что нет необходимости в библиотеках, и вы можете делать все с регулярными выражениями! Я только что написал немного регулярности в библиотеке.
Ключевые моменты
Настройки глобальной переменной:
var regkey = ['авианосца', «авианосец», «авианосец»]; // Если ключевые слова включены в ссылку, это целевой var allkeys = []; // Название ссылки также является идентификатором страницы, избегая повторного ползания VAR Keys = ['' Категория:%E8%88%AA%E7%A9%BA%E6%AF%8D%E8%88%B0 ']; // ожидание очереди, начальная страница
Скачать изображение
Используйте операцию потоковой передачи библиотеки запросов, чтобы сделать каждую форму загрузки формой загрузки закрытием. Обратите внимание на возможные побочные эффекты асинхронных операций. Кроме того, имя изображения должно быть сброшено. В начале я взял оригинальное имя. По некоторым причинам некоторые изображения ясно существуют, но они не могут быть отображены; и атрибут SRCSET должен быть очищен, в противном случае исходная поверхность не может быть отображена.
$ = cheer.load (Downhtml); var rshtml = $ .html (); var imgs = $ ('#bodycontent .image'); // картинки изменяются этим стилем для (img in imgs) {if (typeof imgs [img] .attribs === 'undefined' || typeof imgs [img] .attribs.href === 'не определено') {var;} // Структура находится под ссылкой, а ссылка не существует, иначе. imgs [img]. Children [0] .attribs.src; // Адрес изображения var dirs = picurl.split ('.'); var fileName = fasterir+uuid.v1 ()+'.'+dirs [dir.length -1]; // переименование запроса ("https:"+picurl) .pipe (fs.createwritestream ('pages/'+filename)); // скачать rshtml = rshtml.replace (picurl, имя файла); // заменить локальный путь // console.log (picurl); }}Приоритет ширины
Сначала я не до конца понимал концепцию асинхронности и сделал это в цикле. Я думал, что использование обещания уже было преобразовано в синхронизацию, но на самом деле это гарантирует, что операции, передаваемые обещаниям, будут выполняться упорядоченным образом, и эти операции не могут быть заказаны с другими операциями! Например, следующий код неверен.
var keys = ['Aircraft -носитель']; var key = keys.shift (); while (key) {data.get ({url: encodeuri (key), qs: null}). Тогда (function (downhtml) {... keys.push (key); // (1)}}); keys = keys.shift (); // (2)}Вышеуказанная операция нормальная, но на самом деле (2) будет работать между (1)! Что делать?
Я использовал рекурсию, чтобы решить эту проблему. Следующий пример кода:
var key = keys.shift (); (function dondertx (key) {data.get ({url: key, qs: null}). then (function (downhtml) {... keys.push (href); ... key = keys.shift (); if (key) {endext (key);} else {console.log (') })})(ключ);Регулярная уборка
Используйте регулярные выражения для очистки бесполезного кода страницы, потому что для обработки необходимо обработать много шаблонов, поэтому я написал цикл, чтобы равномерно обработать его.
var regs = [/<link rel =/"stylesheet/" href =/"? [^/"]*/">/g,/<]? regs.foreach (function (rs) {var mactches = rshtml.match (rs); for (var i = 0; i <mactches.length; i ++) {rshtml = rshtml.replace (mactches [i], mactches [i] .indexof ('styleshiet')-1? href = "Wiki '+(i+1)+'. CSS": '');Эффект бега
Мне нужен FQ на вики -китайском. Я попробовал это и схватил классификацию авианосца. Во время операции я обнаружил около 300 связанных ссылок (включая страницы классификации. Я взял только действительные ссылки и не загружал их). Наконец, я правильно скачал 209. Я вручную протестировал некоторые ссылки на ошибку и обнаружил, что они были недействительными ссылками. Это показало, что запись еще не была установлена. Весь процесс занял около пятнадцати минут. После сжатия это было почти тридцать м, и казалось, что эффект был довольно хорошим.
исходный код
https://github.com/zhoutk/wikispider
краткое содержание
К тому времени, когда я в основном выполнил задачу прошлой ночью, Idea 1 Can Crawl Pages с относительно точным содержанием, а страницы не повторяются, но эффективность ползания не высока, и классифицированная информация не может быть точно получена; Идея 2 может автоматически ползти и хранить файлы локально в категориях в соответствии с Википедией, которая является высокоэффективным (фактическое измерение, ползание [военный корабль] и ползание в общей сложности почти 6000 страниц, которые занимают около 50 минут, и более 100 страниц могут заполняться в минуту), и может точно сохранить классифицированную информацию.
Самым большим усилением является глубокое понимание общего управления процессом асинхронного программирования.