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
Cosa sbaglio?codice:IF System.DbNull.Value.Equals(node.Attributes("rel")) or node.Attributes("rel").Value <> "nofollow" Then
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>

Rispondi quotando
