Stahování pomocí wget
Program '''wget''' slouží ke stahování souborů prostřednictvím HTTP(S) nebo FTP(S) protokolu. Prakticky řečeno, z webu.
Základní použití:
'''wget URL1 URL2'''
Příklady:
- ''wget http://adasek.cz/tmp/wget_test.zip''
- ''wget http://adasek.cz/''
- ''wget http://adasek.cz/world.png''
-O ''filename''
- '''--output-document''' - tj po stažení se stažený soubor přejmenuje (uloží na zadané místo).
- Praktické například v případě že soubor sídlí na nehezké adrese:
- ''wget -O something.zip http://example.com/dynamicpage?get=something.zip''
- Nebo chcete specifikovat absolutní cestu pro uložení:
- ''wget -O /tmp/world.png http://adasek.cz/world.png''
-o ''filename''
- '''--output-file''' - defaultně jde na standardní výstup.
- Pokud nechcete vidět výstup programu:
- ''wget -o /dev/null http://adasek.cz/world.png''
- Pokud chcete do výstupu ''přidávat''(append) a ne jej přepsat (jako dělá ''>>''), použijte místo -o parametr '''-a'''.
- '''Z očividných důvodů se -o a -O krapet pletou.''' Můžete používat i dlouhé varianty:
- ''wget --output-file=~/obrazek.png --output-document=/dev/null http://adasek.cz/world.png''
-i ''file''
- Stáhne všechny soubory zadané jako adresy v souboru ''file''. Adresy v souboru musí být odděleny řádkami.
- Pokud je ale ''file'' html soubor, wget to pozná a stahne všechny odkazy které v daném html dokumentu najde.
- Pokud v tom html souboru máte relativní adresy (<a href="obr.png"> místo <a href="http://example.com/obr.png">, wget samozřejmě neví, kde je kořen onoho webu a selže. Lze mu specifikovat parametr ''--base=URL''
- ''wget -i webova_stranka.htm --base=http://example.com/''
Rekurzivní stahování
Parametrem '''-r''' : tady to začíná být zajímavé. Wget na základě zadaného parametru ''-l #číslo'' určí hloubku rekurze - kolik úrovní stahnout.
- ''wget -r -l2 http://adasek.cz/linux2012/'' - Stáhne úvodní stránku webu adasek.cz a všechny stránky z této stránky odkazované
- ''wget -r -l3 http://adasek.cz/linux2012/'' - Stáhne úvodní stránku webu(úroveň 1), všechny stránky z této stránky odkazované(úroveň 2) a všechny stránky odkazované ze stránek úrovně 2 (tedy úroveň 3).
Pomocné parametry k rekurzi:
- '''-np''' : --no-parent : Nestoupej nahoru v adresářové struktuře webu.
- ''wget -r -l3 -np http://adasek.cz/linux2012/''
- '''-H''' : --span-hosts : můžeš při rekurzi přeskakovat i na jiné domény. (Tj, pokud mám na stahovaném webu odkaz na google.com, po zadání tohoto parametru se stahne i úvodní stránka google (a případně další stránky, dokud level rekurze dovolí))
- '''-D example.com,example.cz''' : použít v kombinaci s předchozím, zadává seznam domén, ze kterých lze stahovat.
- '''-nd''' : --no-directories : nevytvářej u stažených souborů adresářovou strukturu.
- '''-k''' : --convert-links : ve stažených stránkách změň odkazy na lokální. Pokud rekurzivně stahujete web pro lokální prohlížení, '''tento parametr chcete'''.
- '''-p''' : --page-requisites : U html stránek stáhni všechny potřebné věci k prohlížení (CSS styly, javascript, obrázky připojené pomocí css (?))
- '''-A png,jpg,htm''' : --accept : stahuj pouze soubory s těmito koncovkami.
- '''-R zip,rar''' : --reject : nestahuj soubory s těmito koncovkami
Další zajimavé parametry:
- '''--limit-rate=20k''' - omezí rychlost stahování na 20KB/s
- '''-w 5''' - mezi jednotlivými stahováními vždy 5 sekund počká
- '''-random-wait''' - Počká mezi jednotlivými stahováními náhodnou dobu - tj. je těžší identifikovat automatizované stahování analýzou logů web serveru.
- '''--referer=URL''' - nastaví hlavičku "referer" na zadanou URL. Tj., vypadá to, jako že jste na právě stahovanou přišli z URL.
- '''--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"''' - začne se tvářit jako FF19 na 64bit Windows. Více na http://whatsmyuseragent.com/ a google "list of user agents"
ÚLOHY
1: Stažení všech souborů ze seznamu
Spolupracovník vám poslal na hromadu testovacích souborů pro váš super program.
Bohužel je nezazipoval. Chcete je všechny (a stokrát kliknout se vám nechce).
- Adresa: http://adasek.cz/wget_test/
''Poznámka:'' Tomuhle se říká ''Directory list'', vytváří jej automaticky Apache, pokud to má nastavené. Nastavíte prostřednictvím ''Options +Indexes'' v souboru ''.htaccess'' v dané složce (nebo nadsložce).
2a: Webcomics
Můj oblíbený comics OOTS - http://www.giantitp.com/comics/oots0001.html měl od dílu 1 do dílu 337 svoje díly na krásných adresách:
- http://www.giantitp.com/comics/images/oots0001.gif
- http://www.giantitp.com/comics/images/oots0002.gif
- ...
- http://www.giantitp.com/comics/images/oots0337.gif
Stahněte mi je!
2b: Webcomics
Postupně se však spousta ''poťouchlých vykuků'' naučila se shellem a tak následující díly mají adresy jako:
- http://www.giantitp.com/comics/images/J8H9YXfp8E16FMlhQ1u.gif
- http://www.giantitp.com/comics/images/MlgCTweNswGC5IdU7BI.gif
- ...
- http://www.giantitp.com/comics/images/PERPsdfi30dfiwe882.gif
Stále však jsou tyto obrázky linkovány z html stránky s dobrým názvem:
- http://www.giantitp.com/comics/oots0338.html
- ...
- http://www.giantitp.com/comics/oots0883.html
Proto by neměl být problém stáhnout i ty další. Když už v tom budete
- '''přejmenujte stažené obrázky na ten rozumný formát'''
- '''zbavte se html stránek'''
Tedy, po těchto dvou úlohách byste mi měli ukázat adresář plný souborů oots0001.gif, oots0002.gif, ..., oots0883.gif
2c:
No jo - ale co nové díly?
Vytvořte script, který bude volán CRONem jednou denně, a který do onoho adresáře stahne případné díly které přibyly.
'''Nápověda:'''
- Využijte faktu, že pokud wget narazí na stránku 404, jeho návratový kód je neúspěch. To se dá testovat pomocí ''if''.
- Zamyslete se nad tím, kolik toho váš každodenní script bude stahovat. Pokud pokaždé znovu stáhnete všechny soubory, vaše implementace není správná. (V praxi za pár dnů příjdou admini a zatnou vám tipec).
3: Garfield
Kdo by neměl rád oranžového kocoura?
Vyrobte script který stahne všechny díly od prvního ( 25. 6. 1978) do toho posledního.
- Z analýzy http provozu (fuj flashové rozhraní na oficiálních stránkách) jste zjistili, že stripy se nachází na:
- http://picayune.uclick.com/comics/ga/2013/ga130408.gif
Tedy adresa obrázku je formátu:
- http://picayune.uclick.com/comics/ga/RRRR/gaRRMMDD.gif
Vaším úkolem je tedy jít po dnech od 780625 až do 130409, vygenerovat adresy, a stahnout. Nebo stahovat průběžně, jak je libo.
Poznámka: Adresář ve kterém je těch cca 15000 obrázků se chová ve většině filesystémů ''zábavně''.
- Opravdu data rozumným způsobem generujte! Už tak ten server postupně spamujete desítkou tisíc požadavků. 13. měsíc neexistuje :)
- Detekujte případné errory 404, dotyčný .gif soubor nevytvářejte, a případně potom vypište.
- Testujte pouze na nějakém úzkém rozsahu dat.
V poslední úloze budeme potřebovat poznat další parametry wgetu:
- --post-data=''string'' : Předá stránce nějaká post data (například login a heslo)
- --save-cookies ''file'' : Uloží cookies které stahovaná stránka poslala do souboru ''file''.
- --keep-session-cookies : Uloží i session cookies. V úloze podobné této to chcete.
- --load-cookies ''file'' : Nahraje cookies ze souboru
Zadání:
Máte uživatelský účet na stránkách (například fóru). K obsahu fóra se dostanete až po zalogování.
Přihlašování je realizováno pomocí post dat z formuláře (jukněte na html) - stránka která je uvedena jako action= formuláře dostane metodou post data z formuláře a '''vytvoří cookies'''.
Cookie vás pak identifikuje celou dobu co jste přihlášeni.
- Adresa: http://adasek.cz/private.php
- Login: test
- Heslo: heslo
Stahněte vše co tam je!
- Když se juknete do souboru s cookies, snadno poznáte, že se heslo ukládá nešifrovaně. To není bezpečné - většinou se heslo ''zahashuje'' (jednosměrně zakóduje) - aby se po nespolehlivém http předávalo nešifrovaně pouze jednou (po vyplnění formuláře v post). Ze strany wgetu a této úlohy je nám to ale šumák.
- Jinak je ale '''přihlašování prostřednictvím cookies''' to, co se v praxi skutečně používá. Občas narazíte na problémy jako více přesměrování (řešení=analýza http provozu), paranoidní ověřování všeho možného (refererem počínaje, session cookies konče), ale principialně lze chytrým scriptem plně simulovat přítomnost živého člověka na stránce.
- Problémy překonatelné hůře: javascript (analýza html provozu a případně i toho js scriptu pomáhá), captcha, zabezpečení něčeho přímo ze strany serveru (např. ''nepošlu téhle ip adrese více jak 10 článků za den'')