Spider/crawler
Ik heb uiteraard al rond gekeken en er is veel te vinden, maar deze scripts zijn zo uitgebreid dat ik als beginner er niet veel mee kan.
Ik heb de laatste paar dagen vele pagina’s gelezen over OOP. Nou wil ik dit uiteraard zelf proberen bij mijn spider, maar ik heb geen flauw idee welke indeling ik in mijn class moet maken. Kan iemand mij een zetje in de goede richting geven
BVD
PP
http://phpcrawl.cuab.de/
Even de documentatie bekijken en je snapt het principe (zie voor een voorbeeld: http://phpcrawl.cuab.de/example.html).
Een spider systeem ontwikkelen is niet bepaald kinderspel. Als je, ondanks jouw eerdere zoektocht, nog open staat voor een spider script dan raad ik je aan eens te kijken naar: Even de documentatie bekijken en je snapt het principe (zie voor een voorbeeld: http://phpcrawl.cuab.de/example.html).
Gewijzigd op 18/04/2011 12:09:09 door Arjan -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$bron = file_get_contents('http://www.google.com/');
$pattern = "/<[ ]{0,}a[ \n\r][^<>]{0,}(?<= |\n|\r)(?:href)[ \n\r]{0,}=[ \n\r]{0,}[\"|']{0,1}([^\"'>< ]{0,})[^<>]{0,}>((?:(?!<[ \n\r]*\/a[ \n\r]*>).)*)<[ \n\r]*\/a[ \n\r]*>/ is";
preg_match_all($pattern, $bron, $matches);
foreach ($matches[1] as $key => $url){
echo "Url: " . $url . "</br>Titel: " . $matches[2][$key]. "</br></br>";
}
?>
$bron = file_get_contents('http://www.google.com/');
$pattern = "/<[ ]{0,}a[ \n\r][^<>]{0,}(?<= |\n|\r)(?:href)[ \n\r]{0,}=[ \n\r]{0,}[\"|']{0,1}([^\"'>< ]{0,})[^<>]{0,}>((?:(?!<[ \n\r]*\/a[ \n\r]*>).)*)<[ \n\r]*\/a[ \n\r]*>/ is";
preg_match_all($pattern, $bron, $matches);
foreach ($matches[1] as $key => $url){
echo "Url: " . $url . "</br>Titel: " . $matches[2][$key]. "</br></br>";
}
?>
Ik zou graag wat dingen veranderen waar ik niet uit kom:
Ik wil dat wanneer hij een match gevonden heeft hij die match meteen echo-ed is dit mogelijk zo ja, hoe?
Ik heb ook wat andere sites geprobeerd http://www.youtube.com http://nl.yahoo.com/ maar als ik mijn pagina dan open krijg ik de volgende error "Apache HTTP Server werkt niet meer" iemand een idee wat ik hier aan kan doen?
Hier werkt je script trouwens wel gewoon goed. Zet eens de error-reporting aan? Misschien krijg je dan een bruikbare foutmelding te zien:
En anders maar met een hard hoofd debuggen: Werkt alleen dit wel, of krijg je "bool(false)" oid te zien?
Gewijzigd op 19/04/2011 12:12:51 door Jelmer -
2. Mijn code werkt op veel paginas gewoon goed maar zo als ik al zei pagina's als http://www.youtube.com en http://nl.yahoo.com/ daar bij krijg ik die error. wanneer ik het met jou var_dump code probeer doet hij precies wat die moet doen. Ik kan de fout niet echt vinden.
Gewijzigd op 19/04/2011 12:31:59 door peter paul
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$bron = file_get_contents('http://www.youtube.com');
$pattern = "/<[ ]{0,}a[ \n\r][^<>]{0,}(?<= |\n|\r)(?:href)[ \n\r]{0,}=[ \n\r]{0,}[\"|']{0,1}([^\"'>< ]{0,})[^<>]{0,}>((?:(?!<[ \n\r]*\/a[ \n\r]*>).)*)<[ \n\r]*\/a[ \n\r]*>/ is";
$offset = 0;
while(preg_match($pattern, $bron, $matches, PREG_OFFSET_CAPTURE, $offset))
{
$offset = $matches[0][1] + 1;
echo 'URL: ' . $matches[1][0] . "<br>\n";
echo 'Titel:' . htmlentities($matches[2][0]) . "<br><br>\n";
}
?>
$bron = file_get_contents('http://www.youtube.com');
$pattern = "/<[ ]{0,}a[ \n\r][^<>]{0,}(?<= |\n|\r)(?:href)[ \n\r]{0,}=[ \n\r]{0,}[\"|']{0,1}([^\"'>< ]{0,})[^<>]{0,}>((?:(?!<[ \n\r]*\/a[ \n\r]*>).)*)<[ \n\r]*\/a[ \n\r]*>/ is";
$offset = 0;
while(preg_match($pattern, $bron, $matches, PREG_OFFSET_CAPTURE, $offset))
{
$offset = $matches[0][1] + 1;
echo 'URL: ' . $matches[1][0] . "<br>\n";
echo 'Titel:' . htmlentities($matches[2][0]) . "<br><br>\n";
}
?>
Zo print hij ze zodra hij een match vindt, maar dat heeft geen meerwaarde boven preg_match_all. Jou probleem zit hem in file_get_contents. Als je creatief bent kan je met kan je zelf het uitlezen van het antwoord van de webserver regelen, zie voor een simpel voorbeeld daarvan het voorbeeld bij fsockopen.
Het is wel aanzienlijk complexer. Zo moet je zelf gaan bijhouden wanneer je de body van het antwoord krijgt (headers overslaan, of parsen wanneer je bijvoorbeeld een redirect wilt kunnen volgen, dan zit er een Location: xxx in het header-gebeuren van het antwoord etc.) Je moet ook gaan bijhouden hoever je al was met lezen en matchen. Immers, fgets zou je eerst ' aasadas <a href="asdmfvl">asd' kunnen geven, en dan 'asdsad</a> sdfunkf,jrev', en pas als je die twee stukken aan elkaar plakt matcht je reguliere expressie. Met het voorbeeld hierboven dan je dan weer uitrekenen waar hij matchte (via $offset) en dat deel van de buffer weggooien.
edit: www.youtube.com en nl.youtube.com doen het bij mij allebei, alleen de titel die je krijgt bevat veel HTML code. Misschien stikt je browser in al die html? Helpt htmlentities zoals in m'n voorbeeld hierboven misschien?
Gewijzigd op 19/04/2011 12:42:41 door Jelmer -
Kijk ook eens naar cURL.
Denk daarbij ook aan een mogelijke base-tag.
ik vroeg me af of je ook tekst kan crawlen