Jump to content
GarryOne

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

Recommended Posts

Posted (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.


<?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
Posted

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.

Posted (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 by GarryOne
Posted
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.

Posted

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.

Posted

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.

Posted
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.

Posted

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.

Posted
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.

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...