Página 1 de 1

Araña busca enlaces

Publicado: 01 Abr 2010, 02:03
por Pablo2m
Hola, en base a un codigo bastante "maligno" tengo medio adaptado. Aun le falta adaptar algo que valla copiando las direcciones externas con algun criterio , ¿Para que serviria un codigo asi? bueno cuando este terminado podrian ejecutarlo sobre un blog de discos de musica y conseguir los enlaces de todos lo discos por dar un ejemplo
Queria que lo vieran para ver que le encuentran .
Saludos

Código: Seleccionar todo

#include <inet.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>

HotKeySet("{ESC}", "Parar")

$firsturl="http://"&"strelki.info" ; es nesesario el http
$dbname="nombre" & ".db" ; no poner algo mas que letras
$max_level=5 ; poner cero para sin limites de profundidad

Dim $ignorar[9] = [".jpg",".gif",".png",".bmp",".ico",".css","rss","rand=",".js"]

Local $info
Dim $szProtocol, $szDomain, $szPath, $szFile

_SQLite_Startup() ; buen dia base de SQlite
If NOT FileExists($dbname) Then ; chequeamos si existe la base de datos, si no existe se crea
$dbn=_SQLite_Open($dbname)
_SQLite_Exec($dbn,"CREATE TABLE urls (id INTEGER,url TEXT, level INTEGER, PRIMARY KEY (id), UNIQUE (url) ON CONFLICT IGNORE);")
_SQLite_Exec($dbn,"CREATE TABLE externos (id INTEGER,afuera TEXT, PRIMARY KEY (id), UNIQUE (afuera) ON CONFLICT IGNORE);")
_SQLite_Exec($dbn,"CREATE TABLE info (id INTEGER,lasturl TEXT, PRIMARY KEY (id));")
_SQLite_Exec($dbn,"INSERT INTO urls (url, level) VALUES ('"&$firsturl&"', 1);")
_SQLite_Exec($dbn,"INSERT INTO info (lasturl) VALUES ('1');")


Else
$dbn=_SQLite_Open($dbname)
EndIf

_SQLite_Exec($dbn,"PRAGMA cache_size=500000;")
_SQLite_Exec($dbn,"PRAGMA synchronous=OFF;")
_SQLite_Exec($dbn,"PRAGMA temp_store=2;")
_SQLite_Exec($dbn,"PRAGMA journal_mode=MEMORY;")

_SQLite_QuerySingleRow($dbn,"SELECT lasturl FROM info WHERE id=1",$info) ; busca la ultima pagina visitada

$o=$info[0]-1
$changes=1

While 1

	$o=$o+1
	Local $url_query
	Local $level_query
	if stringright($o,1)=0 Then _SQLite_Exec($dbn,"UPDATE info SET lasturl='"&$o&"';")
	_SQLite_QuerySingleRow($dbn,"SELECT url FROM urls WHERE id=" & $o,$url_query)
	_SQLite_QuerySingleRow($dbn,"SELECT level FROM urls WHERE id=" & $o,$level_query)
	$url=$url_query[0]
	$level=$level_query[0]
	;ConsoleWrite(@CR & $o & " Bajando url nivel:" & $level &" Direccion: " & $url)

	$source=_INetGetSource($url)
	$url_array = StringRegExp($source, '(?i)href=([^<>#\h]+)', 3)
	If @error = 0 Then
	$big_insert=""
		For $i = 0 To UBound($url_array) - 1
		 $found_url=$url_array[$i]

		 If $max_level<>0 Then
			 If $level>=$max_level then
				 ConsoleWrite(@CR & $o & " No se baja la url " & $found_url &" por haberse superado el limite")
				 ContinueLoop
			 EndIf
		 EndIf

         For $P=1 To $ignorar [0]
			 If StringInStr($found_url,$ignorar ($P),2) <> 0 then
			     ContinueLoop (2)
			 EndIf
		 Next

		 ; cambio respecto al original ahora se chequea sin la direccion sirve y luego se la limpia, no se si es por la base de datos que se la limpia
		 $found_url=StringReplace($found_url,chr(39),"")
		 $found_url=StringReplace($found_url,chr(34),"")
		 $found_url=StringReplace($found_url,"amp;","")
		 $found_url=StringReplace($found_url,"./","")

		 If StringInStr($found_url,"http://") = 0 then
		 $domain= _URLSplit($url, $szProtocol, $szDomain, $szPath, $szFile)
		 $found_url="http://" & $domain[2] & "/" & $found_url
		 Elseif StringInStr($found_url,$firsturl) = 0 then
		 Afuera ($found_url)
		 ContinueLoop
		 EndIf

		 $big_insert=$big_insert & "INSERT INTO urls (url, level) VALUES ('"&$found_url&"', "&$level+1&"); "

		 Next

	_SQLite_Exec($dbn,$big_insert)
    EndIf

	$changes=$changes-_SQLite_TotalChanges()
	ConsoleWrite(@CR & $o & " Bajando url nivel" & $level &" direccion: " & $url &" se encontraron " & $changes * -1 & " nuevas direcciones")
	$changes=_SQLite_TotalChanges()

WEnd

_SQLite_Shutdown ()

Func Afuera ($meter)
	consolewrite(@CR &"    ""Dirección externa encontrada: " & $meter )
	_SQLite_Exec($dbn,"INSERT INTO externos (afuera) VALUES ('"&$meter&"');")
EndFunc

Func Parar()
Exit 0
EndFunc


Func _URLSplit($szUrl, ByRef $szProtocol, ByRef $szDomain, ByRef $szPath, ByRef $szFile) ; no le he tocado una linea a esto anda muy bien
    Local $sSREPattern = '^(?s)(?i)(http|ftp|https|file)://(.*?/|.*$)(.*/){0,}(.*)$'
    Local $aUrlSRE = StringRegExp($szUrl, $sSREPattern, 2)
    If Not IsArray($aUrlSRE) Or UBound($aUrlSRE) - 1 <> 4 Then Return SetError(1, 0, 0)
    If StringRight($aUrlSRE[2], 1) = '/' Then
        $aUrlSRE[2] = StringTrimRight($aUrlSRE[2], 1)
        $aUrlSRE[3] = '/' & $aUrlSRE[3]
    EndIf
    $szProtocol = $aUrlSRE[1]
    $szDomain = $aUrlSRE[2]
    $szPath = $aUrlSRE[3]
    $szFile = $aUrlSRE[4]
    Return $aUrlSRE
EndFunc

Re: Araña busca enlaces

Publicado: 01 Abr 2010, 02:41
por BasicOs
Hola,
Es un ejemplo de una aplicación de base de datos Sqlite, :smt038
Donde muestras altas y consultas de registros enlazados, la creación de las tablas, parametrizarlas, consultas, añadir registros etc....
Felicidades!!!! El poder de las bases de datos es tuyo!!, :smt027 :smt027 :smt027 :smt027 :smt027 :smt026 :smt029 :smt029
Salu22:)

Re: Araña busca enlaces

Publicado: 01 Abr 2010, 03:12
por Chefito
Sí, a mi también lo que me ha gustado del programa es como nos muestras el poder trabajar con bbdd sqlite desde AutoIt :smt023 . Hasta has creado las tablas por consultas sql!. Muy bueno :smt041 .

Lo que es el programa....puffffff....como no le pongas un límite vas listo con los enlaces :smt005 .

Saludos.

Re: Araña busca enlaces

Publicado: 01 Abr 2010, 20:41
por Pablo2m
Gracias pero el merito de las bases de datos es un logro del creador del otro script, que la verdad se lucio en eso.
Lo que me llama la atencion es que algunas cosas no estan andando, la que mas me intriga es el comparador para que no visite algunas cosas

Código: Seleccionar todo

For $P=1 To $ignorar [0]
If StringInStr($found_url,$ignorar ($P),2) <> 0 then
ContinueLoop (2)
EndIf
Next 
¿alguien se da cuenta cual es el fallo ?, mi idea es que salte al comienzo del for que esta mas arriba antes de que anote una de esta direcciones .
Saludos

Re: Araña busca enlaces

Publicado: 01 Abr 2010, 22:40
por BasicOs
Parece por encima que el code esta bién.
Puedes probar revisando los valores que van devolviendo las dos variables dentro del stringinstr() , los revisas ya dentro del if, a ver si hay un error lógico en la comparación.

Por otro lado el continueloop() esta bien pero en cambio, puedes hacer un exitloop y justo después del next hacer un continueloop normalito de un nivel, (yo si puedo evitar los dobles o triples saltos de los xxLoop los evito, o los pongo ya una ves depurado el code ya funcionando, para dejarlo más bonito. En el sentido que al hacer un "salto mortal", puedes dejarte colgadas las asignaciones de variables u otros pasos del segundo nivel del while/for. :smt048 :smt048 , digo solo si cuesta casi lo mismo que es este caso.. si quieres ahorrar lineas puedes poner el if XXX then exitloop en la misma linea :smt024 :smt024 :smt024

Salu2:)

Re: Araña busca enlaces

Publicado: 02 Abr 2010, 20:45
por Pablo2m
Ya esta andando, todabia quedan cosas que me gustarian pulir.
Hoy hice una prueba de rendimiento, escaneando 9920 paginas de un foro tardo 3h 39 min 50 seg o sea tarda en promedio 1.32 seg entre que baja la web y guarda todos los enlaces externos escogidos con algun criterio, bastante bien teniendo en cuenta que el proveedor de internet es Speedy
Saludos

Re: Araña busca enlaces

Publicado: 06 Abr 2010, 10:48
por Ximorro
¿No será porque $ignorar($P) debería ser $ignorar[$P]?, o sea, acceder a una matriz, no a una función.
Lo que no entiendo es por qué no da error de función no definida o de sintaxis... (porque al empezar por $ no es un nombre de función, sino de variable, y no debería dejar ponerle los paréntesis.