Kamil Herba Juliusz Sompolski 2 marca 2009 ASDL: wyciąganie literatury budowa serwisu.

1 Kamil Herba Juliusz Sompolski 2 marca 2009 ASDL: wyciąg...
Author: Nina Owczarek
0 downloads 0 Views

1 Kamil Herba Juliusz Sompolski 2 marca 2009 ASDL: wyciąganie literatury budowa serwisu

2 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

3 Jaki język programowania?

4 Python! ● „Batteries included”

5 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

6 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

7 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()

8 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

9 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("https://opac.buw.uw.edu.pl/cgi- bin/gw_46_6/chameleon", params) return f.read() praktyczne użycie - FindBookInBuw.py

10 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.

11 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.

12 Najprostszy przypadek

13 Podział na podsekcje

14 Dodatkowy tekst

15 W kodzie... [ Edytuj ] Literatura D. Kincaid, W. Cheney, Analiza numeryczna, Wydawnictwa Naukowo- Techniczne, Warszawa 2006. ISBN 83-204-3078-X A. Björck, G. Dahlquist, Metody numeryczne, Państwowe Wydawnictwo Naukowe, Warszawa 1987. ISBN 83-01-04276-1 [ Edytuj ] Moduły

16 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 83-204-3078-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.

17 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

18 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.

19 Inne możliwości Inne biblioteki – htmllib, HTMLParser – o podobnej funkcjonalności, trochę innym interfejsie

20 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

21 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

22 Przykłady wpisów B. Kernighan, D. Ritchie, Język ANSI C, Wydawnictwa Naukowo-Techniczne, Warszawa 2004. Adams Andrew A., McCrindle Rachel, Pandora's Box: Social and Professional Issues of the Information Age, John Wiley & Sons Ltd, Chichester, 2008. Marwedel P., Embedded System Design, Kluwer Academic Publishers, Boston 2003, ISBN 1-4020-7690-8 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.

23 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.)

24 Wyrażenia regularne... Jeszcze tego nie zrobiliśmy :-) Powinno się jednak dać.

25 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.

26 Django - początek jullass@hermes:~/proj/algint$ django-admin.py startproject asdl jullass@hermes:~/proj/algint/asdl$ ls __init__.py manage.py settings.py urls.py jullass@hermes:~/proj/algint/asdl$ django-admin.py startapp getliterature jullass@hermes:~/proj/algint/asdl/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

27 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 %}

28 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)

29 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: jullass@hermes:~/proj/algint/asdl$./manage.py syncdb (...) Creating table getliterature_book

30 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") [, ]

31 Podłączenie tego urls.py: urlpatterns = patterns('', (r'^$', 'asdl.getliterature.views.getLiterature'), ) No i odpalić... jullass@hermes:~/proj/algint/asdl$./manage.py runserver

32 Ta-dam!