HTML

Show me the Data!

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

Címkék

Archívum

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

A bejegyzés trackback címe:

https://showthedata.blog.hu/api/trackback/id/tr305815170

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.