Rss парсинг

32 views
Skip to first unread message

Mecid Cabrayilov

unread,
Mar 25, 2010, 4:37:14 PM3/25/10
to Google App Engine for Java on Russian
Парсю RSS с помощью Rome lib,затем сохраняю в датастор,но кирилица
превращается в кракозябры,а если парсить с помощью Informa lib то все
нормально,но хотелось бы использовать Rome,кто с этим встречался?

Mic Vit

unread,
Mar 26, 2010, 4:08:57 AM3/26/10
to google-appengi...@googlegroups.com
Как раз пользуюсь Rome. Подключался к довольно большому числу разных фидов и проблем с кодировкой не возникало.
Если дадите пример "проблемного" RSS, готов его попробовать.

25 марта 2010 г. 23:37 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:
Парсю RSS  с помощью Rome lib,затем сохраняю в датастор,но кирилица
превращается в кракозябры,а если парсить с помощью Informa lib то все
нормально,но хотелось бы использовать Rome,кто с этим встречался?

To unsubscribe from this group, send email to google-appengine-java-russian+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.

Mecid Cabrayilov

unread,
Mar 26, 2010, 6:42:45 AM3/26/10
to Google App Engine for Java on Russian
у меня все рсски так ся ведут,конкретно
http://habrahabr.ru/rss/blogs/java/

Mecid Cabrayilov

unread,
Mar 26, 2010, 8:01:28 AM3/26/10
to Google App Engine for Java on Russian
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new InputStreamReader(new Url("http://
habr.ru/rss").openStream());
List<SyndEntry> items = input.getItems();
for(SyndEntry item : items){
//сохраняю
}

Mic Vit

unread,
Mar 26, 2010, 8:05:44 AM3/26/10
to google-appengi...@googlegroups.com
Скорее всего дело в том, что не указана кодировка входящего потока.
Если код типа такого:

...

InputStream is = connection.getInputStream();

// тут надо например
String contentType = "UTF-8";

SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(is, contentType));
...

Предполагаю.

Сам я как оказалось непосредственно для чтения использовал  ROME Fetcher, основанный на Rome.
Там чуть проще и без проблем:

FeedFetcher fetcher = new HttpURLFeedFetcher();
URL feedUrl = new URL("http://habrahabr.ru/rss/blogs/java/");
SyndFeed feed = fetcher.retrieveFeed(feedUrl);
...

26 марта 2010 г. 13:42 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:
у меня все рсски так ся ведут,конкретно
http://habrahabr.ru/rss/blogs/java/

Mic Vit

unread,
Mar 26, 2010, 8:12:13 AM3/26/10
to google-appengi...@googlegroups.com
Похоже тут надо использовать конструктор
InputStreamReader(InputStream in, String charsetName) 

2010/3/26 Mecid Cabrayilov <cme...@gmail.com>
}

Mecid Cabrayilov

unread,
Mar 26, 2010, 11:14:22 AM3/26/10
to Google App Engine for Java on Russian
а какая разница между Rome Fetcher и Rome?

Mecid Cabrayilov

unread,
Mar 26, 2010, 11:48:23 AM3/26/10
to Google App Engine for Java on Russian
как я понял,Fetcher использует HTTP заголовки для того чтобы понять
изменялась ли лента,я правильно поняЛ?

Mic Vit

unread,
Mar 29, 2010, 3:15:35 AM3/29/10
to google-appengi...@googlegroups.com
Честно говоря, я особо не разбирался в особенностях. Просто использовал простейшим способом, чтобы читать каналы напрямую при отладке. Поэтому, добавить  чего-то к тому, что в доках не могу.

Чтобы облегчить себе жизнь, в рабочей версии программы пользуюсь хабом, который присылает новые сообщения по pubsubhubbub. Минимальный входящий объем, не нужно самому отделять старое и новое, нагрузка на приложение минимальна (обработка запускается только при поступлении post от хаба)

26 марта 2010 г. 18:48 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:

Mecid Cabrayilov

unread,
Mar 29, 2010, 4:35:32 AM3/29/10
to Google App Engine for Java on Russian
интересно,спасибо,я почитаю про это.если будут вопросы обращусь,ок?

Mic Vit

unread,
Mar 29, 2010, 4:43:14 AM3/29/10
to google-appengi...@googlegroups.com
OK.
http://code.google.com/p/pubsubhubbub/

29 марта 2010 г. 12:35 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:
интересно,спасибо,я почитаю про это.если будут вопросы обращусь,ок?

Mecid Cabrayilov

unread,
Mar 29, 2010, 4:56:12 AM3/29/10
to Google App Engine for Java on Russian
а можно небольшой пример кода?
а то не нашел никаких либ для этого протокола,как это работает то?

Mic Vit

unread,
Mar 29, 2010, 5:19:50 AM3/29/10
to google-appengi...@googlegroups.com
http://grack.com/blog/2009/09/09/parsing-the-pubsubhubbub-notifications/
в этом примере обрабатывются сообщения от хаба и пересылаются по XMPP.
в doGet происходит обработка запроса хаба на подписку (после того, как вы подписались). Все что необходимо там это

resp.setContentType("text/plain");
resp.setStatus(200);
resp.getOutputStream().print(req.getParameter("hub.challenge"));
resp.getOutputStream().flush();


в doPost собственно прием новой порции фида:
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(req.getInputStream()));
....
resp.setStatus(204);

Конечно надо найти подходящий хаб и подписаться.
Я нашел http://superfeedr.com/ Кушает любые фиды, не требует от них поддержки pshb, сам их периодически проверяет.
Подписать приложение можно прямо у них на сайте.


29 марта 2010 г. 12:56 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:

>
> а можно небольшой пример кода?
> а то не нашел никаких либ для этого протокола,как это работает то?
>

Mecid Cabrayilov

unread,
Mar 29, 2010, 5:31:35 AM3/29/10
to Google App Engine for Java on Russian
спасибо я поэксперементирую

Mecid Cabrayilov

unread,
Mar 29, 2010, 1:16:35 PM3/29/10
to Google App Engine for Java on Russian
а можно ваще посмотреть твой код?что бы понять как это ваще должно
работать?

Mic Vit

unread,
Mar 30, 2010, 4:25:03 AM3/30/10
to google-appengi...@googlegroups.com
Тот код, ссылку на который я приводил, вполне полноценный. Мой по сути такой же.  То есть код сервлета, адрес которого передается хабу при подписке на канал, включает две функции:

1) подтверждение на запрос от хаба

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.setStatus(200);
if (req.getParameter("hub.mode") != null)
{
resp.getOutputStream().print(req.getParameter("hub.challenge"));
resp.getOutputStream().flush();
}
}

2) получение новых данных

public void doPost(HttpServletRequest req, HttpServletResponse resp)
     throws IOException {
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(req.getInputStream()));
@SuppressWarnings("unchecked")
List<SyndEntry> entriesList = feed.getEntries();
for (SyndEntry entry : entriesList)
{
                               //  ..... смотрим записи канала
                        }

                       resp.setStatus(204);
}

Можно конечно реализовать собственно запрос на подписку в программе, но я этого не делал.

29 марта 2010 г. 21:16 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:
а можно ваще посмотреть твой код?что бы понять как это ваще должно
работать?

Mecid Cabrayilov

unread,
Mar 30, 2010, 4:43:43 AM3/30/10
to Google App Engine for Java on Russian
спасибо,у меня онлайн рсс ридер,пользователи подписываются на
рсски,как вот эту функцию сделать программно.

Mic Vit

unread,
Mar 30, 2010, 4:53:29 AM3/30/10
to google-appengi...@googlegroups.com
очевидно надо послать хабу POST request с параметрами как описано в п. 6.1 из последней ссылки на описание протокола

30 марта 2010 г. 12:43 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:
спасибо,у меня онлайн рсс ридер,пользователи подписываются на
рсски,как вот эту функцию сделать программно.

Mecid Cabrayilov

unread,
Mar 30, 2010, 5:24:35 AM3/30/10
to Google App Engine for Java on Russian
ок спасибо,буду експереминтировать

Mecid Cabrayilov

unread,
Mar 30, 2010, 9:21:30 AM3/30/10
to Google App Engine for Java on Russian
вот код которым я пытаюсь зарегистрировать рсс.
URLFetchService fetchService =
URLFetchServiceFactory.getURLFetchService();
HTTPRequest request = new HTTPRequest(new URL("http://
pubsubhubbub.appspot.com/"), HTTPMethod.POST);
resp.setContentType("application/x-www-form-urlencoded");
request.addHeader(new HTTPHeader("hub.callback","http://
mecid3.appspot.com/callback"));
request.addHeader(new HTTPHeader("hub.mode","subscribe"));
request.addHeader(new HTTPHeader("hub,topic", (String)
req.getParameter("url")));
request.addHeader(new HTTPHeader("hub.verify","async"));

HTTPResponse response = fetchService.fetch(request);
но чтото ни так делаю

Mic Vit

unread,
Apr 2, 2010, 1:51:57 PM4/2/10
to google-appengi...@googlegroups.com
удалось разобраться?

30 марта 2010 г. 17:21 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:

Mecid Cabrayilov

unread,
Apr 2, 2010, 5:05:02 PM4/2/10
to Google App Engine for Java on Russian
код который выше,чтото не хочет подписывать

Mic Vit

unread,
Apr 5, 2010, 3:05:34 AM4/5/10
to google-appengi...@googlegroups.com
Немного повозившись, удалось родить работоспособный код. Параметры подписки пихаются в тело сообщения в формате, используемом для посыла вебформ.  Заминка у меня была из-за того, что superfeedr, с которым я работаю, требует авторизации, что я не сразу просек. Вообще говоря, протокол этого как я понимаю этого не требует. За основу кода взял пример : http://code.google.com/intl/ru/appengine/docs/java/urlfetch/usingjavanet.html#Using_HttpURLConnection
Вот сам код:

import java.net.URL;
import java.net.URLEncoder;
import java.net.HttpURLConnection;
import java.io.OutputStreamWriter;
import com.google.appengine.repackaged.com.google.common.util.Base64;

private static final Logger log = Logger.getLogger(MyServlet.class.getName());

// ...

log.setLevel(Level.ALL);
String callback = URLEncoder.encode("hub.callback", "UTF-8") + "=" + URLEncoder.encode("http://myapp.appspot.com/subscribe", "UTF-8");
String mode = URLEncoder.encode("hub.mode", "UTF-8") + "=" + URLEncoder.encode("subscribe", "UTF-8");
String topic = URLEncoder.encode("hub.topic", "UTF-8") + "=" + URLEncoder.encode("http://habrahabr.ru/rss/blogs/java/", "UTF-8");
String verify = URLEncoder.encode("hub.verify", "UTF-8") + "=" + URLEncoder.encode("sync", "UTF-8");
String body = callback + "&" + mode + "&" + topic + "&" + verify;
URL url = new URL("http://superfeedr.com/hubbub");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            
connection.setRequestProperty("Authorization", "Basic " + Base64.encode(("name:password").getBytes()));

OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
writer.write(body);
writer.close();
   
if (connection.getResponseCode() == HttpURLConnection.HTTP_NO_CONTENT ) {
log.fine("Subscribe: OK");
} else {
log.fine("Subscribe: ERROR " + connection.getResponseCode());
}

3 апреля 2010 г. 1:05 пользователь Mecid Cabrayilov <cme...@gmail.com> написал:
код который выше,чтото не хочет подписывать

--
To unsubscribe, reply using "remove me" as the subject.

Reply all
Reply to author
Forward
0 new messages