Runescape id/name koppelen
Hoi allemaal,
Ik ben bezig met een script dat alle runescape item id's zoekt en koppelt met hun naam om later opgeslagen te kunnen worden.
cURL normaal:
Snelheid 0.5 per item.
cURL_multi met 5 items tegelijk:
Snelheid 0.2 per item.
cURL_multi met 10 items tegelijk:
Snelheid 0.14 per item.
Weet iemand of die sneller/effectiever kan, zoja hoe?
Ik ben bezig met een script dat alle runescape item id's zoekt en koppelt met hun naam om later opgeslagen te kunnen worden.
cURL normaal:
Snelheid 0.5 per item.
cURL_multi met 5 items tegelijk:
Snelheid 0.2 per item.
cURL_multi met 10 items tegelijk:
Snelheid 0.14 per item.
Weet iemand of die sneller/effectiever kan, zoja hoe?
Code (php)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
echo 'Started at '.date("H:i:s").'<br />';
flush();
function name_id($data){
$begin = '<div class="brown_box main_ge_page vertically_spaced">'."\n".'<div class="subsectionHeader">';
$eind = '</div>';
if (preg_match("/Error/i",$data)){
$result = "Bestaat niet";
}else{
$exploded = explode($begin,$data);
$exploded = explode($eind,$exploded[1]);
$result = str_replace('<br />','',nl2br($exploded[0]));
}
return trim($result);
}
$getallen = range(0, 100);
$cURL_done = 0;
$last = 0;
// Urls to download
$urls = array();
foreach ($getallen as $value){
$urls[] = 'http://itemdb-rs.runescape.com/viewitem.ws?obj='.$value;
}
$threads = 10;
$timeout = 30;
$mcurl = curl_multi_init();
$threadsRunning = 0;
$urls_id = 0;
for(;;) {
//de vrije ruimtes vullen
while ($threadsRunning < $threads && $urls_id < count($urls)) {
//echo 'Adding download link: '.$urls[$urls_id].'<br>';
//flush();
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_URL, $urls[$urls_id++]);
curl_multi_add_handle($mcurl, $ch);
$threadsRunning++;
}
//Als hij klaar is
if ($threadsRunning == 0 && $urls_id >= count($urls))
break;
//cURL
curl_multi_select($mcurl);
while(($mcRes = curl_multi_exec($mcurl, $mcActive)) == CURLM_CALL_MULTI_PERFORM) usleep(100000);
if($mcRes != CURLM_OK) break;
while($done = curl_multi_info_read($mcurl)) {
$ch = $done['handle'];
$done_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$done_content = curl_multi_getcontent($ch);
if(curl_errno($ch) == 0) {
//output als er geen errors zijn
$id = array_search($done_url, $urls);
$id_name[$id]= name_id($done_content);
$cURL_done++;
$cURL_perCent = round($cURL_done / count($urls) * 100);
$cURL_perDecem = floor($cURL_perCent / 10) * 10;
if($last != $cURL_perDecem){
echo $cURL_perDecem.'% at '.date("H:i:s").'<br />';
$last = $cURL_perDecem;
}
flush();
} else {
//output als er een error is
echo "Link <a href='$done_url'>$done_url</a> failed: ".curl_error($ch)."<br>\n";
flush();
}
curl_multi_remove_handle($mcurl, $ch);
curl_close($ch);
$threadsRunning--;
}
}
curl_multi_close($mcurl);
ksort($id_name);
echo 'Completed. at '.date("H:i:s");
echo '<pre>';
print_r($id_name);
echo '</pre>';
?>
echo 'Started at '.date("H:i:s").'<br />';
flush();
function name_id($data){
$begin = '<div class="brown_box main_ge_page vertically_spaced">'."\n".'<div class="subsectionHeader">';
$eind = '</div>';
if (preg_match("/Error/i",$data)){
$result = "Bestaat niet";
}else{
$exploded = explode($begin,$data);
$exploded = explode($eind,$exploded[1]);
$result = str_replace('<br />','',nl2br($exploded[0]));
}
return trim($result);
}
$getallen = range(0, 100);
$cURL_done = 0;
$last = 0;
// Urls to download
$urls = array();
foreach ($getallen as $value){
$urls[] = 'http://itemdb-rs.runescape.com/viewitem.ws?obj='.$value;
}
$threads = 10;
$timeout = 30;
$mcurl = curl_multi_init();
$threadsRunning = 0;
$urls_id = 0;
for(;;) {
//de vrije ruimtes vullen
while ($threadsRunning < $threads && $urls_id < count($urls)) {
//echo 'Adding download link: '.$urls[$urls_id].'<br>';
//flush();
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_URL, $urls[$urls_id++]);
curl_multi_add_handle($mcurl, $ch);
$threadsRunning++;
}
//Als hij klaar is
if ($threadsRunning == 0 && $urls_id >= count($urls))
break;
//cURL
curl_multi_select($mcurl);
while(($mcRes = curl_multi_exec($mcurl, $mcActive)) == CURLM_CALL_MULTI_PERFORM) usleep(100000);
if($mcRes != CURLM_OK) break;
while($done = curl_multi_info_read($mcurl)) {
$ch = $done['handle'];
$done_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$done_content = curl_multi_getcontent($ch);
if(curl_errno($ch) == 0) {
//output als er geen errors zijn
$id = array_search($done_url, $urls);
$id_name[$id]= name_id($done_content);
$cURL_done++;
$cURL_perCent = round($cURL_done / count($urls) * 100);
$cURL_perDecem = floor($cURL_perCent / 10) * 10;
if($last != $cURL_perDecem){
echo $cURL_perDecem.'% at '.date("H:i:s").'<br />';
$last = $cURL_perDecem;
}
flush();
} else {
//output als er een error is
echo "Link <a href='$done_url'>$done_url</a> failed: ".curl_error($ch)."<br>\n";
flush();
}
curl_multi_remove_handle($mcurl, $ch);
curl_close($ch);
$threadsRunning--;
}
}
curl_multi_close($mcurl);
ksort($id_name);
echo 'Completed. at '.date("H:i:s");
echo '<pre>';
print_r($id_name);
echo '</pre>';
?>
Gewijzigd op 01/01/1970 01:00:00 door Daniel Voogsgerd
Gesponsorde koppelingen:
Je kan curl_multi_init gebruiken om veel requests tegelijk uit te voeren.
http://uk3.php.net/manual/en/function.curl-multi-init.php
Je moet wel opletten dat je d'r geen DOS attack van maakt trouwens ;)
http://uk3.php.net/manual/en/function.curl-multi-init.php
Je moet wel opletten dat je d'r geen DOS attack van maakt trouwens ;)
Gewijzigd op 01/01/1970 01:00:00 door Gerard M
Lol je eigen/runescapes server ruïneren ;) Heb het script geupdate. Zie bovenaan.
Gewijzigd op 01/01/1970 01:00:00 door Daniel Voogsgerd
Ik weet niet hoe runscape in elkaar zit (ik heb het nooit gespeeld). Maar als ik zo kijk lijkt het er op dat niet elk ID nummer bestaat - dus die nummers kan je overslaan. Daarnaast denk ik niet dat het veel sneller kan gaan met php.
Je kan proberen met nog meer threads te werken? En als runescape maar N connecties toestaat een proxy gebruiken? Draai je het script op een goede internet connectie trouwens?
Als ik wget gebruik zit ik ook rond de 0.3 seconde per item (1 connectie per keer). Dus 0.3 seconde lijkt het minimum per request.
Btw, ik neem aan dat je het script niet 'per request' draait maar als een cronjob, en de output in een database steekt?
Je kan proberen met nog meer threads te werken? En als runescape maar N connecties toestaat een proxy gebruiken? Draai je het script op een goede internet connectie trouwens?
Als ik wget gebruik zit ik ook rond de 0.3 seconde per item (1 connectie per keer). Dus 0.3 seconde lijkt het minimum per request.
Code (php)
Btw, ik neem aan dat je het script niet 'per request' draait maar als een cronjob, en de output in een database steekt?
Gewijzigd op 01/01/1970 01:00:00 door Gerard M
Het nadeel is dat runescape nog al is wil wisselen van id's vanwege robots. Ik laat het script voorlopig nog even op mijn localhost draaien mbv xxamp zit nu op 0.2 seconde en idd het is een cronjob kijk ff of het allemaal lukt en dan breng ik jullie op de hoogte.
Edit: hij is nu aan het scannen. ongeveer 60%
Edit: hij is nu aan het scannen. ongeveer 60%
Gewijzigd op 01/01/1970 01:00:00 door Daniel Voogsgerd



