Kamil Herba Juliusz Sompolski 2 marca 2009 ASDL: wyciąganie literatury budowa serwisu
Co trzeba zrobić? Wybrać język i narzędzia programowania. Wymyślić jak rozpoznawać które elementy stron na Ważniaku są literaturą, prawidłowo wyciągać co jest tytułem, co autorem etc. Zapewnić jakieś zaplecze do przechowywania i prezentowania tych informacji, zbudować serwis WWW
Jaki język programowania?
Python! ● „Batteries included”
Python Do Pythona istnieje dużo bibliotek do szybkiej i sprawnej realizacji potrzebnych nam funkcjonalności: Wysyłanie żądań do stron WWW i otrzymywanie odpowiedzi – urllib, httplib Obrabianie tych stron np. wyrażeniami regularnymi aby wyciągnąć z nich interesujące nas dane – re, sgmllib Prezentacja tych danych użytkownikowi w postaci własnego serwisu WWW – framework django
Requestowanie stron WWW urllib – biblioteka obsługująca wiele popularnych protokołów bardzo prosty odczyt danych ze stron obsługa skryptów cgi obsługa https httplib – druga biblioteka nieco bardziej niskopoziomowa urllib do obsługi http korzysta z niej
Przykłady urllib – funkcja odczytująca kod strony o podanym adresie def getWebPage(urlString): handle = urllib.urlopen(urlString) return handle.read() httplib – podobna funkcja: def getWebPage2(urlString): url = urlparse(urlString) conn = httplib.HTTPConnection(url.hostname) conn.request("GET", urlString) r = conn.getresponse() return r.read()
Ciekawy formularz z Buw Wyszukiwanie przez słowa w opisach Wpisz termin wyszukiwawczy: Wybierz kategorię: Tytuł Autor Hasło przedmiotowe pol. Hasło przedmiotowe ang. ISBN ISSN Wszystko
urllib – formularze POST Funkcja szukająca danej książki w BUW: def findTitleInBuwList(title): params = urllib.urlencode({'t1': title, 'u1': '4', 'submittheform': 'Search', "beginsrch" : "1", "function" : "INITREQ"}) f = urllib.urlopen(" bin/gw_46_6/chameleon", params) return f.read() praktyczne użycie - FindBookInBuw.py
Przedmioty na Ważniaku Zebrane w postaci linków na głównej stronie, w sekcjach zatytułowanych „Pierwszy stopień” oraz „Drugi stopień”. Nietrudno powinno być z tego wyciągnąć listę przedmiotów na Ważniaku, a literaturę przyporządkowywać do przedmiotów na stronach których została znaleziona. Aby obejść strony wykładu trzeba tylko chodzić po odpowiednich linkach.
Literatura na Ważniaku W większości zebrana w sekcji „Literatura” na głównej stronie danego wykładu, czasem też głębiej na stronach poszczególnych wykładów. Zebrana w postaci listy wypunktowanej lub wynumerowanej – co może ułatwić wyciąganie poszczególnych elementów literatury Często jednak dodatkowe „śmieci”, takie jak podział sekcji literatura na podsekcje, komentarze do literatury.
Najprostszy przypadek
Podział na podsekcje
Dodatkowy tekst
W kodzie... [ Edytuj ] Literatura D. Kincaid, W. Cheney, Analiza numeryczna, Wydawnictwa Naukowo- Techniczne, Warszawa ISBN X A. Björck, G. Dahlquist, Metody numeryczne, Państwowe Wydawnictwo Naukowe, Warszawa ISBN [ Edytuj ] Moduły
W kodzie... [ Edytuj ] Literatura W celu dogłębnego zapoznania się z omawianym na wykładzie materiałem, przeczytaj rozdział 2.3 w D. Kincaid, W. Cheney Analiza numeryczna, Wydawnictwa Naukowo-Techniczne, Warszawa 2006, ISBN X. Warto także przejrzeć rozdział 2 w P. Deulfhard, A. Hohmann, Numerical Analysis in Modern Scientific Computing, Springer, 2003, omawiający zagadnienia uwarunkowania i numerycznej poprawności algorytmów. Nieocenioną monografią na ten temat jest N. Higham, Accuracy and Stability of Numerical Algorithms, SIAM, 2002.
W kodzie... [ Edytuj ] Literatura Wykłady : Date C. J., An Introduction to Database System, vol. II, Adison-Wesley Pub. Comp., również WNT – W-wa, (seria: Klasyka Informatyki), 2000 (...) Laboratoria : M. Szeliga: ABC języka SQL. HELION. (...) [ Edytuj ] Moduły
Od strony technicznej biblioteka sgmlib – parser html odczytywanie linków do przedmiotów znajdowanie listy literatury Rozpoznawanie listy literatury na podstawie tagów html. Zwracanie wpisów literatury w całości, bez podziału na autora, tytuł etc.
Inne możliwości Inne biblioteki – htmllib, HTMLParser – o podobnej funkcjonalności, trochę innym interfejsie
sgmlib - przykład from sgmllib import SGMLParser class LiteratureLister(SGMLParser): def reset(self): SGMLParser.reset(self) self.list = [] self.literatureSection = False self.literatureElement = False def start_a(self, attrs): for t in attrs: if t == ('name', 'Literatura'): self.literatureSection = True def start_div(self, attrs): self.literatureSection = False def start_li(self, attrs): if(self.literatureSection): self.literatureElement = True self.elementBuffer = '' def end_li(self): if(self.literatureElement): if(self.elementBuffer.endswith("\n")): self.elementBuffer = self.elementBuffer.replace("\n","") self.list.append(self.elementBuffer) self.literatureElement = False def handle_data(self, text): if(self.literatureElement): self.elementBuffer += text
Literatura na Ważniaku Poszczególne wpisy różniące się diametralnie formatem Czasem „autor, tytuł”, czasem „tytuł, autor”, Autorzy czasem z pełnym imieniem, czasem z inicjałem, Poszczególne elementy wpisu zazwyczaj oddzielone przecinkami, ale bywa np. „autor: tytuł”, Rzadko takie dane jak ISBN
Przykłady wpisów B. Kernighan, D. Ritchie, Język ANSI C, Wydawnictwa Naukowo-Techniczne, Warszawa Adams Andrew A., McCrindle Rachel, Pandora's Box: Social and Professional Issues of the Information Age, John Wiley & Sons Ltd, Chichester, Marwedel P., Embedded System Design, Kluwer Academic Publishers, Boston 2003, ISBN M. Szeliga: ABC języka SQL. HELION. Materiały firmowe - dokumenty techniczne dostępne w sieci WWW - MIPS, Intel, AMD Wprowadzenie do algorytmów, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, Wydawnictwa Naukowo - Techniczne, 2004.
Od strony technicznej re – moduł do obsługi wyrażeń regularnych analiza danych z listy literatury – co jest książką, co autorem, co rokiem i numerem wydania, etc. analiza danych ze stron księgarni internetowych (wyszukiwanie wyrażeń typu nakład wyczerpany, cena, pozycja dostępna, etc.)
Wyrażenia regularne... Jeszcze tego nie zrobiliśmy :-) Powinno się jednak dać.
Budowa serwisu Framework django Pośredniczy w komunikacji z bazą danych przez obiektowy interfejs, nie wymagający pisania z palca SQLi Obsługuje wygląd stron poprzez prosty język template'ów Oddziela go od logiki poprzez pisanie widoków.
Django - początek django-admin.py startproject asdl ls __init__.py manage.py settings.py urls.py django-admin.py startapp getliterature ls __init__.py models.py views.py settings.py – ustawienia projektu models.py – modele bazy danych views.py – widoki urls.py – powiązania widoków z adresami
Templates reklamodawca.html: Wylistuj literaturę Wylistuj literaturę {{ form.as_p }} {% if error %} Nie udało się otworzyć strony {{ url }}. {% else %}{% if results %} {% if books %} Elementy literatury znalezione na stronie {{ url }}: {% for book in books %} {{ book }} {% endfor %} {% else %} Na stronie {{ url }} nie znaleziono żadnych elementów literatury. {% endif %}{% endif %}{% endif %}
Views views.py: from django import forms from getwebpage import getWebPage from literaturelister import LiteratureLister from django.shortcuts import render_to_response class LiteratureForm(forms.Form): url = forms.URLField(label='Podaj URL:', widget=forms.TextInput(attrs={'size':'100'})) def getLiterature(request): context = {} if request.method == 'POST': form = LiteratureForm(request.POST) if form.is_valid(): context["url"] = form.cleaned_data['url'] try: data = getWebPage(form.cleaned_data['url']) lister = LiteratureLister() lister.feed(data) context["results"] = True context["books"] = lister.list except IOError: context["error"] = True else: form = LiteratureForm() context["form"] = form return render_to_response('literature.html', context)
Modele models.py: from django.db import models class Book(models.Model): title = models.CharField(maxlength=1024) author = models.CharField(maxlength=1024) # etc... def __str__(self): return str(self.author)+', '+str(self.title) settings.py: DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = 'db' Shell: syncdb (...) Creating table getliterature_book
Modele Python: >>> from asdl.getliterature.models import * >>> b = Book(title='Wprowadzenie do algorytmow', author='T. Cormen') >>> b.save() >>> c = Book(title='Thinking in Java', author='Bruce Eckel') >>> c.save() >>> d = Book(title='Wprowadzenie do blabla', author='Foobar') >>> d.save() >>> Book.objects.all() [,, ] >>> Book.objects.filter(title__startswith="Wprowadzenie") [, ]
Podłączenie tego urls.py: urlpatterns = patterns('', (r'^$', 'asdl.getliterature.views.getLiterature'), ) No i odpalić... runserver
Ta-dam!