GarryOne Posted June 2, 2013 Report Posted June 2, 2013 (edited) Citind postul acesta, am vazut site-ul it-ebooks.info. Am intrat pe el, sa vad ce reprezinta. Am vazut la url, ca link-urile sunt de forma /book/10/, book/282/, etc. Am verificat asa, sa vad cate carti sunt, am descoperit ca sunt 2298 la momentul actual. Gandindu-ma ca fac colectie de ebook-uri pe hdd-ul meu, mi-a suras ideea de a avea toata baza de date a acestui site. Logic ca nu aveam de gand sa descarc cele ~2000 de carti manual, asa ca n-am stat mult pe ganduri si am dechis notepad++ si m-am apucat sa fac un script php care descarca automat toate cartile de pe acest site. Nu dupa mult timp, scriptul era gata. Mare e cURL.Scriptul functioneaza in felul urmator: ia denumirea ebook-ului dintre tagurile <title> si </title> si link-ul de download, din sursa si copiaza aceste fisiere in folderul "books". Tinand cont ca este vorba de un numar foarte mare de carti, scriptul poate fi oprit, iar data viitoare cand va fi pornit, va continua de unde a ramas.<?phpset_time_limit(0);ini_set('memory_limit', '-1');if(function_exists("curl_init") == false) die("cURL is disabled.");$dir = "books/";$link = 1;$bad_attempts = 3;for($i=1; $bad_attempts > 0; $i++) { $url = 'http://it-ebooks.info/book/'.$i.'/'; $data = file_get_contents($url); $link = GetBetween($data, '<a id="dl" href="', '" rel="nofollow"'); if($link == false) { $bad_attempts--; continue; } $download_url = 'http://it-ebooks.info/' . $link; $filename = str_replace(' - Free Download eBook - pdf', '.pdf', GetBetween($data, '<title>', '</title>')); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $download_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); $fp = fopen($dir.$filename, "w+"); fputs($fp, $output); fclose($fp);}function GetBetween($content,$start,$end){ $r = explode($start, $content); if (isset($r[1])){ $r = explode($end, $r[1]); return $r[0]; } return false;}?> Edited June 3, 2013 by GarryOne Quote
M2G Posted June 2, 2013 Report Posted June 2, 2013 Bravo insa nu-mi place ca $until e o constanta.Seteaza-ti un interval mai mare, sa zicem 100 000 si faci ecel for pana la acea valoare.La fiecare iteratie verifici daca ai o carte pe pagina. Sa zicem ca verifici daca $filename contine ceva. Daca nu contine iesi din bucla. Mai simplu faci asta cu un while si conditia de stop sa fie gasirea unui anumit element pe pagina.Astfel o sa poti sa downloadezi cand ai chef fara sa modifici scriptul manual si sa cauti de fiecare data care e numarul maxim din acel URL.Un dezavantaj aici ar fi ca daca se intampla ceva si numerele nu sunt consecutive, o sa crape. Nu o sa mearga pana la sfarsit. Daca toate sunt consecutive si nu exista o discontinuitate, e mai bine asa. Nu mai trebuie intretinut codul.Ar fi util sa faci si o verificare pe hdd sa vezi daca ai deja acel fisier, in cazul in care se adauga carti noi sa le scoti doar pe acelea si cu cele vechi sa nu mai ai treaba. Quote
GarryOne Posted June 2, 2013 Author Report Posted June 2, 2013 (edited) @M2G, referitor la ultima parte, cu suprascrierea fisierelor, linia "$fp = fopen($dir.$filename, "w+");", mai exact "w+" inseamna: Daca nu exista fisierul, creeaza-l, deci nu e problema cu asta. Cat despre $until, e o idee buna, am sa revin cu v2.0 EDIT: E gata, am facut update. Edited June 2, 2013 by GarryOne Quote
jlulz Posted June 3, 2013 Report Posted June 3, 2013 The script stopped at 105 books. Not working anymore. Ask for debug if need it.It would be nice for some regex to remove "Free download..." from title. Quote
GarryOne Posted June 3, 2013 Author Report Posted June 3, 2013 The script stopped at 105 books. Not working anymore. Ask for debug if need it.It would be nice for some regex to remove "Free download..." from title.I fixed the both bugs. I updated the code. Quote
jlulz Posted June 3, 2013 Report Posted June 3, 2013 Same thing, download stops at exactly 105 books.The script downloaded all the books for you? can you uploaded them somewhere? Or make a list ( type : "tree /f dir >list.txt" in powershell) for us to choose. Quote
M2G Posted June 3, 2013 Report Posted June 3, 2013 Se opreste la 105 pentru ca linkul cu 106 este invalid. De asta ti-am zis ca o sa crape daca acele numere nu au continuitate.EN: The script iterates over a link and it assumes it has come to finish when a 404 error ocurs. Since there is no IT eBooks - Free Download - Big Library, it stops at 105 assuming it's finished. Fix: Pune o conditie ca daca urmatoarele sa zicem 5-10 linkuri vizitate din acel range sunt 404, atunci sa se opreasca. Altfel sa mearga mai departe cu urmatorul increment si sa descarce. Quote
GarryOne Posted June 3, 2013 Author Report Posted June 3, 2013 Se opreste la 105 pentru ca linkul cu 106 este invalid. De asta ti-am zis ca o sa crape daca acele numere nu au continuitate.EN: The script iterates over a link and it assumes it has come to finish when a 404 error ocurs. Since there is no IT eBooks - Free Download - Big Library, it stops at 105 assuming it's finished. Fix: Pune o conditie ca daca urmatoarele sa zicem 5-10 linkuri vizitate din acel range sunt 404, atunci sa se opreasca. Altfel sa mearga mai departe cu urmatorul increment si sa descarce.Done. Quote
M2G Posted June 3, 2013 Report Posted June 3, 2013 Aprope bine.Pune un reset la $bad_attempts dupa acel if. In varianta ta, se opreste daca gaseste 3 linkuri invalide pe tot range-ul. Deci e posibil sa se opreasca mai repede decat maximul de carti.Ce vrei sa faci este sa verifici daca alea 3 linkuri gresite sunt consecutive. Asta mai elimina din posibilele probleme de necontinuitate a acelui index.pune un $bad_attempts = 3; dupa fclose sau oriunde dupa acel if si cam aia e. Quote
razvandragos29 Posted March 17, 2014 Report Posted March 17, 2014 Cum asi putea sa folosesc si eu scriptu ? Quote
GarryOne Posted March 18, 2014 Author Report Posted March 18, 2014 Cum asi putea sa folosesc si eu scriptu ?Copiezi codul ce l-am postat intr-un fisier cu extensia php (ex: test.php) si il pui pe un server cu apache. Sau cauti un free webhost pe net si pui acolo fisierul, sau instalezi pe localhost xampp/wampp. Quote