Hoe kan ik mijn eigen crawlbot maken, een zoekmachine bot?
- Eigen crawlbot maken
-
28-07-2007, 23:57 #1Joris Willemsen Guest
Eigen crawlbot maken
-
-
29-07-2007, 10:17 #2
- Berichten
- 3
- Lid sinds
- 17 Jaar
Deze code heb ik ooit ergens gevonden.
PHP Code:<?php
/*
Een klein voorbeeldje staat hieronder.
========begin: index.php===========
require_once ("webcrawler.class.php");
// Noteer hier de URL die je wilt doorzoeken:
$url = 'http://www.mijndomein.com/';
// Initialiseer class.
$webcrawler = new webcrawler;
// Zet de URL in de class.
$webcrawler->Set_starturl($url);
// Begin het onderzoek
$webcrawler->Website_research();
echo 'Verstreken tijd: ' . $webcrawler->Exectime();
========einde: index.php===========
*/
/**************************************************************/
/* webcrawler.class.php */
/* */
/* Deze class doorzoekt de pagina's van een domein op */
/* hyperlinks. Als die gevonden worden, dan worden die ook */
/* weer doorzocht. Eindresultaat is een geprinte tabel */
/* op het scherm. */
/* */
/* Mogelijkheden: */
/* + Filtert: mailto: javascript: & links naar derden. */
/* + Verabsoluteert relatieve paths. */
/* + Accepteert robottags in head */
/* + Mogelijkheid tot scannen binnen mappen */
/* + Accepteert: *.php *.php3 *.htm *.html *.xhtml *.shtml */
/* */
/* Problemen: */
/* - Als PHP in Safe Mode draait kan de runtime te kort zijn. */
/* Snelheid circa 65 pg in 2,8 sec. */
/* */
/* Nieuw in v2.0 */
/* + <title>-element opnemen. (n.b.: dit is nog niet zichtbaar) */
/* + Bugfix: URL validatie verbeterd. */
/* */
/* Nieuw in v1.01 */
/* + Scannen binnen directories. */
/* + Bugfix: commentaar in HTML op meerdere regels genegeerd. */
/* */
/* Version 2.0 (14 juli 2005 */
/* Copyright: Edward Brüheim */
/**************************************************************/
/*****************************************/
/* Webcrawl class */
/*****************************************/
class webcrawler {
var $_starturl; // Eerste te indexeren site.
var $_startdir; // Directory waar de webcrawler binnen moet blijven.
var $_basedir; // Base-directory van de te scannen website.
var $_urllist = array(); // Lijst met te scannen URL's
var $_scannedlist = array(); // Lijst met gescande URL's
var $_urldir; // Directory van het te scannen bestand.
// Bijv. www.mijndomein.nl/boeken/duits/
var $_metainfo = array(); // Array met meta-information:
// follow = Mag zoekmachine hyperlinks volgen?
// index = Mag zoekmachine hyperlinks indexeren?
// title = Titel van de pagina
// keywords = Keywords. Op welke woorden wordt de pagina gevonden?
// description = Omschrijving. Hoe omschrijf je de pagina?
var $_startTime; // Starttijd van script.
function webcrawler() {
// Standaard is de server time-out 30 seconden. Door hem op 0 te zetten zal
// er geen server time-out plaatsvinden. Dit kan niet als PHP in safe-mode
// draait.
set_time_limit(0);
// Sla de starttijd op.
$this->_startTime = $this->getmicrotime();
$this->_metainfo['index'] = 0;
}
// Setters en Getters
// URL waar je begint met zoeken.
function Set_starturl($sUrl){ $this->_starturl = $sUrl;
$this->Set_startdir($this->_starturl);
$this->Set_basedir($this->_starturl);
$this->Set_urllist($this->_starturl);
}
function Get_starturl() { return $this->_starturl; }
// Set_startdir bevat de directory waarin het scannen is begonnen.
// Het is de bedoeling dat de crawler dan binnen die map (en de sub-mappen etc daarvan)
// blijft.
function Set_startdir($sUrl) {
$sDir = $this->Get_dir($sUrl);
$this->_startdir = $sDir;
}
function Get_startdir() { return $this->_startdir; }
// FUNCTION: Set_basedir
// Bevat de absolute basis van de starthyperlink
function Set_basedir($sUrl) {
$aArray = parse_url($sUrl);
$this->_basedir = $aArray['scheme'] . '://'. $aArray['host'] . '/';
}
function Get_basedir() { return $this->_basedir; }
// Zet URL in urllijst
function Set_urllist($sUrl) { array_push($this->_urllist, $sUrl); }
// Directory waar de huidige URL in voorkomt.
function Set_urldir($sUrl) {
$sDir = $this->Get_dir($sUrl);
$this->_urldir = $sDir;
}
function Get_urldir() { return $this->_urldir; }
// FUNCTIE: Get_dir
// Deze functie retourneert de laagste directory uit een URL.
function Get_dir($sUrl){
// Als URL eindigt op / niets doen. Anders path zoeken.
if ((strrpos($sUrl, '/') + 1) == strlen($sUrl)) {
return $sUrl;
}
// Anders directory zoeken.
else {
$dir = dirname($sUrl);
return $dir . "/";
}
}
// FUNCTION: Is_url
// Checkt of de URL bestaat:
// - Return 1 als URL bestaat.
// - Return 0 als URL niet bestaat.
function is_url($sUrl) {
return @fopen($sUrl,'r')?1:0;
}
/***************************************/
/* Functies voor het samenstellen */
/* van een zoek-database */
/***************************************/
// FUNCTION: Grab_content
// Zet alle inhoud van en webpagina in een string.
function Grab_content($sUrl) {
$sContent = file_get_contents($sUrl);
// Content opschonen.
$sContent = $this->Clear_content($sContent);
return $sContent;
}
// functie Clear_content
// Schoont de gegrabte inhoud van websites op. Door:
// - Verwijderen van regeleinden.
// - Verwijderen webmaster-aanwijzingen: Bijv. <!-- aanwijzing -->
function Clear_content($sContent) {
$sContent = str_replace ("[\r\n|\n]","", $sContent);
$pattern = "/<!--.*?-->/s";
$replacement = "";
$sContent = preg_replace($pattern, $replacement, $sContent);
return $sContent;
}
// FUNCTION: Clear_url
// Schoont de gegrabte URL op, door:
// - Alles in kleine letters.
// - Maak %?? weer normaal (bijv. %40 = @)
// - SESSION_ID's te verwijderen.
// - # aanduidingen uit URL's te filteren.
function Clear_url($sUrl) {
// PHPSESSID verwijderen.
$sUrl = strtolower(rawurldecode($sUrl));
// Op Windows servers is de backslash in een URL toegestaan. Bij Internet Explorer werkt het ook.
// Op Unix servers - en bij Mozilla Firefox - wordt dat niet geaccepteerd. Daarom geldt: \ = /
$sUrl = str_replace ("\\","/",$sUrl);
$array = explode('phpsessid=',$sUrl);
$sUrl = $array[0];
if(in_array(substr($sUrl,-1),array('?','&'))) {
$sUrl = substr($sUrl,0,strlen($sUrl)-1);
}
// # aanvulling verwijderen
$sUrl = preg_replace("/#(.*?)$/","", $sUrl);
return $sUrl;
}
// FUNCTION Search4hyperlinks
// Zoekt naar hyperlinks in een string van de webcontent.
function Search4hyperlinks($sContent){
if (preg_match("/<title>(.*)<\/title>/i", $sContent, $matches)) {
$this->_metainfo['title'] = $matches[1];
}
if ( preg_match_all( "/<a\s+.*?href=[\"\']?([^\"\' >]*)[\'\"]?[^>]*>(.*?)<\/a>/i", $sContent, $array, PREG_SET_ORDER ) ) {
foreach ($array as $key => $value){
// URL opschonen.
$sUrl = $this->Clear_url($value[1]);
// URL valideren
$sUrl = $this->Validate_url($sUrl);
// Opgeschoonde en gevalideerde URL's meenemen
if($sUrl) {
// Is URL binnen het zoekgebied?
if (strstr($sUrl, $this->Get_startdir())){
// Valt binnen het zoekgebied:
if ($this->Doublescanprotect($sUrl)){
// Indien niet eerder opgenomen, dan nu opnemen.
array_push ($this->_urllist,$sUrl);
}
}
}
}
}
}
// FUNCTIE Validate_url
// Bekijkt of een gevonden hyperlink gebruikt mag worden.
function Validate_url($sUrl) {
// Mailto: en Javascript hyperlinks negeren.
if (preg_match ("/^(mailto:|javascript:).*?/i",$sUrl,$aArray)){ return 0; }
// Geaccepteerde extenties:
//if (preg_match ("/.*?[.php|.php3|.htm|.html|.xhtml|.asp]$/",$sUrl,$aArray)){ echo '<b>!</b>'; return 0; }
if (!preg_match ("/[\.php|\.php3|\.htm|\.html|\.xhtml|\.shtml]$/i",$sUrl,$aArray)){ return 0; }
// Relatieve paden vanaf root absoluut maken en accepteren.
$karakter = substr($sUrl, 0, 1);
if ($karakter == '/' ){
$sBasedir = $this->Get_basedir();
$sBasedir = substr($sBasedir, 0, -1);
return $sBasedir . $sUrl;
}
// Overige relatieve paden absoluut maken en accepteren.
if (stristr($sUrl,"../")){
// Hoeveel directory's'hoger?
$aantal = substr_count($sUrl,"../");
$sUrl = substr ($sUrl, ($aantal * 3), strlen($sUrl));
// Bepaal het uitgaanspath:
$sPath = $this->Get_dir($sUrl);
// Haal de laatste / daar vanaf.
$sPath = substr ($sPath, 0, - 1);
// Ga x directory's hoger
for ($i = 1; $i < $aantal ;$i++){
$iPosition = strrpos($sPath, '/');
$sPath = substr ($sPath, 0, $iPosition);
}
$sUrl = $sPath . "/" . $sUrl;
// URL goedgekeurd.
return $sUrl;
}
// Hyperlinks naar andere websites negeren.
// Mijn host opzoeken.
$aMijndomein = parse_url($this->_starturl);
// Is dat gelijk aan de gevonden host.
if (in_array($aMijndomein['host'], parse_url($sUrl))) {
return $sUrl;
}
else {
// Zo nee, URL mogelijk ongeldig.
// Als de URL begint met http:// is deze niet geldig
if (stristr($sUrl,"http://")){
return 0;
}
else {
// Plak de URL achter het huidige path.
// Als dat een pagina oplevert, dan geldig.
$sDir = $this->Get_urldir();
if ($this->Is_url($sDir . $sUrl)) {
return $sDir . $sUrl;
}
// Als path + URL geen pagina oplevert.
// Dan niet geldig.
else {
return 0;
}
}
}
}
// FUNCTION: Doublescanprotect()
// Als URL al op lijst te scannen of gescande items staat -> 0 retour.
function Doublescanprotect($sUrl) {
if(in_array($sUrl,$this->_scannedlist)) { return 0; }
if(in_array($sUrl,$this->_urllist)) { return 0; }
return 1;
}
// FUNCTION: Listshift()
// Verplaatst URL van de lijst te scannen documenten naar gescande documentne.
function Listshift() {
// Te scannen URL's -> gescande URL's
array_push($this->_scannedlist,$this->_urllist[0]);
// Verwijderen van lijst te scannen URL's.
array_shift($this->_urllist);
}
// FUNCTION: Meta_reader()
// Leest de Metatags en verzamelt informatie.
function Meta_reader($sUrl){
if ($aTags = @get_meta_tags($sUrl)){
// Mag je indexeren?
if (array_key_exists('robots',$aTags)){
$aRobots = explode(',', strtolower($aTags['robots']));
// Kijk of je mag indexeren
if (in_array('index',$aRobots)){
$this->_metainfo['index'] = 1;
}
else {
$this->_metainfo['index'] = 0;
}
}
else {
$this->_metainfo['index'] = 1;
}
// Als je mag indexeren; zoek keywords en discription.
if($this->_metainfo['index']) {
if (array_key_exists('keywords',$aTags)){
$this->_metainfo['keywords'] = $aTags['keywords'];
}
// Description:
if (array_key_exists('description',$aTags)){
$this->_metainfo['description'] = $aTags['description'];
}
}
// Mag je volgen?
if (array_key_exists('robots',$aTags)){
$aRobots = explode(',', strtolower($aTags['robots']));
// Kijk of je mag indexeren
if (in_array('follow',$aRobots)){
$this->_metainfo['follow'] = 1;
return 1;
}
else {
$this->_metainfo['follow'] = 0;
return 0;
}
}
else {
$this->_metainfo['follow'] = 1;
return 1;
}
}
// URL ongeldig.
else {
return 0;
}
}
// FUNCTIE: Website_research():
// Website onderzoeken op hyperlinks
function Website_research(){
// Hoeveel bestanden moeten gescanned worden? (hier: 1)
$scanning = count($this->_urllist);
// Hoeveel bestanden zijn al gescand. (hier: 0)
$scanned = count($this->_scannedlist);
echo '<table>';
echo '<tbody><tr>';
for ($i = 1; ;$i++) {
if ($scanning == 0){
echo '<td colspan="3"><h2>Mededeling</h2>';
echo '<p><b>Uw website is geíndexeerd.</b></p><td>';
break;
}
// Beveiliging tegen een oneindige lus.
if ($i > 500) {
echo '<td colspan="3"><h2>Mededeling</h2>';
echo '<p>Om veiligheidsredenen is deze controle onderbroken.</p></td>';
break;
}
// Neem eerste URL:
$sUrl = $this->_urllist[0];
echo '<td>' . $sUrl . '<td>';
// Onthoud de directory van het te scannen bestand.
$this->Set_urldir($sUrl);
// URL van 'te scannen' naar 'gescande' lijst overbrengen.
$this->Listshift();
// Als pagina gevolgd mag worden.
if ($this->Meta_reader($sUrl)) {
echo '<td>Follow<td>';
// Grab inhoud van de pagina als string.
$sContent = $this->Grab_content($sUrl);
// Zoek Metatags en hyperlinks in deze string.
$this->Search4hyperlinks($sContent);
}
// Als webcrawlers mogen indexeren
if ($this->_metainfo['index']) {
// Als de pagina geen keywords heeft, heeft het geen zin
// de pagina op te nemen: er is dan immers niets om op te zoeken.
if (array_key_exists('keywords',$this->_metainfo) AND $this->_metainfo['keywords'] != ""){
echo '<td>Index<td>';
}
}
// Als de URL niet bestaat.
else {
echo '<td colspan="3"> </td>';
}
$scanned = count($this->_scannedlist);
$scanning = count($this->_urllist);
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
}
// FUNCTIE: Exectime
// Berekent de tijd die het script gedraaid heeft.
function Exectime() {
return round($this->getmicrotime() - $this->_startTime, 5);
}
// FUNCTIE Getmicrotime
// Functie gekopieerd uit het script Yapter 1.22 van Vincent Driessen
// Haalt de microtime op.
function getmicrotime() {
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
}
?>
-
29-07-2007, 10:27 #3Joris Willemsen Guest
Maar ik zoek ook iets wat dus het resultaat opslaat. In een database (MySQL).
Dus alle keywoorden en dergelijke.
-
29-07-2007, 10:30 #4
- Berichten
- 3
- Lid sinds
- 17 Jaar
Kijk anders HIER eens.
-
29-07-2007, 10:39 #5
- Berichten
- 468
- Lid sinds
- 18 Jaar
Origineel gepost door R. Masselink
Deze code heb ik ooit ergens gevonden.
....
-
29-07-2007, 15:22 #6Joris Willemsen Guest
Origineel gepost door R. Masselink
Kijk anders HIER eens.Laatst aangepast door Joris Willemsen : 29-07-2007 om 20:21
-
30-07-2007, 08:28 #7
- Berichten
- 3
- Lid sinds
- 17 Jaar
PhpDig is a web spider and search engine written in PHP, using a MySQL database and flat file support. PhpDig builds a glossary with words found in indexed pages. On a search query, it displays a result page containing the search keys, ranked by occurrence.
-
30-07-2007, 09:41 #8Joris Willemsen Guest
Origineel gepost door R. Masselink
Staat op de site
Edit: Dit script werkt niet, ik wil echt iets zoals Google oidLaatst aangepast door Joris Willemsen : 30-07-2007 om 10:52
-
30-07-2007, 16:11 #9
- Berichten
- 891
- Lid sinds
- 19 Jaar
Ik betwijfel of die crawlers in php geschreven worden...
-
30-07-2007, 16:31 #10
- Berichten
- 792
- Lid sinds
- 19 Jaar
@ Glenn: Dan moet je 24 / 7 een PHPscript runnen, wil je een beetje goede index krijgen.
Een standalone programmaatje is misschien beter op zijn plaats, maar een klein zoekmachinetje voor een paar (niet supergrote) sites kan makkelijk met PHP.
-
30-07-2007, 23:11 #11
- Berichten
- 212
- Lid sinds
- 19 Jaar
Ik wil maar even zeggen dat je niet moet proberen Google na te maken. Met 1 servertje en een php scriptje kom je er dan écht niet.
-
30-07-2007, 23:25 #12Joris Willemsen Guest
Ik weet het van de servers e.d., Lennard, kun jij het scripten?
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic