sobota, 24 marca 2012

Prosty czytnik RSS

Sporo stron internetowych udostępnia swoje dane poprzez RSS. Standard ten umożliwia dostęp do najświeższych informacji udostępnianych przez stron. Wewnątrz strumienia danych najczęściej znajdziemy krótki opis wraz z linkiem do pełnego artykułu.
Jak można wykorzystać takie dane pokażę na przykładzie czytnika RSS pokazującego najnowsze oferty pracy.




Co potrzebujemy

Standard RSS jest niezależny od języka programowania. Ja w przykładzie wykorzystam:


Tworzymy model

Jeżeli chcemy wykorzystać RSS we własnej aplikacji webowej to powinniśmy zapisać pobrane dane w bazie danych. Strony które udostępniają dane poprzez RSS nie powinny być przez nas bombardowane requestami co parę sekund.

class DataSource(db.Model):
    name = db.StringProperty()
    link = db.LinkProperty()
    update_date = db.DateTimeProperty()

    
class JobOffer(db.Model):
    source = db.ReferenceProperty()
    title = db.StringProperty()
    post_date = db.DateTimeProperty()
    content = db.TextProperty()
    link = db.LinkProperty()


Mamy tu 2 klasy:
  • Datasource - Służy do przechowywania źródeł danych (linków do kanałów RSS)
  • JobOffer - Służy do przechowywania pobranej oferty pracy


Pobieramy dane


def update_feeds(self):

    dataSources = DataSource.all()
    for dataSource in dataSources:
        _load_feed(dataSource)


def _load_feed(dataSource):
    last_modified = dataSource.update_date
    if last_modified == None:
        last_modified = datetime(2000, 1, 1, 0, 0)
    data = feedparser.parse(dataSource.link, modified=last_modified)
    if hasattr(data, 'modified_parsed'):
        modified = data.modified_parsed
        dt = datetime.fromtimestamp(mktime(modified))
    elif hasattr(data, 'etag'):
        modified = data.etag_parsed
        dt = datetime.fromtimestamp(mktime(modified))
    else:
        dt = datetime.now()
            
    dataSource.update_date = dt
    dataSource.save()
        
    for entry in data.entries:
        dt = datetime.fromtimestamp(mktime(entry.date_parsed))
        summary = html.strip_tags(entry.summary)
        if dt > last_modified:
            offer = JobOffer(source=dataSource,
                             title=entry.title, 
                             post_date=dt,
                             content=summary,
                             link=entry.link)
            offer.save()

Jeżeli korzystamy z biblioteki feedparser to cała komunikacja odbywa się poprzez tą bibliotekę. My otrzymujemy gotowy model z danymi, który zapisujemy do bazy.



Przykład

A jak to wszystko wygląda w praktyce można podejrzeć na stronie:
www.foklid.com

Brak komentarzy:

Prześlij komentarz