Avatar billede cmau Nybegynder
27. juli 2005 - 00:30 Der er 36 kommentarer og
1 løsning

finde alle links i kildekode

Hejsa, hvordan kan jeg gøre sådan at alle links i en kilde kode bliver smidt i en database?

Jeg henter kilde koden sådan her:

$handle = fopen("$url", "rb");
$contents = '';
while (!feof($handle)) {
  $contents .= fread($handle, 8192);
}
fclose($handle);
Avatar billede cmau Nybegynder
27. juli 2005 - 00:43 #1
Jeg prøver med det her, men det virker ikke:

<?
$link_array = array();
function get_link($link) {
$link_array[] = $link;
echo "gemmer i array<br>";
}
$data = "df sdf dsf sdf s http://www.woox.dk df sdf sdf sdf sdf http://www.wosadox.dk";

if($data = ereg_replace("http://([a-zA-Z0-9@:%_.~#-\?&]*)", $link =

"http://\\1".get_link($link), $data)) {
echo $data;

foreach($link_array as $v) {
echo $v;
}
}
?>
Avatar billede coderdk Praktikant
27. juli 2005 - 00:55 #2
Nu får du lige en avanceret udgave:

<?php

    $url = 'http://underholdning.jubii.dk/film/news.asp?articleid=195292';
    preg_match( '!http://([^/]+)(/.*)?$!', $url, $m );
    $host = 'http://' . $m[1];
    $path = $m[2];
    if ( strlen( $path ) > 0 && substr( $path, -1 ) != '/' )
    {
        $path = dirname( $path ) . '/';
    }
    $cnt = file_get_contents( $url );
    if ( preg_match_all( '§<a.*?href="(.*?)"§si', $cnt, $m ) )
    {
        foreach ( $m[1] as $link )
        {
            if ( !preg_match( '!^java script:!i', $link ) && $link != '#' )
            {
                if ( !preg_match( '!^http://!', $link ) )
                {
                    if ( $link[0] == '/' )
                    {
                        $link = $host . $link;
                    }
                    else
                    {
                        $link = $host . $path . $link;
                    }
                }
                echo "Fik $link<br>";
            }
        }
    }

?>
Avatar billede cmau Nybegynder
27. juli 2005 - 00:59 #3
Det skal være sådan at den kun må finde det samme link 1 gang den skal også tjekke i databasen ved hvert link og se om det allerede findes.
Avatar billede cmau Nybegynder
27. juli 2005 - 01:00 #4
+ den skal ikke tage javascript med kun ganske admindelige links hvor der står http:// foran
Avatar billede coderdk Praktikant
27. juli 2005 - 01:01 #5
Der hvor jeg echo "Fik" etc... skal du sætte ind i databasen, der kan du putte logikken ind som checker om du har linket.
Den tager ikke javascript eller # med...
Avatar billede coderdk Praktikant
27. juli 2005 - 01:04 #6
Hov vil du kun lave links med som har http:// foran? Så får du jo typisk ikke så mange links - De fleste linker jo bare til deres egne sider på sitet med /sti/script.php eller script.php...
Avatar billede coderdk Praktikant
27. juli 2005 - 01:05 #7
En nem måde at sikre at du ikke får det samme link to gange, er at sætte en UNIQUE contraint på URL feltet i din database og så sætte URL'en ind med: INSERT IGNORE INTO
Avatar billede cmau Nybegynder
27. juli 2005 - 01:06 #8
til at lave opstillingen med indryk og
if()
{
}

istedet for if () {}

er der et program til det?
Avatar billede cmau Nybegynder
27. juli 2005 - 01:11 #9
Kan du gøre sådan at den fjerner www.

  preg_match( '!http://([^/]+)(/.*)?$!', $url, $m );
    $host = 'http://' . $m[1];
    $path = $m[2];
    if ( strlen( $path ) > 0 && substr( $path, -1 ) != '/' )
    {
        $path = dirname( $path ) . '/';
    }
    $cnt = file_get_contents( $url );
    if ( preg_match_all( '§<a.*?href="(.*?)"§si', $cnt, $m ) )
    {
        foreach ( $m[1] as $link )
        {
            if ( !preg_match( '!^java script:!i', $link ) && $link != '#' )
            {
                if ( !preg_match( '!^http://!', $link ) )
                {
                    if ( $link[0] == '/' )
                    {
                        $link = $host . $link;
                    }
                    else
                    {
                        $link = $host . $path . $link;
                    }
                }
$query = mysql_query("SELECT * FROM search_links WHERE url='$link'");
if(mysql_num_rows($query) == 0) {
mysql_query("INSERT INTO search_links (url,last_check) VALUES ('$url','$time')") or die(mysql_error());
}
            }
        }
    }
Avatar billede coderdk Praktikant
27. juli 2005 - 13:21 #10
Mnææh kender ikke lige et program der kan formattere koden sådan...

Hvorfor vil du fjerne www.? Det er ikke alle sites der virker uden... Men prøv:

    preg_match( '!http://(www\.)?([^/]+)(/.*)?$!', $url, $m );
    $host = 'http://' . $m[2];
    $path = $m[3];
Avatar billede cmau Nybegynder
27. juli 2005 - 15:50 #11
jamen hvis jeg fjerner http:// og skriver www. er der andre sider der ikke virker og hvis jeg bare lader den godtage begge dele vil både http://woox.dk og http://www.woox.dk komme i maskinen.
Avatar billede coderdk Praktikant
27. juli 2005 - 15:53 #12
Har du prøvet den kode jeg gav dig? Den laver http://www.woox.dk om til http://woox.dk :P
Avatar billede cmau Nybegynder
27. juli 2005 - 16:49 #13
Men du siger jo nogle sider krøver www.
Avatar billede coderdk Praktikant
27. juli 2005 - 16:54 #14
Hmm ja :) Måske skal du teste på begge?

    preg_match( '!http://(www\.)?([^/]+)(/.*)?$!', $url, $m );
    $host = 'http://' . $m[2];
    $originalhost = 'http://' . $m[1] . $m[2];
    $path = $m[3];

Så skal du teste både med $host og $originalhost ;)
Avatar billede cmau Nybegynder
28. juli 2005 - 11:24 #15
Teste? hvad mener du?
Avatar billede coderdk Praktikant
28. juli 2005 - 18:33 #16
Teste om linket findes i databasen med og uden www
Avatar billede cmau Nybegynder
29. juli 2005 - 11:19 #17
ååh nej :S Nu har jeg fulstændig ødelagt min kode :( Intet virker mere, vil du se på det? Så kunne jeg sætte point satsen op. Hvis du vil, vil du så ikke også smide det her ind, det skal være sådan at hvis $tags[title] ikke findes skal den finde den ved nedenstående.

$handle = fopen($url, "r");
while (!feof($handle))
{
    $content .= fread($handle, 4096);
}
fclose($handle);

if (preg_match("/<title>(.*?)</title>/i", $content, $matches)
    $title = $matches[1];

Hele min kode: www.babegalleri.dk/search/meta.phps
Avatar billede coderdk Praktikant
29. juli 2005 - 12:23 #18
Hmm ja, det ligner jo ikke så meget det jeg har lavet :P Men prøv dette:

<?php

    include('sql.php');
    $url = $_GET['url'];

    if ( isset( $url ) )
    {
        $tags = get_meta_tags($url);
        $time = time();
        $title = $tags['title'];
        $description = $tags['description'];
        $keywords = $tags['keywords'];

        if ( empty( $title ) || empty( $description ) || empty( $keywords ) )
        {
            echo "Der mangler metatags på siden, det er krævet at følgende findes:<br>title<br>keywords<br>description";
        }
        else
        {
            if ( preg_match( "/http:\/\/(www\.)?([^/]+)(/.*)?\//i", $url, $m ) )
            {
                if ( $m[1] == '' )
                {
                    $url = 'www.' . $m[2];
                }
                $host = 'http://' . $m[1];
                $path = $m[2];
                $orglink = 'http://' . $m[1] . $m[2] . $m[3];
                $nowwwlink = 'http://' . $m[2] . $m[3];
            }

            $contents = file_get_contents( $url );
            if ( $tags['title'] == '' )
            {
                if ( preg_match( '/<title>(.*?)<\/title>/is', $contents, $match ) )
                {
                    $title = $match[1];
                }
            }

            $query = mysql_query("SELECT * FROM search_data WHERE url='$url' OR url='$nowwwlink'");
            if ( mysql_num_rows( $query ) == 0 )
            {
                mysql_query("INSERT INTO search_data (url,title,description,keywords,last_check) VALUES ('$url','$title','$description','$keywords','$time')") or die(mysql_error());
            }
            else
            {
                mysql_query("UPDATE search_data SET title='$title', description='$description', keywords='$keywords', last_check='$time' WHERE url='$url' OR url='$nowwwlink'") or die(mysql_error());
            }
            echo "Denne data blev smidt i databasen, for domænet $url:<br>$title<br>$keywords<br>$description";

            //find links
            if ( strlen( $path ) > 0 && substr( $path, -1 ) != '/' )
            {
                $path = dirname( $path ) . '/';
            }
            $cnt = file_get_contents( $url );
            if ( preg_match_all( '§<a.*?href="(.*?)"§si', $cnt, $m ) )
            {
                foreach ( $m[1] as $link )
                {
                    if ( !preg_match( '!^java script:!i', $link ) && $link != '#' )
                    {
                        $link2 = '';
                        if ( !preg_match( '!^http://!', $link ) )
                        {
                            if ( $link[0] == '/' )
                            {
                                $link = $host . $link;
                                $link2 = $nowwwlink . $link;
                            }
                            else
                            {
                                $link = $host . $path . $link;
                                $link2 = $nowwwlink . $path . $link;
                            }
                        }
                        else
                        {
                            if ( preg_match( "/http:\/\/(www\.)?([^/]+)(/.*)?\//i", $link, $m2 ) )
                            {
                                if ( $m2[1] == '' )
                                {
                                    $link2 = 'http://www.' . $m2[2] . $m2[3];
                                }
                            }
                        }
                        $query = mysql_query("SELECT * FROM search_data WHERE url='$link' OR url='$link2'");
                        if ( mysql_num_rows( $query ) == 0 )
                        {
                            mysql_query("INSERT INTO search_data (url,title,description,keywords,last_check) VALUES ('$link','','','','')") or die(mysql_error());
                            echo "DEBUG: Satte $link ind uden andet data...<br>";
                        }
                    }
                }
            }
        }
    }
    else
    {
        echo '<form name="formen" method="GET" action="meta.php" enctype="multipart/form-data"><input value="http://" size="50" name="url">&nbsp;<input type="submit" value="Smid min side i søge maskinen!!"></form>';
    }

?>
Avatar billede coderdk Praktikant
29. juli 2005 - 12:24 #19
Links som den finder smider den bare i databasen uden noget andet end URL'en, så kan du evt lave en lille løkke der går alle links igennem der ikke har en tom last_check...
Avatar billede cmau Nybegynder
29. juli 2005 - 17:41 #20
Det sidste fik jeg ikke helt fat i :S
Avatar billede coderdk Praktikant
29. juli 2005 - 17:50 #21
hehhe prøv at se om den ikke gør hvad du vil have ;P
Avatar billede cmau Nybegynder
29. juli 2005 - 20:02 #22
Får fejl:
http://babegalleri.dk/search/meta.php?url=http%3A%2F%2Fwww.woox.dk

Men det med title virker vist ikke helt, fordi når jeg prøver at skrive http://www.exp.dk får jeg stadigvæk:

Der mangler metatags på siden, det er krævet at følgende findes:
title
keywords
description

Selvom exp.dk har meta-keywords og meta-description og <title>
Avatar billede cmau Nybegynder
29. juli 2005 - 20:04 #23
+ en ven gav den idé at den når man åbnede siden kunne hente fra search_links og finde den ældste via last_check også søge den side og opdater eller indsætte den i search_data alt efter om den er der eller ej. Når den så har tjekket den side, starter den bare med en ny, så vinduet selv opdatere også kan man bare lukke når den ikke skal søge mere.
Avatar billede cmau Nybegynder
29. juli 2005 - 20:04 #24
Sådan at det faktisk bliver en robot.
Avatar billede coderdk Praktikant
29. juli 2005 - 21:39 #25
if ( preg_match( "/http:\/\/(www\.)?([^/]+)(/.*)?\//i", $url, $m ) )

skal blive:

if ( preg_match( "/http:\/\/(www\.)?([^\/]+)(/.*)?\//i", $url, $m ) )
Avatar billede coderdk Praktikant
29. juli 2005 - 21:41 #26
Det virker det med titel virker - Dog ikke med exp.dk (og muligvis andre) - Mit gæt er at de checker på HTTP_USER_AGENT eller lign - Hvis det skal virke med exp.dk skal vi erstatte file_get_contents med noget smartere der arbejder med sockets...
Avatar billede cmau Nybegynder
30. juli 2005 - 11:24 #27
Jeg ved ikke lige hvor meget der hjalp at rette den linje;
http://babegalleri.dk/search/meta.php?url=http%3A%2F%2Fwww.woox.dk

socket :/ Kan jeg ikke finde ud af, jeg har i hvert fald aldrig prøve.
Avatar billede cmau Nybegynder
30. juli 2005 - 20:18 #28
Ved du hvad fejlen er?
Avatar billede coderdk Praktikant
31. juli 2005 - 14:33 #29
Der var en fejl mere:

  if ( preg_match( "/http:\/\/(www\.)?([^\/]+)(/.*)?\//i", $url, $m ) )

Skal være:

  if ( preg_match( "/http:\/\/(www\.)?([^\/]+)(\/.*)?\//i", $url, $m ) )

I stedet for file_get_contents kan du bruge denne funktion:

    function get_url_contents( $url )
    {
        $result = '';
        if ( preg_match( "§http://([^/]+)(/.*)§i", $url, $m ) )
        {
            $host = $m[1];
            $path = $m[2];
            if ( $fp = fsockopen( $host, 80, $en, $es, 3 ) )
            {
                fwrite( $fp, "GET $path HTTP/1.0\r\nHost: $host\r\n" );
                fwrite( $fp, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050720 Firefox/1.0.6\r\n" );
                fwrite( $fp, "Connection: Close\r\n\r\n" );
                while ( !feof( $fp ) )
                {
                    $result .= fread( $fp, 2048 );
                }
                fclose( $fp );
                $result = preg_replace( '/^.*?\r?\n\r?\n(.*)$/is', '\\1', $result );
            }
        }
        return $result;
    }
   

Som eksempel kan du prøve den med:

    echo get_url_contents( 'http://www.eksperten.dk/' );
Avatar billede cmau Nybegynder
01. august 2005 - 11:20 #30
Nu virker det næsten, men er ikke sikker på at du har forstået min ide:

Først skal smide smide et link hvor den skal begynde ind i search_links. Så når jeg åbner meta.php skal den søge i search_links og finde den der er ældst over 1 uge gammel, men der er jo kun den ene jeg starter med. Så vælger den den, finder data, hvis der ikke er title, keywords og desciption (alle 3 skal være der, hvis de ikke er skal den starte på en ny også lige update last_check, så den ikke vælger den samme igen) skal den ikke sætte linket ind Inden den sætter en ny record ind skal den tjekke om den allerede findes og hvis den gør det skal den bare update. Når den så har gjort det skal den tage alt html kode på siden og finde alle links og tjekker om de finde i search_links også hvis de ikke går bliver de smidt i. Nu er den førdig med første søgning, så skal den bare gå i ring og starte forfra. Når der så ikke er nogen der er over en uge gammel skal den skrive det og give mulighed for at indtaste et ny link hvor den skal starte.
Avatar billede coderdk Praktikant
01. august 2005 - 11:51 #31
Nu er vi da nået rimeligt langt ud over dit oprindelige spørgsmål :P

Det lyder som du vil lave en "rigtig" crawler - Altså en der finder links på sider, og følger dem - Du kan godt risikere at den pludselig skal køre nogle hundrede tusinde sider igennem ;P Som jeg har sagt til andre, så synes jeg ikke at PHP er et godt sprog at skrive en søgerobot i ;)

Anyway, det burde være en smal sag at lave koden om til en funktion som tog fra et array med links i, indtil der ikke var flere links i...
Avatar billede cmau Nybegynder
01. august 2005 - 12:08 #32
Ja kan godt se at der hurtigt kan komme mange links, men jeg kna altså bare ikke finde ud af et array :/ men det er her bare noget mig og nogle venner vil prøve, for at lave en lille søge maskine.

Har set en lavet i php, men ved ikke om den hentede resultatet ud fra en anden side, men man søgte bare også fandt den en masse records, via php. Den blev lavet af en bruger her inde fra, drinkit.
Avatar billede cmau Nybegynder
03. august 2005 - 18:42 #33
.. ?
Avatar billede cmau Nybegynder
06. august 2005 - 10:56 #34
Coderdk?
Avatar billede coderdk Praktikant
06. august 2005 - 12:34 #35
Hvad mangler du?
Avatar billede cmau Nybegynder
06. august 2005 - 17:59 #36
Hmm ikke noget, min fejl, forkerte jeg vill have fat i dig :P
Avatar billede thomas_b Nybegynder
15. januar 2009 - 00:41 #37
coderdk >> Hvis jeg ikke tager meget fejl har du så ikke hjulpet mig med asp også...

Kunne jeg ikke logge dig til at formatere dette fede script over til mig i asp...
Hvis du vil have point kan vi godt finde ud af det også... ???
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester