Pregunta rápida sobre programa: Bajar imágenes de internet

Iniciado por Agente Naranja, 26 Junio 2009, 16:41 PM

0 Miembros y 1 Visitante están viendo este tema.

Agente Naranja

Hola, se me ha ocurrido hacer un programa que baje una lista de imágenes de una página web, tipo Flickr, pero hacerlo en C++ se me haría bastante pesado, y he pensado que aprovecharía Visual basic para hacerlo, dada la facilidad de hacer interfaces gráficas en este lenguaje.

Pero mientras aprendo lo básico del lenguaje, me gustaría que me dijerais qué controles debo usar para cada una de las siguientes tareas, o que me dierais una recomendación sobre qué documentación leer, porque todo lo que encuentro de VB en internet es para crear HTML, y yo no quiero hacer eso.

1 - Descargar una página HTML y almacenar el contenido en alguna variable para luego
2 - Usar un parser XML para buscar las etiquetas IMG y copiar las URL de cada una, además buscar las etiquetas de enlace <A> para comprobar si hay más páginas de imágenes
3 - Descargar a una carpeta todas las imágenes.

Bueno, eso es lo que quiero hacer, no pido que me vais a hacer el código, ni mucho menos, solamente quiero saber qué funciones debería aprender, o qué controles voy a necesitar.

Gracias a todos :)

Karcrack

Bueno, te respondo a tus pasos con codigos ::)

1_
Código (vb) [Seleccionar]
Public Function ReadURL(ByVal sURL As String) As String
   Dim oWinHTTP        As Object 'As New WinHttp.WinHttpRequest
   
   Set oWinHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
   
   With oWinHTTP
       Call .Open("GET", sURL)
       Call .Send
       ReadURL = .ResponseText
   End With
   
   Set oWinHTTP = Nothing
End Function


3_ (Se puede hacer de muchas formas...)
Código (vb) [Seleccionar]
'URLMON
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Public Function DownloadToFolder(ByVal sURL As String, ByVal sFolder As String) As Boolean
   Dim sPath           As String
   
   If Right$(sFolder, 1) <> "\" Then sFolder = sFolder & "\"
   
   sPath = sFolder & Mid$(sURL, InStrRev(sURL, "/") + 1)
   
   DownloadToFolder = (URLDownloadToFile(ByVal 0&, sURL, sPath, ByVal 0&, ByVal 0&) = 0)
End Function


Lo de parsear te lo dejo a ti, es facil ;D (Split, Mid, Instr... blah, blah..xD)

Saludos :D

Agente Naranja

Ok, muchas gracias, ahora estoy usando la primera función, y estoy tratando de ver cómo hacer que durante el tiempo que dura la petición me muestre un mensaje "cargando" y que se detenga al acabar. He visto que el objeto winHTTP tiene algunos eventos como OnResponseFinished(), pero no se bien cómo usarlos. ¿He de declararlos como SUB dentro del evento del botón? O sea sería algo como...

Código (vb) [Seleccionar]
Private Sub button1_click()
   Private Sub oWinHTTP_OnResponseFinished
   .....
   End Sub
End Sub



No lo se, estoy tratando de buscar la forma de usar esos eventos pero te digo que no tengo casi idea de Basic, así que perdona si hago alguna pregunta que parezca elemental o si el código no tiene sentido :P

Karcrack

No, no se puede poner un Sub dentro de otro... al menos no asi tal cual...

Si lo que quieres es utilizar los eventos del WinHTTP entonces tendras que declararlo con eventos... mira este ejemplo:
(Recuerda añadir el componente Microsoft HTTP)
Código (vb) [Seleccionar]
Option Explicit

Dim WithEvents oWinHTTP         As WinHttp.WinHttpRequest

Private Sub Form_Load()
    Set oWinHTTP = New WinHttp.WinHttpRequest
    Debug.Print ReadURL("https://foro.elhacker.net/programacion_vb-b50.0/")
End Sub

Public Function ReadURL(ByVal sURL As String) As String
'    Dim oWinHTTP        As Object 'As New WinHttp.WinHttpRequest
'
'    Set oWinHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")

    With oWinHTTP
        Call .Open("GET", sURL)
        Call .Send
        ReadURL = .ResponseText
    End With

'    Set oWinHTTP = Nothing
End Function

Private Sub oWinHTTP_OnResponseStart(ByVal Status As Long, ByVal ContentType As String)
    MsgBox "Se inicio la descarga"
End Sub

Private Sub oWinHTTP_OnResponseFinished()
    MsgBox "Se finalizo la descarga!!"
End Sub


Saludos ;)

Agente Naranja

#4
Creo que eso es lo que me pasa, que no sé como agregar el componente HTTP.

Acabo de agregar una referencia a winhttp.dll, de esta forma no me dice que no está definido WinHttpRequest, pero aún sigo luchando por que me salga un anuncio al acabar la carga.

Código (vb) [Seleccionar]
Option Explicit On


Public Class Form1


    Dim WithEvents oWinHTTP As WinHttp.WinHttpRequest


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        oWinHTTP = New WinHttp.WinHttpRequest
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim regreso As String

        lblEstado.Text = "Cargando..."

        oWinHTTP.Open("GET", txtURL.Text)
        oWinHTTP.Send()

        regreso = oWinHTTP.ResponseText

        txtTexto1.Text = regreso

    End Sub

    Private Sub oWinHTTP_OnResponseFinished()
        lblEstado.Text = "Finalizado"

    End Sub


End Class


Con este código obtengo:

Excepción del tipo 'System.ArgumentException' en Microsoft.VisualBasic.dll
Excepción del tipo 'System.ArgumentException' en WindowsApplication1.exe
Excepción del tipo 'System.Runtime.InteropServices.COMException' en WindowsApplication1.exe


Karcrack

Eso que tu haces no es VB6....

Lo lamento, pero odio .NET :xD

Agente Naranja

#6
Yo es que ni idea de si es o no .NET, me he bajado el visual basic express 2008 y ni idea si es .NET o qué. Vaya lio para programar una sola aplicación, me está sacando de quicio.

Ahora bien, sabiendo lo que quiero hacer, ¿tú recomendarías algún otro lenguaje? No se, alguien me dice que con python, pero me gustaría tener una GUI para que se viera mejor la cosa. Pero Basic me está dando bastantes dolores de cabeza (y eso que solo llevo un día :P )

AÑADO: He pensado una cosa, que llevo tiempo aprendiendo C/C++ y ahora que tengo que hacer un programa, ¿qué se me ocurre? Cambiar a otro lenguaje. Pues no! Me voy a pasar de nuevo a C++, para algo ha de servir todo lo que he aprendido :P

Saludos y gracias de todos modos.

Karcrack

Bueno, con C lo tienes que hacer con APIs... OpenURL* Para sacar el codigo de un URL... y para los formularios puedes hacerlo igual con C...

Saludos ;D