Fórum Ubuntu CZ/SK

Ostatní => Tipy a triky pro Linux => Téma založeno: Kamil Hanus 16 Července 2012, 17:39:00

Název: Stahování z czshare pomocí terminálu
Přispěvatel: Kamil Hanus 16 Července 2012, 17:39:00
Ahoj,
protože jsem nenašel (třeba jsem hledal špatně :) ) funkční terminálový program pro stahování z czshare.com a instalovat na RaspberryPi javu, pokud by to šlo, by byla sebevražda, napsal jsem tento program. Původně měl být minimalistický, ale jak narůstali požadavky, kód se lepil a rostl. V další verzi ho snad pročistím na potřebné minimum.

Je potřeba mít nainstalovaný python, což má v Ubuntu snad každý. Dále python-mechanize a blessings modul, který je přibalen. Určitě by se našel nějaký uber-coder, který by to napsal pouze pomocí wgetu, ale to já nejsem  ;)

Stahovat můžete z githubu https://github.com/arthurwozniak/CzGet
PS: Je to můj první commit, takže se s tím ještě učím
Název: Re:Stahování z czshare pomocí terminálu
Přispěvatel: starenka 23 Července 2012, 01:35:24
neber to nejak ve zlym, ale mam par poznamek:

- zavislosti bejva dobry psat do souboru requirements, takze si je pak muze clovek nainstlaovat do virtualenvu najednou "pip install -r requirements.pip"
- cywe to je hodne c style zapis a totalni kopypasta - krvaci mi z toho srdce, kdyz vidim takle psat python. Par z miliona prikladu
Kód: [Vybrat]
> x=0
> for i in self.content:
>     self.content[x]=re.sub("\n","",i)
>     x+=1

se da prepsat na:

> for i in enumerate(self.content):
>    self.content[x]=re.sub("\n","",i)

nicmene jesli chapu dobre, ze to ma nahradit \n za nic, tak elegantnejc:

> map(lambda x: x.replace('\n',''), self.content)
nebo
> [one.replace('\n','') for one in self.content]

zbytecne ne == ckovat:
> if os.path.isfile(filename)==True:
je stejny jako
> if os.path.isfile(filename)
- obecne bych se vyhnul printum, zkus pouzit logging modul. Hlasy si pak muzes sypat na stdout nebo kamkoliv jinam
- pokud nutne nepotrebujes neco strasne speci, doporucuju misto mechanize pouzit https://github.com/kennethreitz/requests a https://github.com/kennethreitz/clint je na terminal taky super. nez se morit s regularama na hledani veci ve strankach, pouzi pyquery. na takovyto domaci scrapovani klidne i muj smirgl https://github.com/starenka/emery

tak at se dari, drzim palce
Název: Re:Stahování z czshare pomocí terminálu
Přispěvatel: Kamil Hanus 23 Července 2012, 21:49:03
Upřímně, doufal jsem v nějakou tvou kritiku  :) Doufám že do konce týdne si udělám víc času abych se na to mohl pořádně mrknout. Každopádně nevím jestli je to přímo zápisem kódu nebo (ne)rychlostí Raspberry, ale než odpoví parser, že chybí nějaké argumenty, trvá to i pár sekund. To je podle mě strašně moc.

- o pipu jsem neměl vůbec ponětí, díky ;)
- nebude použití enumerate v podstatě to samý a řádky se stejně neušetří? Co se na to dívám, tak bych stejně musel počítat pozici v seznamu. Ta lambda vypadá dobře, ale doteď jsem byl líný o ní něco hledat. Jinak kopypasta to není, na psaní prasáckejch kódů mám talent
- vyzkouším
- rád bych mechanize a podobné moduly vynechal úplně a napsal nějaký lightweight modul, aby se urllib neimportovalo dvakrát. Asi hodně utopická myšlenka s mým skillem
Název: Re:Stahování z czshare pomocí terminálu
Přispěvatel: starenka 23 Července 2012, 21:58:08
- pipina je super - staci si udelat balik (tj de fakto jen setup.py) a muzes instaloval primo z http://pypi.python.org/pypi nebo odkudkoliv odjinud (klasicky github)
- no enumerate ti ulevi od toho si delat pred cyklem counter a jeho inkrementace v nem, nehlede na to, ze je to build-in.
ja sem se tam upsal - psal sem to po pameti, spravne to ma bejt takle a z toho uz ti to asi bude jasnejsi:
Kód: [Vybrat]
In [3]: for i,one in enumerate(range(10,20)): print i, one
0 10
1 11
2 12
3 13
4 14
5 15
6 16
7 17
8 18
9 19
- lambda (anonymni funkce) je fajn, ale nesmi se to s ni prehanet
- kopypasta - tim myslim, ze nejakej kode sem tam videl minimalne 2x stejnej
- ad logging: je to strasne mocny, nehlede na to, ze si muzes napsat vlastni handlery a soupat si to kamkoliv. super je treba kombinace raven+sentry. Onehda sem trosku pomahal s log4mongo https://github.com/starenka/log4mongo-python
- ad mechanize: no, pokud ti muzu radit, tak pokud chces zustat dusevne zdravej, urlib se vyhni. je to docela monstrum, timeouty musis clovek resit socketama, gzip, hlavicky, cookies taky nic moc atd... trosku zbytecne lowlevel a bordel. requests je luxusni knihovna s minimem zavislosti (tusim, ze snad jen simplejson). na pipine a githubu jsou ziliony projektu, nema cenu vynalejzat kolo a psat si to sam (imo)

tak at ti to slape, drzim palce

ps. ad rychlost, zkus to vzit gzipem (poslat hlavicku, ze umis gzip, mohlo by to pomoct), na takle malejch strankach asi nebude mezi knihovnama znatelnej rozdil v parsovani....
pps. mozna by si moh brat prihlasovaci udaje z klasickyho ~/.netrc - takle specifikovany pres lajnu pak visi v historii shellu a to neni asi uplne nejlepsi...
Název: Re:Stahování z czshare pomocí terminálu
Přispěvatel: Kamil Hanus 12 Srpna 2012, 20:45:40
Chvíli to trvalo (nebyl čas), ale dostal jsem se k updatnutí. Kód sice ještě není úplně košér, ale myslím si, že se docela zjednodušil. V další verzi doufám rozchodím dokončení rozstahovaného souboru a printy nahradím loggerem. Kód je stále na githubu.
Název: Re:Stahování z czshare pomocí terminálu
Přispěvatel: starenka 13 Srpna 2012, 08:18:25
na konfigurak bych pouizil http://docs.python.org/library/configparser.html  a nebo treba json 8) btw base64 neni zadny sifrovani, je to jen kodovani, ktery neni problem vratit zpet (koukni do jakyhokoliv mailu s prilohou). Uz se to zacina rysovat a je videt, ze te to asi docela bavi. Supr.
Název: Re:Stahování z czshare pomocí terminálu
Přispěvatel: Kamil Hanus 13 Srpna 2012, 14:50:20
Base64 jsem bral jen jako featurku, kdyby byl sdílený účet s někým jiným. Chápu, že to jde hnedka dát zpátky. Původně jsem odstraňoval poslední znak - měl jsem nějak zažitý, že tam je rovnítko. Nakonec jsem to nechal tak, jak je to teďka, ale snad nějak vymyslím lepší ukládání hesla.
Název: Re:Stahování z czshare pomocí terminálu
Přispěvatel: Kamil Hanus 30 Srpna 2012, 20:01:56
Dostal jsem se k nějakým menším změnám - https://github.com/arthurwozniak/CzGet Každopádně s narůstajícím kódem se to pěkně svi*í, takže asi bude lepší udělat rozsáhlejší revizi kódu.
Název: Re:Stahování z czshare pomocí terminálu
Přispěvatel: František Zatloukal 30 Srpna 2012, 22:21:42
Btw, kdybys náhodou neměl co na práci, zkus udělat uploader ;)
Jinak gj, jen tak dál.