HTML

Show me the Data!

Adatelemzős, bányászos hobbiprojektjeim történetei

Címkék

Archívum

Adatok vizsgálata 1. - Felezési idő

2014.02.19. 01:37 sdani

A felezési idő (half life) helyett gyakran a bomlási állandót 
használjuk, aminek jele a görög lambda.

 

Ez most csak egy nagyon primkó kis teszt lesz. Arra voltam kíváncsi, hogy mennyi lehet a zenei torrentek féléletideje: az az idő, ami ahhoz kell, hogy átlagban a torrentek felét töröljék a tracker-ről. Hogy lehet ezt meghatározni? Egyrészt, ha figyeljük a torrenteket, és gondosan feljegyezzük, hogy mennyi idő telt el a feltöltés és a törlés között sok torrent esetén, majd átlagoljuk az életidőket; vagy megnézünk nagyon sok torrentet két különböző időpillanatban, és megnézzük, hogy mennyit töröltek közben. (van még egy másik mód is, de azt majd legközelebb! :) Mint azt az előző posztban írtam, a letöltést azzal kezdtem, hogy a leszedtem egy azonosító listát a zenei torrentekről, majd 5 nappal később végigmentem minden azonosítón és letöltöttem a szükséges adatokat. A letöltés során azt tapasztaltam, hogy nagyon sok lekérdezés során 4o4-es hibát dobott a tracker, ami azt jelenti, hogy az eltelt 5 nap alatt letörölték. Ez nagyon ritkán fordult elő, kb. csupán minden 15o. torrent esetén (összesen 519). Tehát van egy nagy elemszámú halmazunk, és tudjuk, hogy 5 nap alatt o.7%-ot törölnek.

Na, nézzük, mit ír a wikipédia ide vonatkozó cikke. Szóval van egy kezdeti elemszámunk (N0=73833), majd t=5 nappal később, az új elemszám (Nt=73314). A felezési idő képlete szerint:

halflife.pngAhol N0 a kiindulási elemszám, Nt az elemszám t idő múlva, és t1/2 a felezési idő. A képletet átrendezve kifejezhetjük a felezési időt:

halflife_2.pngEbbe behelyettesítve a felezési időnek kijön 491 nap. Nem is rossz! Szerintem ez igazán szép érték, ez azt jelenti, hogy ennyi idő alatt a feltöltött torrentek felét letörlik. A felezési időből kiszámolható a bomlási konstans (λ), és az átlagos életidő (τ):

decay constant.pngAz egyenlet átrendezésével azt kapjuk, hogy a zenei torrentek átlagos életideje kb 700 nap. Felmerülhet a kérdés: vajon ez azt jelenti, hogyha látok egy jó torrentet, akkor ráérek 2 évig a letöltéssel? NEM! Előfordulhat (kiszámítható valószínűséggel), hogy a torrent néhány hónap múlva már halott lesz! Persze az is, hogy akár több éven keresztül is akadnak seederek. Ez az érték egy átlagos életidőt jelent, ami egy sokaság vizsgálatával lett meghatározva.

Szóval ennyit a féléletidőről egyelőre. Legközelebb innen folytatjuk! 

(az egyenleteket a Daum equation editorral készítettem) 

Szólj hozzá!

Második lépés: az adatbázis felépítése

2014.02.18. 07:23 sdani

A múltkor letöltött adatokat egy cvs file-ba mentettük, és most egy MySQL adatbázist fogunk belőlük építeni. (Ezt megelőzően a szervert telepíteni kell, létre kell hozni egy felhasználót és egy adatbázist, amit most nem részletezek inkább.) Az adatokat két táblába fogjuk szétosztani: az egyikben lesznek az általános adatok, a másikban a tag-ek. Ezt az indokolja, hogy minden torrentet egy-egy adat jellemez az ID, a név, a seederek, leecherek és letöletések számában, kivéve a tag-ek, amikből lehet több is. A másik táblában lesznek így a tag-ek. A két tábla között a torrent azonosítók jelentik majd a kapcsolatot. A csv file egy részlete így néz ki:

1
2
3
4
5
6
1488237,Solarstone_-_A_State_of_Trance_Episode_650_(Almaty)_31-01-2014-MiXXedUP,16,0,2014-02-10,21:09:54,44,MP3,EN,Trance
1488233,Monika_Kruse_at_Voodooamt_-_Highway_Number_4_(TERM020)-EP-2002-TR,10,0,2014-02-10,21:07:15,23,MP3,EN,techno
1488232,Kabarématiné_2014.02.08-09.,192,0,2014-02-10,21:06:58,439,MP3,HU,comedy_kabar%C3%A9
1488231,Kayser_-_Read_Your_Enemy,14,0,2014-02-10,21:02:16,27,MP3,EN,groove_thrash_metal
1488230,The_Advent_-_Standers_(CCCB10)-Vinyl-1996-gEm,10,0,2014-02-10,20:58:26,20,MP3,EN,techno
1488226,Dave_the_Drummer_Vs_Glazby_-_Oh_Yeah-(YOLK014)-Vinyl-2005-NRG,7,0,2014-02-10,20:50:24,14,MP3,EN,techno

 

Az már látszik, hogy a tag-ekkel nagyon sok bajom lesz... úgy tűnik, hogy a teg-ek nem definiáltak, heterogének, sokszor hiányosak, és azt hiszem, a torzítás elkerülése miatt valahogy ezen segíteni kell. Most egyelőre nem érdekel a dolog. Felépítem az adatbázist, és majd visszatérek a kérdésre. (Ahogy ezeket a mondatokat írtam eszembe jutott, hogy a nemzetközi előadók esetén lehetséges a wikipedia adatai alapján kitölteni a hiányzó tag információkat... a magyarral is lehet próbálkozni, de a magyar wiki nem túl megbízható... de vannak ötleteim! ;-)

Szóval a feltöltő script-ben csatlakozunk az adatbázis motorhoz és megnyitjuk a 'torrent' adatbázist, miközben elvégezzük a szükséges autentikációt:

1
2
3
4
5
6
# Open database - the database handler definied as follows:
my $dbh = DBI->connect(
    'dbi:mysql:torrent',    # mysql database, database name
    'username',             # username
    'passwd',               # passwd
)|| die "Could not connect to database: torrent";

 

Majd  létrehozzuk a táblázatokat, ha esetleg nem léteznének eddig. Ezek a loop-ok nyilván csak legelső esetben fognak lefutni. 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
my $DataTable = "TorrentData"; # Table that stores torrent data
my $TagTable  = "Tags";        # Table that stores tags

# Creating the table, if it is not existing.
my $SQL = $dbh -> prepare ("CREATE TABLE IF NOT EXISTS $DataTable (
    ID          SMALLINT,
    Name        TEXT,
    Seeders     SAMLLINT,
    Leechers    SMALLINT,
    U_Time      TIME,
    U_Date      DATE,
    Downloaded  SMALLINT,
    Nationality TEXT,
    Format      SMALLINT
)");
$SQL->execute();

$SQL = $dbh -> prepare ("CREATE TABLE IF NOT EXISTS $TagTable (
   ID     SMALLINT,
   Tag    TEXT,
)");
$SQL->execute();

 

A következő kis kódrészlet azt mutatja, hogy csv file egy sorát hogyan bontjuk daraborka, majd építünk egy hash-t, amit aztán az adatbátis építő függvénynek adunk (Előtte persze ki kell törölni a torrentek neveiből azokat a karaktereket, amiket a mysql esetleg parancsként értelmez pl. ',",/ stb.):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$_ =~ s/\s//g;
my @line = split(/,/,$_);

# Now let's build a hash with the data, tag data is separated!!
my %hash = (
    "ID"         => $line[0],
    "Name"       => $line[1],
    "Seeders"    => $line[2],
    "Leechers"   => $line[3],
    "U_Date"     => $line[4],
    "U_time"     => $line[5],
    "Downloads"  => $line[6],
    "Format"     => $line[7],
    "Nationality"=> $line[8]
);

# Treat tags separately:
my @tags = split("_", $line[9]);

&buildDB(\%hash, \@tags);    

 

Majd soronként szépen végigmegyünk a csv file tartalmán, és feltöltjük az adatbázist. Ügyelünk arra, hogy csak azokat a rekordokat töltse bele, amik még nincsenek az adatbázisban. Ezt az Torrent ID-k lekérdezésével ellenőrizzük. Ez ismét azt a célt szolgálja, hogy a feltöltést valamilyen hiba esetén folytatni tudjuk, illetve elejét veszi annak a hibának, amit az okoz, hogy lehetséges, hogy egy torrent adata kétszer is szerepel a listán. Ez abból adódik, hogy a torrent azonosítókat oldalanként szedtük össze, és folyamat során változhat az adatbázis szerkezete, ami azt okozza, hogy egy-egy torrenttel elcsúszik az egy oldalra kerülő torrentek listája. Remélem kellőképpen bonyorult volt a magyarázat. :D Ez nyilvánvalóvá akkor válik, ha az ember tényleg végiggondolja, hogy mit csinál a bejáró algoritmus. Jézusom... ezzel a folyamatos ellenőrzéssel a feltöltés átkozottul lassú... nem baj, minőségi munkát végzünk :-) Az a baj, hogy a listában előre haladva egyre több és több elemmel kell összevetni a beillesztendő azonosítót, hogy elkerüljük a duplikációt... És ami a legrosszabb, hogy eddig (kb. 5oooo) még nem volt egy duplikáció sem. Nem baj, legalább a rendszer bővíthető marad!! :D

Így néz ki az a függvény, ami ellenőrzi, hogy az adott elem benne van-e az adatbázisban vagy sem:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Small loop to test if a given record is already in the database or not.
sub ExistsOrNot {
    my $DataBase   = $_[0]; # Name of the datebase
    my $ID         = $_[1]; # Identifier of the given record
    my $Table      = $_[2]; # Table to look at.
    my $flag       = "0";   # 0 if does not exist 1 if exists
    
    # Test if the ID is already in the database or not.
    my $record = $DataBase->prepare(qq{SELECT COUNT(1) FROM $Table WHERE ID='$ID'});
    $record -> execute();
    
    if ($record->fetch()->[0]) {
        $flag = "1";
    }
    return $flag;
}

 

Abban az esetben, ha a függvény visszatérési érétéke 0, azaz az adott azonosítóval még nem szerepel record, akkor azt a következő parancs alapján megteszi:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# if the record is not already inserted in the table, inserted into the corresponding columns.
my $sql_statement =
"INSERT INTO $DataTable (
   ID,
   Name,
   Seeders,
   Leechers,
   U_Date,
   U_time,
   Downloaded,
   Format,
   Nationality
)
VALUES (
   \'$data{ID}\',
   \'$data{Name}\',
   \'$data{Seeders}\',
   \'$data{Leechers}\',
   \'$data{U_Date}\',
   \'$data{U_time}\',
   \'$data{Downloads}\',
   \'$data{Format}\',
   \'$data{Nationality}\'
)";

# Executing the sql statement.
my $ssth = $dbh->prepare($sql_statement);
$ssth->execute();

# Inserting Tag data into the database
foreach my $tag (@tags){
    $sql_statement =
    "INSERT INTO $TagTable (
        ID,
        Tag
    )
    VALUES (
       \'$data{ID}\',
       \'$tag'\
    )";
       
    # Executing the sql statement.
    my $ssth = $dbh->prepare($sql_statement);
    $ssth->execute();
}

 

Miután a program lefutott nyithatunk egy mysql  terminált és ellenőrizhetjük az adatbáztist. A lekérdezés alapján van 73833 torrent, amihez 3544 féle tag megjelölést használtak 118896 esetben (pl. 'vokális trance' és 'viking black folk metal', sőt olyan is van, ahol a vikinget w-vel írta valami nagyokos feltöltő!!! :D). Ez nekem még nagyon sok fejtörést fog okozni, én érzem...

Szóval az adatelemzés előtti utolsó nagy probléma is elhárult! Hamarosan már tényleg belecsapunk a lovak közé!

Szólj hozzá!

Címkék: torrent perl mysql project 1

Az adatgyűjtés sikeresen befejeződött!

2014.02.17. 00:57 sdani

Sikeresen letöltöttem az összes zenei torrenthez tartozó adatot! Szerencsére nem dobtak ki az oldalról, továbbra is be tudok jelentkezni, amiért nagyon hálás vagyok. A letöltött adatfile 75 ezer sora alig 7MB, szóval a legnagyobb jóindulattal sem mondható big-data-nak :D de azért jól el lehet majd játszogatni vele. 

A MySQL adatbázist felépítő scriptek már készülnek, a hét elején jön a következő bejegyzés. Majd érdekesebbnél érdekesebb információk tömegeit fogjuk megtudni a magyar torrentezők zenei ízléséről.

Szólj hozzá!

Címkék: project 1

Első lépés: az adatok letöltése 2. rész

2014.02.16. 07:20 sdani

Szóval ott hagytuk abba, hogy van egy irgalmatlan hosszú listánk azon zenei torrentek azonosítóival, amiket regisztrálásuk óta folyamatosan életben tartanak. Mit jelent ez? Ha egy torrentet kellő ideig nem seedel senki, akkor úgy veszik, hogy az a torrent "halott" azaz nem lehet többé letölteni, és ezért törlik a tracker-ről. Minél régebbi egy torrent annál nagyobb az esélye, hogy már mindenki letöltötte, akinek érdekes volt, így először eltűnnek a leecherek (már többé nem akarja letölteni senki), ekkor a torrent még él, hiszen a több seeder is készültségben áll, hogy az esetleges érdeklődőkkel megosszák, ám idővel a seederek is kiállnak a sorból, és a torrent egyre inkább elhagyatottabb lesz. 

A trackeren lévő torrentek indexe a másfélmilliós értéket közelíti, de élő zenei torrent "csak" 75ooo van. Ezeket kell letölteni. Természetesen most is a wget paracsot használjuk, majd a letöltött html file-ból kimazsolázzuk a szükséges adatokat. Ugye most sem kell autentikálni az oldalletöltéskor, elég a cookie-ra hivatkozni. A torrent adatait letöltő parancs valahogy így néz ki:

1
2
3
4
my $id = "1074238"; 

# Download the file (we are already logged in, login info in 'cookies.txt'):
my $oldal = `wget --load-cookies cookies.txt --post-data=\'action=details&id=$id\' -O - -o /dev/null https://TorrentSite.hu/torrents.php`;


Ok, akkor mit csináljunk eztán? Először nézzük, milyen adatokra is van szükségünk, és az adatot elkapó szabványos kifejezések:

Torrent feltöltésének dátuma és ideje:

1
2
<div class="dt">Feltöltve:</div>
<div class="dd">2014-02-10 20:06:07</div>

 

Torrent neve:


<div class="torrent_reszletek_cim">Crazy_Ducks_-_From_Your_Speakers_To_Gods_Ears-(APRCD003)-2014-BR</div>

 

Seederek és leecherek száma, letöltések száma:

1
2
3
4
5
6
<div class="dt">Seederek:</div>
<div class="dd"><a onclick="peers('peers', '1488202', 1);" title="Peerlista" href="javascript:void(0);">9</a></div>
<div class="dt">Leecherek:</div>
<div class="dd"><a onclick="peers('peers', '1488202', 1);" title="Peerlista" href="javascript:void(0);">0</a></div>
<div class="dt">Letöltve:</div>
<div class="dd">13 alkalommal</div>

 

Torrent típusa és az előadó nemzetisége:

1
<a title="Még több ebből a kategóriából" href="torrents.php?tipus=mp3">MP3/EN</a></div>

 

Tag-ekkel vigyázni kell, mert a néha több is van belőlük, és sajnos az is előfordulhat, hogy egyátalán nincsenek megadva tag-ek. Szóval itt több lehetséges eset van. 

1
2
3
4
5
6
<tr>
   <td style="vertical-align:top;width:110px;">Címkék:
   </td>
   <td>
<a
style="border-bottom:1px dotted white;" href="torrents.php?tags=psychedelic">psychedelic</a>,
<a style="border-bottom:1px dotted white;" href="torrents.php?tags=progressive.trance">progressive.trance</a> </td> </tr>

Mindezeket a következő perl kifejezésekkel lehet összeszedni:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Name of the torrent
$page =~ /torrent_reszletek_cim\"\>(.+)\<\/div\>/

# Number of seeders:
$page =~ /Seederek:\<\/div\>\n.+\">(\d+)\<\/a\>/

# Number of leechers
$page =~ /Leecherek:\<\/div\>\n.+\">(\d+)\<\/a\>/

# Upload date ($1) and time ($2)
$page =~ /ltve\:\<\/div\>\n.+\>(\d+-\d+-\d+) (\d+\:\d+\:\d+)\</

# Number of downloads
$page =~ /\"dd\"\>(\d+) alkalommal\<\/div\>/

# Type of torrent
$page =~ /torrents.php\?tipus\=\S+\"\>(\S+)\/([A-Z]+)\<\/a\>/

# Finding tags (Multiple tags are put into an array)
while ($page =~ /torrents\.php\?tags\=(.+?)\"/g){
    ${$Torrent_Details{"Tags"}}[$i] = $1;
    $i ++;
}

 

Az adatok elmentését én úgy oldottam meg, hogy az egész processzt egy perl modulba szerveztem ki, ami imputként a torrent azonosítót kapja meg, majd a létrehoz egy hash-t, amiben minden adat a default NA-értéket veszi fel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# Returned data with the default values:  
my %Torrent_Details = (
     "Torrent" => "NA",   # Torrent ID
     "TName"   => "NA",   # Name of the torrent,
     "Seeders" => "NA",   # Number of seeders,
     "Leechers"=> "NA",   # Number of leechers,
     "U_Date"  => "NA",   # Date of upload,
     "U_Time"  => "NA",   # Time of upload,
     "Downloads" => "NA", # Number of downloads,
     "Format"  => "NA",   # Format of the file,
     "Nationality" => "NA", # Nationality of the band,
     "Tags"    => ["NA"]  # List of the tags separated by a comma
);

 

Amikor az oldal átvizsgálása történik, akkor ezek a default értékek felülíródnak a valódi adattal. Ez lehetővé teszi, azt, hogyha hiányzik egy-egy adat, attól a visszatéréskor az adatszerkezet használható marad. Fel kellett továbbá készíteni a scriptet arra, hogy esetleg a torrent közben törlődött a trackerről. (kb. 1 hét telt el a torrent azonosítók letöltése óta) Illetve előfordul, hogy a tracker gyors válasza során valahogy üres html oldallal tér vissza... ez nem tudom, hogy miért van. Mindenesetre felkészítettem a scriptet, hogy ebben az esetben a kérést ismételje meg. Ez kb 4-5 ezer letöltésenként egyszer fordul elő. Valószínűleg nem okozna nagy pontatlanságot, de miért ne gondolna erre is az ember? Van még egy apróság: futás közben előfordulhat, hogy valami baj törénik, pl. elmegy a net, leáll a program, kigyullad a kábel a falban. Ilyenkor a program leáll, és később újra kell indítani. Úgy kell a programot megírni, hogy ne kelljen megismételni a már letöltött adatok lekérdezését. Erre egy külön file-ban egy index változót írok ki, ami mutatja, hogy melyik torrent azonosítónál járunk éppen. Amikor a letöltést újra indítjuk, akkor csak az utolsó indexnél kisebb azonosítójú torrenteket tölti le. Ez nagyon hasznos és fontos feature, mivel a letöltendő torrentek száma 7o ezres nagyságrendbe esik.

Tehát, mint említettem, egy külön perl modul kiszedi a szükséges adatokat, majd a hash-sel visszatér. A főprogram ebből egy csv file-t ment el, ahol minden egyes sor egy-egy torrentnek fele meg. A kiírást egy minimális adatrendezéssel kezdjük: a torrentek neve tartalmazhatnak vesszőt, ami a csv file kiolvasását jól tönkre teheti. Ezért a vesszőket lecseréljük kötőjelre, a szóközöket alulvonásra. (Bár a torrentek neveit nem nagyon fogjuk használni, leginkább csak azért mentem el, mert azokban az esetekben, ha hiányzik a tag, akkor lehet, hogy majd manuálisan hozzárendelek a cím alapján... talán, de erre kevés az esély. :) Továbbá a tag-ek egy oszlopba kell, hogy kerüljenek. Azokat nem választhatom el szóközzel! Itt úgy döntöttem, hogy alulvonással választom el, majd a csv kiolvasásakor lesz rájuk gondom. 

A letöltés szépen halad. Valamikor pénteken kezdtem el az egyetemen, és most szombat este van és már olyan 9o-95%-nál járhat a 71 ezer letöltéssel, miközben a torrent index 1.4 millióról 3oo ezerre csökkent. A következő alkalommal a letöltött adatokat fogjuk gyúrni egy kicsit és felépítjük azt a MySQL adatbázist, ami remélhetőleg sok kérdésünkre választ fog adni a magyar torrentezők szokásaival kapcsolatban. 

Keep sharing! ;-D 

Szólj hozzá!

Címkék: zene torrent perl project 1

Első lépés: az adatok letöltése

2014.02.10. 02:31 sdani

Szóval, mielőtt lenne mit elemezni, előszöris le kell tölteni a forrásadatokat a torrent oldalról. Mint említettem az oldal zárt, ezért olyan scriptet kell használni a letöltéshez, ami képes autentikációt kezelni. Én erre a linuxos wget parancsot fogom használni. Tudom, hogy ez egy kicsit meglepő, valószínűleg sokan nem tudják, hogy micsoda potenciál lapul a wget-ben. Habár perl nyelven írom a scriptet, nem fogom az lwp könyvtárat használni, aminek az az oka, hogy az otthoni szerveremen (Dlink DNS-320), amin a programot futtatom, egy nagyon lebutított perl verzió van, amire az istennek sem sikerült ezt a modult felerőszakolnom. Így marad a wget. 

Első lépés: bejelentkezés az oldalra, majd a cookie elmentése. Később e cookie segítségével tudunk hozzáférni az oldal adataihoz. Mint a login oldal forrásából látszik, itt egy egyszerű post-ról van szó: submittelni kell a felhasználói nevet (name=nev) és jelszót (name=pass) valamint jó ötletnek tűnik a csökkentett biztonság bekapcsolása, ami azt eredményezi, hogy nem kell minden alkalommal végrehajtani az autentikációt, amennyiben a cookie jelen van. 

login.png

Ez a html forrásban valahogy így néz ki:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<div id="login">
	<form method="post" action="login.php?honnan=/torrents.php" name="login" onsubmit="return liEllenorzes()">
		<input type="hidden" name="set_lang" value="hu">
		<input type="hidden" name="submitted" value="1">
		<table>
			<tr><td class="login_td">Felhasználónév</td><td><input tabindex=1 class="beviteliMezo" type="text" id="nev" name="nev"
			<tr><td class="login_td">Jelszó</td><td><input tabindex=2 class="beviteliMezo" type="password" name="pass" 
			<tr><td class="login_td">Csökkentett biztonság</td><td><input tabindex=3 name="ne_leptessen_ki" type="checkbox" value="1">
		</table>
	</form>
</div>

A belépés és az autentikáció a következő wget parancs perl-be ágyazásával történt:

1
wget --user-agent="Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" --save-cookies cookies.txt  --post-data='nev=UserName&pass=Password&ne_leptessen_ki=1'  -O - -o /dev/null http://torerntURL.hu/login.php

Itt azt érdemes észrevenni, hogy használunk egy user agent-et, ami kb elrejti a kérésünket egy fake böngésző mögé. Sok oldal nem szolgálja ki azokat a kéréseket, amik nem böngészőtől jönnek. Ezt egy másik oldallal kapcsolatos kalandom során vettem észre. Az elküldött adatok a post-data kapcsoló mögött vannak szépen URI szabály szerint: küldjük a felhasználói nevet, a jelszót, és szépen megkérjük az oldalt, hogy a session végén ne léptessen ki. A visszakapott cookie-t (surprise, surprise) a cookies.txt állományba mentjük. Erre fogunk a későbbiekben hivatkozni. A kavarás a végén azért kell, hogy a letöltött adatokat ne file-ba mentse, hanem a vágólapra: így a perl-ből hívott program output-ja egyből egy változóba kerül.

Második lépés: kilistázni a magyar és nemzetközi zenéket tartalmazó torrenteket (mp3 + flac). (Itt nem vesszük figyelembe a videoklippeket, amik viszonylag marginális részét képzik az össz zenei kínálatnak, de annyira egyszerű volt szűrni, hogy inkább kiszedtem.) Itt egy kb. 78 ezer elemű halmazunk van, amin 1oo-asával fogunk végigmenni. Itt ki fogjuk szedni az összes torrent azonosítóját, és egy listába mentjük. Szerencsére a perl regexp funkciója pompás, így ez gyerekjáték. Természetesen ehhez is wget-et használunk, illetve megadjuk a bejelentkezéshez az előbb letöltött cookie-t.

torrentek.png

A böngészővel történő navigálással analóg módon, post-oljuk a kívánt paramétereket, és a visszatérő oldalból mentjük le a torrent azonosítókat. Ezt a lépést annyiszor kell megismételni, ahány oldalra kifér az összes torrent. Persze az oldal indexet növelni kell egészen a maximális értékig.

1
wget --load-cookies cookies.txt --post-data='oldal=1&tipus=kivalasztottak_kozott&kivalasztott_tipus=mp3_hun,mp3,lossless_hun,lossless'-O - -o /dev/null http://torerntURL.hu/torrents.php

A maximális indexet az "utolsó" oldalhoz tarozó indexként kapjuk meg a html forrásból:

1
<a href="/torrents.php?oldal=2516"><strong>Utolsó</strong></a></div>

A visszatérő oldal tartalmazza mindazt az adatot, amit akkor látnánk, ha böngészővel adtuk volna ki a parancsot. Tehát valami ilyesmit kapunk html forrásban:

torrent lista.png

Itt már nagyon sokminden látszik, amit használni is fogunk: feltöltés ideje, letöltések száma (D), seederek száma (S) és a leecherek száma (L). (Látszik még a feltöltők neve, de azokra tojunk, nem vagyunk mi ASVA :) Ugyanakkor valami fontosat nem látunk: nem látjuk a tag-eket! A lényeghez rá kell kattintani a torrent nevére, és akkor jönnek elő a részletek egy lenyíló menüben.

reszletek.png

Sok egyéb dolog mellett már ott vannak a címkék is. Nagyszerű! Az a baj, hogy ezek az adatok nem az eredeti html-ben vannak, hanem a torrent nevére kattintva egy külön html hívás keretében töltődnek be. Ez nagyban lelassítja a forrásadatok letöltését, hiszen minden egyes torrent adatfile-ját le kell tölteni, és nem elég csak a lista oldalt. De nem baj, megoldjuk. Szóval egyelőre ott vagyunk a lista oldalon, és mit látunk: látjuk az összes torrent azonosítóját a html forrásban. Nosza, mentsük el!

1
2
<a href="torrents.php?action=details&id=1487535" onclick="torrent(1487535); return false;" title="Pinkly Smooth - Unfortunate Snort">
<nobr>Pinkly Smooth - Unfortunate Snort</nobr></a>

Szóval itt azt látjuk, hogy minden torrent neve előtt szerepel egy link a torrent azonosítójával (1487535). Ez az azonosítót vesszük ki és mentjük el egy file-ba. Én szeretek minden részfolyamatot külön script-tel intézni, nem vagyok híve a nagy integrált rendszereknek. Ez azt is lehetővé teszi, hogyha valahol elhasal a script, akkor könnyebb felvenni a fonalat és talán a hibakeresés, módosítás is egyszerűbb. Ok, akkor nekiállunk és letöltjük az azonosítókat. Következő alkalommal innen folytatjuk!

(BTW, a szintaxis kiemeléseket a http://hilite.me/ oldal segítségével oldottam meg. thx nekik.)

Szólj hozzá!

Címkék: torrent perl project 1

Milyen zenét hallgatnak a magyar torrentezők?

2014.02.09. 08:43 sdani

Nem rég tele volt az internet egy Google-ös grafikonnal, ami az egyes zenei stílusok népszerűségének felelmekedését és hanyatlását mutatja. Ebből valami olyasmit olvastak ki egyesek, hogy a rock korszak leáldozóban van, amit én egyátalán nem érzek. Szerintem az emberek többsége inkább rock zenét hallgat, mert könnyű átérezni, és annyira sokféle, hogy minden hangulat, érzelem remekül lefedhető vele, és a stiláris sokféleségről nem is beszéltünk. Továbbá amikor a rockzene a virágkorát élte (a mainstream része volt) akkor nemzedékek himnuszait ontották az olyan nagysikerű bandák, mint a Beatles vagy a Rolling Stones. Az ő slágereik örökké az emberi kultúra állócsillagaivá váltak és generációk kellenek ahhoz, hogy feledésbe merüljenek. 

Szóval engem az érdekelt, hogy az egyik legnagyobb magyar zárt torrent oldalon milyen mintázatok láthatók a feltöltött zenék stílusainak eloszlásában, milyen seeder/leecher arány, illetve mennyi az abszolút letöltés és a torrentek átlagos életkora. Azt gondolom, hogy a rockzenék felülreprezentáltak lesznek (nem meglepő, mivel viszonylag régi stílusról van szó), az átlagos letöltések számai magasabbak lesznek, az átlagos életkoruk magasabb, jobb seeder/leecher aránnyal rendelkeznek. E két utóbbi azt mutatná, hogy az embereket mennyire érdekli az adott zenemű: ha komoly érzelmi szálak fűzik egy albumhoz, akkor jóval tovább tartja a felhasználó a seedben, tehát később kerül törlésre. (ezt onnan lehet majd tudni, hogy a különböző korú torrentekben eltérő lesz a stílusok aránya)

A forrásadatokat nem mondom meg, melyik oldalról töltöm le, az a lényeg, hogy, mivel az adminok semmilyen adatot nem adnak ki, nekem kellett letölteni. És ez nem ütközik a felhasználói feltételekkel, csak publikus, böngészve elérhető adatokat használok fel. Nem töltök le semmilyen felhasználókkal kapcsolatos adatot sem, csak a torrent aktivitására vonatkozó információ érdekel. Az adatok letöltéséhez a Perl-ben írtam a programot. Az elkövetkező néhány bejegyzésben ezzel a storyval foglalkozom.

Szólj hozzá!

Címkék: zene torrent rock perl project 1

Az első bejegyzés...

2014.02.09. 08:08 sdani

Az első bejegyzés afféle ars poetika lesz. Lelkes hobbista szinten érdekel a programozás, a statisztika és az adatelemzés. (oké, ez utóbbi némiképpen a munkám is) Mivel mostanában egy egyre több és egyre komplexebb internetes adatok elemzésével kapcsolatos kérdés merült fel bennem, gondoltam, hogy indítok egy blogot ennek bemutatására. És titkon bízom benne, hogy mások érdeklődésére is számot tarthat. Úgy gondolom, hogy egy ilyen project afféle utazás, a kérés felvetésétől kezdve az alkalmazott módszer kiválasztásán és megvalósításán keresztül a tanulság levonásáig. Nagyon jó látni, hogy egy megfelelő ezközökkel feltett kérdés milyen mélyebben rejlő igazságokat, mechanizmusokat tud feltárni. 

Az ezközökről: mivel bioinformatikai vonalról indulok, a Perl nyelv alap, ezt elég magas szinten űzöm, ezt próbálom kiegészíteni Python-nal és R-rel, amik mostanában egyre kurrensebb ezközei az adatbányászatnak és analitikának. Az adatok kiértékeléséhez vagy gnuplot vagy R vagy az Origin programcsomagot használom, de itt is egyre inkább törekszem az R és Python bevonására.

Disclaimer: nem fogom túlzottan cifrázni a dolgokat, mert nincs sok időm a meló és a gyerek mellett ezekre a hóbortokra, arra meg mégkevésbé, hogy ezt valami űberszofisztikált módon megosszam. Az szinte kizárt, hogy egy bejegyzést a publikáció előtt 2x elolvassak, így nyilván hemzsegni fog a helyesírási hibáktól (annál inkább, mert angol billentyűzeten írok és nincs magyar helyesírás ellenőrzés). Ezek engem egyátalán nem érdekelnek. Teljes scripteket valószínűleg nem fogok közzétenni, de olyan script részleteket, amik valamilyen módon kulcs szerepet játszottak egy egy probléma megoldásában, mindnképpen, és erre valamilyen szintaxis kiemelő cuccot is fogok használni, hogy értelmesebb legyen az információ. 

Na, de nem pofázok tovább, csapjunk bele a lovak közé.

Szólj hozzá!

Címkék: Ars poetica