“Ej Aco..” – prekinuo me Srki u ___________ dok sam ljenčario na poslu. Naime, zanima ga… da li bi mu mogao prebaciti sadržaj “prodaja Ega/hiperinflacija Emocija” sa http://srdjansandic.blog.com/ na blogger.com. Da li bih mogao… pif….
S obzirom da Aco nije nikad odbio besplatno pivo odlučio sam složiti neku sitnu skriptu koja će mu to raditi. Naime, blogger.com (kaže Srki, nisam ja provjeravao) ne može to sam importati. blog.com nema nikakav public API za export podataka ali zato blogger/blogspot ima.
Brz na idejama, kakav već jesam, bacio sam kratki pogled na
http://srdjansandic.blog.com/. Analizirajući stranice mojim omiljenim FireBugom odlučio sam se na najkraće moguće rješenje (u međuvremenu se malo promjenio template ali u vremenu kad sam prebacivao code je imao smisla).
Daklem…. govoreći riječnikom iskusnih kiber hakera i internauta odlučio sam se za slijedeće:
ćopi_sve_linkove_na_arhivu sa strane "http://srdjansandic.blog.com/";
vrti_kroz_te_stranice { | stranica |
ćopi_sve_linkove_na_perma_link sa stranica;
-- LoL !
vrti_kroz_te_stranice { | stran1ca |
ćopi_sadržaj_stranice stran1ca;
izvuci_iz_dom [title, datum, content] -> snimi_u_bazu;
}
}
Naime, šema je slijedeća. Ćopim naslovnu stranu. Na naslovnici se nalaze linkovi na stranice sa arhivama. Uzmem te linkove i skinem svaku od tih stranica posebno. Tamo se nalazi popis svih postova (lako je jer je sve na jednoj stranici) sa dijelom sadržaja. Vrtim kroz svaki od tih postova i uzmem linkove na koje pokazuje link na njihov permalink. Uzmem svaku od tih permalink stranica i iz nje izvučem sadržaj naslova, datum objave i sadržaj. Može i komentare na taj način ali Srki je rekao da nema potrebe za tim.
Zatim dobiven sadržaj spremim negdje (u mom slučaju sqlite3). S obzirom da blogger ima neku zaštitu od SPAM-anja podnosi samo određeni broj postova u danu. Preko Web interfacea se može postati više ali se mora popuniti neki CAPTCHA. Preko GData API-a nisam vidio da ima neka opcija za to pa zbog toga svaki dan opalim nekih 50-etak novih članaka iz baze.
U svemu ovome koristio sam Beautiful Soup. Zakon library koji mi je do sad dosta puta uskočio u pomoć. Kuži loš HTML, lako se izvlači sadržaj iz njega i brine se za encodinge. To im čak piše i na naslovnoj stranici 🙂 Iz nepotpunog primjera koji slijedi (koji nisam ni isprobao) je vidljivo kako se koristi Beautiful Soup i kako sam ja primjenio gornji algoritam na Srkijevom siteu.
import urllib
from BeautifulSoup import BeautifulSoup
def fetchURL(url):
return BeautifulSoup(urllib.urlopen(url).read(), fromEncoding="utf-8")
soup = fetchURL("http://srdjansandic.blog.com/")
for link in soup.find('div', {"class":"block slideshow"}).findAllNext("a"):
archive = fetchURL(link["href"])
for post in archive.find('div', {"id": "posts", "class": "posts"}):
for plink in post.findAllNext("span", {"class": "permalink"}):
clanak = fetchURL(plink.next["href"])
title = clanak.find("h4", {"class": "posttitle"}).next
datum = clanak.find("h3", {"class": "date"}).next
text = clanak.find("div", {"class": "posttext"}).next
Fali dio koji izvlači podatke iz baze i preko GData python clienta posta na blogger/blogspot.