Mod af?
Maar terug naar waar we het over hadden. Ik heb twee botjes gemaakt, één botje zoekt eerst alle topics op. Je geeft zelf even het id van alle forums dat je wilt crawlen en dan gooit hij alle topics (titel + id) in m'n db. Ik vond 49k topics excl. admin only topics, koffiehoek en natuurlijk verwijderde topics. Dan heb ik nog een tweede botje geschreven dat telkens 200 topics (dus het id + forum) uit m'n db leest die ik net gevonden heb met m'n andere botje. Hij gaat ieder topic af en haalt alle berichten van de eerste pagina, als er 20 berichten op die pagina staat probeert hij nog een tweede pagina, als die leeg is gooit hij alle berichten in een multidimensionale array en gaat door met een volgend topic. Als er berichten op die tweede pagina staan .. etc. Zo komt er dus eigenlijk een oneindige lus voor ieder topic tot alle berichten uit ieder topic van die 200 topics opgehaald zijn. Alle berichten die in die ene array zitten worden in één query in m'n db gezet. Daarna worden de volgende 200 topics uit m'n db gehaald en begint de hele lus weer opnieuw. Waarom zou ik dan als dit zo gaat niet iedere x ms een nieuwe pagina met berichten op kunnen vragen? Hoe zou ik het anders doen? Hoe doet Google dat dan? Iedere dag een pagina? Nee, Google haalt een pagina op, haalt vervolgens weer alle pagina's op waarnaar wordt gelinkt op die ene pagina en gaat zo door, dan verstuurt de crawler een berg pagina's naar een ander botje dat alles verwerkt en de data ordent. Een moderne server kan daar makkelijk tegen.
Over die tijden die ik zou overdrijven: zo'n botje schrijven dat is echt een paar minuten werk als je weet hoe zoiets moet. Het is gewoon een simpel PHP scriptje dat eigenlijk bestaat uit een db connectie en één grote loop. Het moeilijkste was nog dat Bas in der tijd zo leuk was om tabellen te gebruiken en dan ook nog eens ze geen fatsoenlijke class/id te geven, daardoor werd ik even opgehouden bij het schrijven van de botjes. Ik gaf gewoon een command: "php bot-topics.php 1" via SSH, 1 hierin is het forum dat doorzocht moet worden en de rest kunnen jullie zelf wel uitvogelen.
Over die paar regels, ik kan wel voor ieder topic dat ik doorzocht/gevonden heb een bericht terugsturen naar de client, ten eerste heeft de client daar niets/niet veel aan en ten tweede kost tijd ook tijd en bij zo'n hoeveelheid dus ook dataverkeer etc.. Voor de geinteresseerde, ik zal hier het botje posten dat ik heb geschreven voor het ophalen van de topics. Wel op voorwaarde dat jullie niet het zullen gebruiken hier op PHP Hulp maar alleen om van te leren of weet ik wat. Want als nou ineens 10 mensen dat tegelijkertijd gaan uitvoeren hebben misschien andere gebruikers er last van.
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
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
<?php
error_reporting(E_ALL);
set_time_limit(0);
//header('Content-type: text/html');
echo '<pre>'.PHP_EOL;
if (isset($_GET['forum'])) {
$searchForum = $_GET['forum'];
$stop = false;
$count = 0;
$database = array();
while (!$stop) {
$count++;
if ($count == 1282) {
$stop = true;
echo "All topics received".PHP_EOL;
} else {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://phphulp.nl/forum/listtopics.php?cat=" . $searchForum . "&page=" . (($count * 30) - 30));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);
$temp = strstr($data, '<div class="main_table">');
$temp = explode('<div class="footer">', $temp);
$tempData = $temp[0];
$matcher = '<a href="showtopic.php?cat=' . $searchForum . '&id=';
$matcher2 = '" title="';
for ($i = 0; $i < 30; $i++) {
$tempData = strstr($tempData, $matcher);
$tempMatch = substr($tempData, strlen($matcher));
$tempTemp = explode('&page=', $tempMatch, 2);
$id = $tempTemp[0];
$tempData = $tempTemp[1];
$tempData = strstr($tempData, $matcher2);
$tempMatch = substr($tempData, 9);
$tempTemp = explode('">', $tempMatch, 2);
$title = $tempTemp[0];
$tempData = $tempTemp[1];
$database[] = array($id, $title);
}
}
}
mysql_connect("localhost", "bot", "stoned") or die(mysql_error());
echo "Connected to MySQL".PHP_EOL;
mysql_select_db("phphulp") or die(mysql_error());
echo "Connected to Database".PHP_EOL;
$query = "";
$q = 0;
foreach ($database as $item) {
if ($q != 0) $query .= ", "; $q++;
$query .= "(" . $item[0] . ", '" . mysql_real_escape_string($item[1]) . "', " . $searchForum . ")";
}
mysql_query("INSERT INTO topic (id, title, forum) VALUES " . $query) or die(mysql_error());
} else {
echo "No forum set".PHP_EOL;
}[/code]
Ik weet dat het slordig is met mysql_*, maar het werkt, snel en duidelijk. Ik heb even $_GET['forum'] gebruikt zodat sommige onder jullie misschien snappen waar die variabele voor nodig is, eerst gebruikte ik dus de C-style arguments ($_SERVER['argc'][0]) voor. Nogmaals, je ziet dat ik een aantal lussen doe die uiteindelijk voor 49k topics dus heel vaak herhaald worden, om dan iedere keer een bericht te sturen is zo onnodig en alleen maar irritant uiteindelijk. Oh btw, zoals je ziet moet je wel voor ieder forum ook even kijken hoeveel pagina's met topics er zijn want dat heb ik niet ingebouwd, een automatische check hoeveel pagina's er zijn.
Edit: heb ik me genoeg verantwoord?
Omdat dus idd alle topics gewoon beschikbaar blijven zal ik geen archief online zetten.
error_reporting(E_ALL);
set_time_limit(0);
//header('Content-type: text/html');
echo '<pre>'.PHP_EOL;
if (isset($_GET['forum'])) {
$searchForum = $_GET['forum'];
$stop = false;
$count = 0;
$database = array();
while (!$stop) {
$count++;
if ($count == 1282) {
$stop = true;
echo "All topics received".PHP_EOL;
} else {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://phphulp.nl/forum/listtopics.php?cat=" . $searchForum . "&page=" . (($count * 30) - 30));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
curl_close($curl);
$temp = strstr($data, '<div class="main_table">');
$temp = explode('<div class="footer">', $temp);
$tempData = $temp[0];
$matcher = '<a href="showtopic.php?cat=' . $searchForum . '&id=';
$matcher2 = '" title="';
for ($i = 0; $i < 30; $i++) {
$tempData = strstr($tempData, $matcher);
$tempMatch = substr($tempData, strlen($matcher));
$tempTemp = explode('&page=', $tempMatch, 2);
$id = $tempTemp[0];
$tempData = $tempTemp[1];
$tempData = strstr($tempData, $matcher2);
$tempMatch = substr($tempData, 9);
$tempTemp = explode('">', $tempMatch, 2);
$title = $tempTemp[0];
$tempData = $tempTemp[1];
$database[] = array($id, $title);
}
}
}
mysql_connect("localhost", "bot", "stoned") or die(mysql_error());
echo "Connected to MySQL".PHP_EOL;
mysql_select_db("phphulp") or die(mysql_error());
echo "Connected to Database".PHP_EOL;
$query = "";
$q = 0;
foreach ($database as $item) {
if ($q != 0) $query .= ", "; $q++;
$query .= "(" . $item[0] . ", '" . mysql_real_escape_string($item[1]) . "', " . $searchForum . ")";
}
mysql_query("INSERT INTO topic (id, title, forum) VALUES " . $query) or die(mysql_error());
} else {
echo "No forum set".PHP_EOL;
}[/code]
Ik weet dat het slordig is met mysql_*, maar het werkt, snel en duidelijk. Ik heb even $_GET['forum'] gebruikt zodat sommige onder jullie misschien snappen waar die variabele voor nodig is, eerst gebruikte ik dus de C-style arguments ($_SERVER['argc'][0]) voor. Nogmaals, je ziet dat ik een aantal lussen doe die uiteindelijk voor 49k topics dus heel vaak herhaald worden, om dan iedere keer een bericht te sturen is zo onnodig en alleen maar irritant uiteindelijk. Oh btw, zoals je ziet moet je wel voor ieder forum ook even kijken hoeveel pagina's met topics er zijn want dat heb ik niet ingebouwd, een automatische check hoeveel pagina's er zijn.
Edit: heb ik me genoeg verantwoord?
Omdat dus idd alle topics gewoon beschikbaar blijven zal ik geen archief online zetten.
Gewijzigd op 01/01/1970 01:00:00 door Onbekend Onbekend
amen
Quote:
Edit: heb ik me genoeg verantwoord?
Meer dan genoeg ;)
Nibulez schreef op 30.12.2009 19:57:
Meer dan genoeg ;)
Quote:
Edit: heb ik me genoeg verantwoord?
Meer dan genoeg ;)
Gelukkig! Anders kon ik het nieuwe jaar niet in hoor.. ........................ * NOT *
Srry voor bump maar nu zijn jullie ook geen mod-admin meer?
En mochten een van deze mensen moderator zijn dan zie je bij hun naam 'moderator'.
Ik ze we een topic met : 2 mods ontmod maar die kan ik niet bekijken
Is het niet zinvoller om in het vervolg even na te denken voordat wat je post?
Gewijzigd op 26/12/2011 11:13:11 door - Ariën -
Tijd om dit topic te sluiten.