Wikipedia + mongodb

0

Cześć,

Muszę zrobić projekt w pythonie który będzie pobierał stronę z wikipedii i zapisywał ją w bazie danych ( użyć muszę mongodb). Przy kolejnym zapytaniu najpierw sprawdzane jest czy dana strona jest w bazie i jeśli jest to ją wyświetla, a jeśli nie to pobiera i wyświetla.

Znalazłem bibliotekę do tego https://github.com/goldsmith/Wikipedia . Tylko nie wiem czy da się zrobić tak aby, strona była wyświetlana w przeglądarce czy po prostu wyświetlać content w terminalu. I w jaki sposób wgl współpracować z tą bazą ?

Sorry ale jestem kompletnie zielony w pythonie.

0

Możesz przykładowo użyć PyMongo.

Tu są różne drivery: https://docs.mongodb.org/ecosystem/drivers/python/

Mnie się wydaje, że nie musisz nic wyświetlać (tylko sprawdzać link, czy już nie był zapisywany), tylko od razu zapisywać do bazy.

0

A co w przypadku zaktualizowania danych na wikipedi a w bazie będziesz miał stare dane?

0

No co, kasujemy w bazie i aktualizacja danych... Nie wiem czy Wiki ma jakieś dane typu data aktualizacji, czy wersja artykułu. Jeśli nie to może być problem.

0

Aktualizacja nie ma co się przejmować, ponieważ jest to projekt na zaliczenie, więc po oddaniu go mogę o nim zapomnieć.

Tylko kwestia tego żeby zapisywać chyba całe strony do tej bazy jako pliki html.
Poza tym trzeba jeszcze zrobić rozpoznawanie po flagach Państwa. tzn jeśli dasz flagę jako argument w jpg to znajdzie Ci stronę Państwa np. dajesz polską flagę i wywala Ci stronę o Polsce z wiki, ale bez tego też przejdzie.

0

Projekt relatywnie prosty, szczególnie że wrzucasz całe pliki HTML.

Natomiast z tym flagami, to możesz podejść do tematu na wiele sposobów (np. z użyciem OpenCV), jednak najprościej to przez porównanie fotek pikesp po pikselu. Ja robiłem coś podobnego z użyciem PILLOW - generalnie użyłem resize żeby uzyskać tak samą wielkość plików i porównywałem po pixelach wartości (ja przyjąłem pewną tolerancje, bo oczywiście rzadko się zdarza, żeby piksele na rożnych bitmapach miały te same wartości - w odpowiadających sobie miejscach).

0

Może i prosty ale dla kogoś kto umie pythona ;)
Ja mam problem z zaczęciem wgl tego..

0

Dostałem kod od znajomego. z tym że po odpaleniu tego " python Main.py " dostaje znak zachęty i nie ważne co wpiszę zawsze dostaje "none"

Pytanie mam odnośnie linijki pymongo.MongoClient -> co tutaj należy podać? Bo rozumiem że muszę utworzyć sobie nową bazę i tutaj podać do niej ścieżkę.

zainstalowane mam: python 2.7, pymongo 2.7 pillow 2.7 i mongodb 3.2 i https://codeload.github.com/kennethreitz/requests/zip/master

0

No to jeszcze wypada doinstalować requests:

pip install requests (w Linux; w Windowsach jak masz PIP-a)
lub
python -m pip install requests (z linii poleceń w Windowsach)
( to zależy nie tylko od OS, ale też wersji Pythona, zdaje się od 3.4..... i 2.7..... PIP jest dostarczany z pythonem).

i podobnie BeautifulSoup4, ....a później pokaż czy program ewentualnie sypie błędami.

Tu masz dane do MongoDB:

client = pymongo.MongoClient('mongodb://admin:[email protected]:29640/jpwp259044')
db = client.jpwp259044

Bazę oczywiście musisz zainstalować, tu masz sposoby autentyfikacji:

http://api.mongodb.org/python/3.0.3/examples/authentication.html

Myślę, że znajomy sprawdził program przed wysłaniem Tobie i wszystko powinno działać, jak zainstalujesz wszystkie wymagane biblioteki i bazę.

0

Ok, program odpalił, problemy były ze złymi wersjami bibliotek.

Chciałbym tutaj dodać info czy pobiera z bazy czy z neta tą stronę. Ale jeśli dam print'a po pierwszym if to wywala błedy..

 if getCountry.count():
        return content.find({"name_id": getCountry[0]["_id"]})[0]["content"]
    else:
        url = "https://en.wikipedia.org/wiki/" + tag
        try:
            rawHTML = urllib2.urlopen(url)
        except urllib2.HTTPError:
            raise Exception("Not found - {}!".format(tag))
 
        soup = BeautifulSoup(rawHTML)
        pars = soup.find(id = "mw-content-text")
        descr = unicodedata.normalize("NFD", re.sub("\s+", " ", pars.text).strip()).encode("ascii", "ignore")
 
        postCountryName = {"name": tag}
        postId = name.insert(postCountryName)
 
        postText = {"name_id": postId, "content": descr}
        content.insert(postText)
 
        return descr
0

Jeśli dodanie printa powoduje, że program przestaje działać, to chyba masz problem z wcięciami (identation)

1 użytkowników online, w tym zalogowanych: 0, gości: 1