Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Replica di un crawler

  1. #1

    Replica di un crawler

    Ciao,
    sto simulando un crawler, ho dei problemi relativi al contatore Ris che ho inserito all interno della funzione ricorsiva.
    Ho dichiarato come variabili globali Ris e MaxRis valorizzando ques ultima a 5.
    Vorrei quindi che nel momento in cui ho 5 link si interrompesse invece ne restituisce sempre qlk d uno in più, come mai?

    Il secondo problema è relativo al controllo dell attributo rel del tag a, mi da errore la seguente frase
    codice:
    IF System.DbNull.Value.Equals(node.Attributes("rel")) or node.Attributes("rel").Value <> "nofollow" Then
    Cosa sbaglio?
    Grazie mille

    codice:
    <html><head>
    <title>Crawler</title>
    </head>
    <body>
    <%@ Page Language="VB" Trace="false" Debug="true" aspcompat=true%>
    
    
    <%@ Import Namespace="System.Net" %>
    <%@ import Namespace="HtmlAgilityPack" %>
    <%@ import Namespace="System.IO" %>
    
    
    <script runat="server">
    
    
    'Variabili per gestire i livelli di profondità della funzione ricorsiva
    Dim Ris=0
    Dim MaxRis=5
    
    
    'Variabili per la connessione al DB
    Dim connProxy
    Dim strSQL
    Dim rs
    
    
    'Funzione ricorsiva
    function ScanPage(URL)
    
    
    	'Variabili relative alle varie elaborazioni che dovremmo affrontare
    	Dim GstrPagina as String
    	Dim GLink as String
    	Dim RobotsTxt
    
    
      'Variabile per chiamare le pagine
      Dim wc As New WebClient()
      wc.Headers.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31")
    
    
      'Il file robots.txt è un semplicissimo file di testo che va inserito (qualora lo si voglia utilizzare) nella cartella di root del proprio sito Web e serve ad indicare agli spider dei motori di ricerca alcune semplici direttive circa l indicizzazione di determinati file o intere cartelle.
      'Apro il file robots.txt 
      'TRY
      'Oggettino che permette di aprire i link
      'Dim byteArray() As Byte = wc.DownloadData(URL+"/robots.txt")
      'RobotsTxt = Encoding.UTF8.GetString(byteArray)
      'response.write(RobotsTxt)
      'CATCH ex1 As Exception
      '  response.write("Errore: " + ex1.Message+"<br>")
      'END TRY
    
    
      'Oggettino che permette di aprire il link 
      Dim byteArray2() As Byte = wc.DownloadData(URL)
      GstrPagina = Encoding.UTF8.GetString(byteArray2)
     
      'Creo il path in cui andrò a salvare il file
      Dim strPaginaSaved As String = Server.MapPath("/public/") + "tmp.htm"
    
    
      'Salvo il file temporaneo della pagina HTML scaricata             
      Dim sw As New StreamWriter(strPaginaSaved, False, System.Text.Encoding.UTF8)
      sw.Write(GstrPagina)
      sw.Close()
    
    
      'Carico file HTML
      Dim doc As New HtmlDocument()
      doc.Load(strPaginaSaved)
      
      'Stampo a video l URL da cui stiamo estrapolando i link
      response.write("URL "+URL)
      response.write("<br>")
      
      'Ciclo sulla pagina per prendere i suoi link
      FOR Each node As HtmlNode In doc.DocumentNode.SelectNodes("//a")
      
        'Controllo che l attributo rel, relativo al tag trovato a, non sia valorizzato con nofollow (Viene valorizzato con nofollow quando non vuole essere indicizzato)
        'IF System.DbNull.Value.Equals(node.Attributes("rel")) or node.Attributes("rel").Value <> "nofollow" Then
          GLink = node.Attributes("href").Value
          
          'Evito eventuali link trovati non validi
          IF (INSTR(GLink,"javascript")<=0) AND (INSTR(GLink,"mailto")<=0) AND (INSTR(GLink,"#")<=0)
          
            'Controllo che il link sia composto da un path assoluto altrimenti lo rendo tale
            IF (INSTR(GLink,"http")<=0)
              GLink=URL+GLink
            END IF
    
    
          	' Esecuzione frase SQL
            strSQL = "SELECT * FROM PAGINA WHERE URL='"+GLink+"'" 
            rs.Open(strSQL,connProxy,1)   
    		
            'Indicizzo la pagina
            'Controllo, se il link è già presente nel DB lo aggiorno altrimenti lo inserisco
            IF (NOT(rs.Fields("URL").Value() Is Nothing OrElse rs.Fields("URL").Value() Is DBNull.Value)) THEN
              ' Esecuzione frase SQL
              strSQL = "UPDATE INTO PAGINA (URL,STRPAGINA) VALUES ('"+GLink+"','"+GstrPagina+"')" 
              rs.Open(strSQL,connProxy,1) 
            ELSE
              ' Esecuzione frase SQL
              strSQL = "INSERT INTO PAGINA (URL,STRPAGINA) VALUES ('"+GLink+"','"+GstrPagina+"')" 
              connProxy.Execute(strSQL) 
            END IF
          
            'Incremento il contatore
            Ris=Ris+1
            
            'Stampo a video il risultato
            response.write(Ris)
            response.write(".) ")
            response.write(GLink)
            response.write("<br>")
    
    
            'Controllo il numero di link trovati, se non fossi arrivato al numero di link voluti chiamo la funzione ricorsiva 
            IF (Ris<MaxRis)
              ScanPage(GLink)
            ELSE
              EXIT FOR
            END IF
           
          END IF
          
        'END IF
        
      NEXT
      
    end function
      
    Public Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
    	'Creo connessione al db
      rs = Server.CreateObject("ADODB.Recordset")
    	connProxy = Server.CreateObject("ADODB.Connection")
    	connProxy.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/mdb-database/Crawler.mdb")	
       
    	'Apro connessione al db
    	connProxy.Open()
      
      'Leggo il file dove ci sono i link alle pagine
      Dim Line
      Dim sr As New StreamReader("c:\inetpub\wwwroot\public\link.txt")
      DO WHILE not(sr.EndOfStream)
      Line=sr.ReadLine()
      try
        ScanPage(Line)
      CATCH ex1 As Exception
        response.write("Errore: " + ex1.Message+"<br>")
      END TRY
      LOOP
      sr.Close()
      
      ' Chiusura connessione
      rs = Nothing
      connProxy.Close()
      connProxy = nothing
      
    end sub	
    
    
    </script>
    </body>
    </html>

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Quote Originariamente inviata da mirko000 Visualizza il messaggio
    Ciao,
    sto simulando un crawler, ho dei problemi relativi al contatore Ris che ho inserito all interno della funzione ricorsiva.
    Ho dichiarato come variabili globali Ris e MaxRis valorizzando ques ultima a 5.
    Vorrei quindi che nel momento in cui ho 5 link si interrompesse invece ne restituisce sempre qlk d uno in più, come mai?

    Il secondo problema è relativo al controllo dell attributo rel del tag a, mi da errore la seguente frase
    codice:
    IF System.DbNull.Value.Equals(node.Attributes("rel")) or node.Attributes("rel").Value <> "nofollow" Then
    Cosa sbaglio?
    Grazie mille

    codice:
    <html><head>
    <title>Crawler</title>
    </head>
    <body>
    <%@ Page Language="VB" Trace="false" Debug="true" aspcompat=true%>
    
    
    <%@ Import Namespace="System.Net" %>
    <%@ import Namespace="HtmlAgilityPack" %>
    <%@ import Namespace="System.IO" %>
    
    
    <script runat="server">
    
    
    'Variabili per gestire i livelli di profondità della funzione ricorsiva
    Dim Ris=0
    Dim MaxRis=5
    
    
    'Variabili per la connessione al DB
    Dim connProxy
    Dim strSQL
    Dim rs
    
    
    'Funzione ricorsiva
    function ScanPage(URL)
    
    
        'Variabili relative alle varie elaborazioni che dovremmo affrontare
        Dim GstrPagina as String
        Dim GLink as String
        Dim RobotsTxt
    
    
      'Variabile per chiamare le pagine
      Dim wc As New WebClient()
      wc.Headers.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31")
    
    
      'Il file robots.txt è un semplicissimo file di testo che va inserito (qualora lo si voglia utilizzare) nella cartella di root del proprio sito Web e serve ad indicare agli spider dei motori di ricerca alcune semplici direttive circa l indicizzazione di determinati file o intere cartelle.
      'Apro il file robots.txt 
      'TRY
      'Oggettino che permette di aprire i link
      'Dim byteArray() As Byte = wc.DownloadData(URL+"/robots.txt")
      'RobotsTxt = Encoding.UTF8.GetString(byteArray)
      'response.write(RobotsTxt)
      'CATCH ex1 As Exception
      '  response.write("Errore: " + ex1.Message+"<br>")
      'END TRY
    
    
      'Oggettino che permette di aprire il link 
      Dim byteArray2() As Byte = wc.DownloadData(URL)
      GstrPagina = Encoding.UTF8.GetString(byteArray2)
     
      'Creo il path in cui andrò a salvare il file
      Dim strPaginaSaved As String = Server.MapPath("/public/") + "tmp.htm"
    
    
      'Salvo il file temporaneo della pagina HTML scaricata             
      Dim sw As New StreamWriter(strPaginaSaved, False, System.Text.Encoding.UTF8)
      sw.Write(GstrPagina)
      sw.Close()
    
    
      'Carico file HTML
      Dim doc As New HtmlDocument()
      doc.Load(strPaginaSaved)
      
      'Stampo a video l URL da cui stiamo estrapolando i link
      response.write("URL "+URL)
      response.write("<br>")
      
      'Ciclo sulla pagina per prendere i suoi link
      FOR Each node As HtmlNode In doc.DocumentNode.SelectNodes("//a")
      
        'Controllo che l attributo rel, relativo al tag trovato a, non sia valorizzato con nofollow (Viene valorizzato con nofollow quando non vuole essere indicizzato)
        'IF System.DbNull.Value.Equals(node.Attributes("rel")) or node.Attributes("rel").Value <> "nofollow" Then
          GLink = node.Attributes("href").Value
          
          'Evito eventuali link trovati non validi
          IF (INSTR(GLink,"javascript")<=0) AND (INSTR(GLink,"mailto")<=0) AND (INSTR(GLink,"#")<=0)
          
            'Controllo che il link sia composto da un path assoluto altrimenti lo rendo tale
            IF (INSTR(GLink,"http")<=0)
              GLink=URL+GLink
            END IF
    
    
              ' Esecuzione frase SQL
            strSQL = "SELECT * FROM PAGINA WHERE URL='"+GLink+"'" 
            rs.Open(strSQL,connProxy,1)   
            
            'Indicizzo la pagina
            'Controllo, se il link è già presente nel DB lo aggiorno altrimenti lo inserisco
            IF (NOT(rs.Fields("URL").Value() Is Nothing OrElse rs.Fields("URL").Value() Is DBNull.Value)) THEN
              ' Esecuzione frase SQL
              strSQL = "UPDATE INTO PAGINA (URL,STRPAGINA) VALUES ('"+GLink+"','"+GstrPagina+"')" 
              rs.Open(strSQL,connProxy,1) 
            ELSE
              ' Esecuzione frase SQL
              strSQL = "INSERT INTO PAGINA (URL,STRPAGINA) VALUES ('"+GLink+"','"+GstrPagina+"')" 
              connProxy.Execute(strSQL) 
            END IF
          
            'Incremento il contatore
            Ris=Ris+1
            
            'Stampo a video il risultato
            response.write(Ris)
            response.write(".) ")
            response.write(GLink)
            response.write("<br>")
    
    
            'Controllo il numero di link trovati, se non fossi arrivato al numero di link voluti chiamo la funzione ricorsiva 
            IF (Ris<MaxRis)
              ScanPage(GLink)
            ELSE
              EXIT FOR
            END IF
           
          END IF
          
        'END IF
        
      NEXT
      
    end function
      
    Public Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    
        'Creo connessione al db
      rs = Server.CreateObject("ADODB.Recordset")
        connProxy = Server.CreateObject("ADODB.Connection")
        connProxy.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/mdb-database/Crawler.mdb")    
       
        'Apro connessione al db
        connProxy.Open()
      
      'Leggo il file dove ci sono i link alle pagine
      Dim Line
      Dim sr As New StreamReader("c:\inetpub\wwwroot\public\link.txt")
      DO WHILE not(sr.EndOfStream)
      Line=sr.ReadLine()
      try
        ScanPage(Line)
      CATCH ex1 As Exception
        response.write("Errore: " + ex1.Message+"<br>")
      END TRY
      LOOP
      sr.Close()
      
      ' Chiusura connessione
      rs = Nothing
      connProxy.Close()
      connProxy = nothing
      
    end sub    
    
    
    </script>
    </body>
    </html>
    Scusami ma con CRAWLER intendi il sistema che utilizzano i motori di ricerca per indicizzare le pagine?

  3. #3
    Yes!

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Quote Originariamente inviata da mirko000 Visualizza il messaggio
    Yes!
    Ciao metti maxris a 4 ed il problema dovrebbe essere risolto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.