Я ежедневно работаю с Atom Hopper, который является сервером Java ATOMPub. Когда мы добавляем новые функции, нам нужно тестировать эти функции, и часто мы получаем маленькие скрипты, такие как тот, который я покажу вам сегодня. Недавно был обновлен Atom Hopper, чтобы можно было просматривать страницы и получать ATOM. По сути, Atom Hopper будет создавать ссылки « Следующая» и « Предыдущая» в головке подачи, по которым можно легко переходить либо к хвосту (самые старые записи) подачи, либо к голове (новые записи).
Смотрите мои предыдущие статьи или вики о том, как настроить Atom Hopper, а также мою статью о том, как настроить его для использования адаптера данных MongoDB. Вы также можете использовать адаптер данных Hibernate, если хотите.
Головка подачи, которую производит Atom Hopper, выглядит примерно так:
<feed xmlns="http://www.w3.org/2005/Atom"> <link href="http://localhost:8080/namespace/feed/" rel="current" /> <link href="http://localhost:8080/namespace/feed/" rel="self" /> <id>urn:uuid:0b5061ec-94b1-4ffc-a383-803221793e2c</id> <title type="text">namespace/feed</title> <link href="http://localhost:8080/namespace/feed/?marker=urn:uuid:34ee3a9a-31dd-46e4-b39e-05bd3596966d&limit=25&search=&direction=forward" rel="previous" /> <link href="http://localhost:8080/namespace/feed/?marker=urn:uuid:9b2e6989-0771-4622-b0eb-49d33f4f5487&limit=25&search=&direction=backward" rel="next" /> <link href="http://localhost:8080/namespace/feed/?marker=urn:uuid:69128671-daf3-4bac-adbb-64e459b6701e&limit=25&search=&direction=backward" rel="last" /> <updated>2012-06-09T03:43:01.743Z</updated> ... Entries would be seen here .... </feed>
Вы можете видеть, что есть несколько ссылок. Так как я нахожусь во главе канала, где находятся самые новые записи, я могу перейти по следующей ссылке, чтобы перейти к хвосту канала. Поскольку я делаю это, я могу анализировать записи ATOM, содержащиеся в возвращаемых данных. В качестве примера я загрузил 100 записей ATOM в MongoDB и установил свой предел в скрипте, чтобы загружать только 25 записей на вызов (по умолчанию 25, а максимальное — 1000).
Используя CoffeeScript, я могу легко переходить по следующим ссылкам, пока не доберусь до конца. Как только я доберусь до хвоста, больше не будет записей, и поэтому следующая ссылка не будет создаваться в хвосте канала.
Сначала вам нужно будет установить пару пакетов NPM:
$ npm install elementtree $ npm install coffee-script
Вот CoffeeScript:
fs = require("fs") et = require("elementtree") http = require("http") url = require("url")
element = et.Element opts = host: "localhost" port: 8080 method: "GET" path: "/namespace/feed/?limit=25" loadAtomFeed = -> http.get(opts, (response) -> returnedData = "" response.on "data", (chunk) -> returnedData += chunk response.on "end", -> etree = et.parse(returnedData) nextLink = etree.find("./link[@rel=\"next\"]") return if not nextLink? parsedUrl = url.parse(nextLink.attrib["href"]) console.log "Following Next Link: " + parsedUrl.href opts.host = parsedUrl.hostname opts.path = parsedUrl.path loadAtomFeed() ).on "error", (e) -> console.log "Error: " + e.message loadAtomFeed()
Примечание: я уверен, что это можно сделать намного эффективнее. Поскольку это всего лишь сценарий тестирования, он работает «достаточно хорошо».
Я использую ElementTree для разбора XML. Хотя я на самом деле не разбираю ничего, кроме следующей ссылки, вы определенно можете извлечь из ленты все, что захотите.
Я сохранил скрипт как app.coffee . Предполагая, что у вас установлены CoffeeScript и Node.js, вы можете запустить скрипт прямо так:
$ coffee app.coffee
Мои результаты выглядели так:
Following Next Link: http://localhost:8080/namespace/feed/?marker=urn:uuid:9b2e6989-0771-4622-b0eb-49d33f4f5487&limit=25&search=&direction=backward Following Next Link: http://localhost:8080/namespace/feed/?marker=urn:uuid:1ed87690-632b-4bc9-a9f1-c7c607d771bb&limit=25&search=&direction=backward Following Next Link: http://localhost:8080/namespace/feed/?marker=urn:uuid:82e12cc7-06d3-4b89-bedc-4f6bd4a3f4b6&limit=25&search=&direction=backward Following Next Link: http://localhost:8080/namespace/feed/?marker=urn:uuid:69128671-daf3-4bac-adbb-64e459b6701e&limit=25&search=&direction=backward