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>