Jump to content
GarryOne

Cum sa downloadezi toate cartile, deodata, de pe it-ebooks.info

Recommended Posts

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.


<?php
set_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 by GarryOne
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

@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 by GarryOne
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...