PHP zoekscript

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Shakes

Shakes

25/11/2006 19:01:00
Quote Anchor link
Hallo,

Ik heb het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

$url
= $_GET['url'];

    $var = open_url($url);
            
    preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                    "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
                    $var, &$matches);
        
    $matches = $matches[1];
    $list = array();

    foreach($matches as $var)
    {
    
$url = $var;

    $var = open_url($url);
            
    preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                    "(.*?)[\"\']+.*?>
"."([^<]+|.*?)?<\/a>/",
$var, &$matches);

$matches = $matches[1];
$list = array();

foreach($matches as $link)
{
print($link."<br>");
}
}


// De functie

function open_url($url,$ref="")
{

$hfile = fopen($url,"r");
if($hfile){
while(!feof($hfile)){
$html.=fgets($hfile,1024);
}
}

return $html;
}

?>


Een URL die ik opgeef wordt doorlopen op URL's die op hun beurt ook weer doorlopen worden. Echter zijn er enkele problemen.

Hoe kan ik dubbele URL's voorkomen? Dat als een URL al aan de beurt is geweest hij niet nog een x getoond wordt? Hoe kan ik dat als een link bijv <a href="index.php"></a> is dat er dan gekeken wordt naar de host en die voor de url geplaatst wordt? Het kan met replace maar dan moet er gekeken worden of er geen http://blabla.com voor staat... in plaats van kijken of er iets staat en dat replacen.

Hoe kan ik in het script verwerken dat hij niet van een bepaalde domein mag afwijken dus stel ik maak een array("http://www.site1.nl", "http://www.site2.nl") en dan kijken of begin van URL in array voorkomt. Zoja, doorlopen zoniet dan stoppen.

Ga ondertussen zelf aan de slag maar dit waren wat vragen die bij me opkwamen terwijl ik met het script bezig was! Duurde al even voordat ik goed de URL's uit een pagina kon extracten...
Gewijzigd op 01/01/1970 01:00:00 door Shakes
 
PHP hulp

PHP hulp

20/11/2024 07:44:40
 
Shakes

Shakes

25/11/2006 19:06:00
Quote Anchor link
Zie nu ook een fout. Het checkt maar een level dieper... hoe kun je dat oneindig door laten gaan? Dus nu heb ik 1 extra foreach... hoe kun je dat automatiseren (dus niet dat ik 100 foreaches invul) dat hij automatisch steeds een level dieper gaat?
 
CrawlBackwards

CrawlBackwards

25/11/2006 21:02:00
Quote Anchor link
leek me een leuk probleem dus ben t is gaan proberen:
<pre>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$domein
= "cc13575-b.groni1.gr.home.nl";
$file = "http://cc13575-b.groni1.gr.home.nl/kcbprojects.php";
function
geturls($f){
    global $domein;
    static $array = array();
    static $count = 0;
    preg_match_all("/(\"|')((?:http|https):\/\/" . $domein . "(?:(?!\\1).)*)\\1/", file_get_contents($f), $subs, PREG_SET_ORDER);
    foreach($subs as $k => $v){
        if(!empty($v[2]) && !in_array($v[2], $array)){
             $array[] = $v[2];
            $count++;
            geturls($v[2]);
            $count--;
        }
    }

    if($count == 0) return $array;
}

$result = geturls($file);
print_r($result);
?>

</pre>
edit: if(!in_array()) toegevoegd
werkt denk ik zoals je wil
Gewijzigd op 01/01/1970 01:00:00 door CrawlBackwards
 
Shakes

Shakes

26/11/2006 12:00:00
Quote Anchor link
Thanks, ziet er inderdaad goed uit. Vanmiddag even meespelen!
 
CrawlBackwards

CrawlBackwards

26/11/2006 12:50:00
Quote Anchor link
het kan kleiner.. die counter heb je niet per see nodig maar die heb ik er voor mezelf ingezet.. is handig als je ook nog dimensies aan wilt geven

edit: die counter is ook niet nodig voor de return aangezien je $array ook een global kan maken
Gewijzigd op 01/01/1970 01:00:00 door CrawlBackwards
 
Shakes

Shakes

26/11/2006 15:22:00
Quote Anchor link
Ik heb ermee gespeeld en het werkt maar hij loopt te vaak vast.

Hoe kan ik van mijn originele script een functie maken zodat hij continu de volgend url ook doorloopt?

Dus in deze functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
  function open_url($url,$ref="")
    {

            $hfile = fopen($url,"r");
            if($hfile){
                while(!feof($hfile)){
                    $html.=fgets($hfile,1024);
                }
            }

        return $html;
    
    }


Eigenlijk dit toevoegen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$test = open_url($url);
            
    preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                    "(.*?)[\"\']+.*?>
"."([^<]+|.*?)?<\/a>/",
$test, &$matches);

$matches = $matches[1];
$list = array();

foreach($matches as $var)
{

echo $var;
echo '<br />';

$test = open_url($var);





}


Functies schrijven is niet echt mijn sterkste kant... eigenlijk hoef ik altijd scripts maar eenmaal te gebruiken dus dan is een functie overbodig. Nu moet de functie zich zelf eigenlijk steeds herhalen met de preg_match etc..
 
CrawlBackwards

CrawlBackwards

26/11/2006 19:54:00
Quote Anchor link
hoe bedoel je hij loopt vast? bedoel je dan de tijds limiet? dan moet je die omhoog zetten met set_time_limit..
je hebt zowiezo een recursive function nodig dus wat jij hier boven hebt staan gaat niet werken

in je bovenste functie geef je $ref aan maar die gebruik je niet..
en zo zitten der een paar andere dingen in die volgens mij niet echt kloppen..
het is nou eenmaal een script dat wat meer tijd kost maar dat die echt vast loopt lijkt me sterk..

edit: ohja nog is over dat je geen herhalende functie wil gebruiken.. dit heb je nodig als je een oneindig aantal pagina's langs wil gaan, anders moet je toch echt met een limiet werken.
Gewijzigd op 01/01/1970 01:00:00 door CrawlBackwards
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.