VBnet - Buscar Area especifica a um site

viskonde

I quit My Job for Folding
Boas

em VB.net, queria saber se é possivel o seguinte:

dado um determinado site ( http://www.imdb.com/title/tt0086190/ por exemplo) obter certos dados especificos do site.

Na pratica, queria a partir de um link do IMDB, ir buscar automaticamente a imagem/link da imagem que está à esquerda (a que tem a cover do filme) sem ter de dizer o link à mão.

e possível ?

e se fosse para obter texto ?

tipo a partir do link da pagina ele ir buscar o nome do produtor, e a duração do filme?


Cumpts
 
Última edição:
Podes começar por aqui: System.Net.WebRequest

Usando esta classe podes fazes um pedido à página e é-te devolvido todo o seu HTML. Depois disso só tens de percorrer de alguma forma todo o HTML devolvido e identificar o url da imagem para fazer um novo pedido desse url.
 
Interessante!

há algum site/livro com mais informação acerca disto? isto é, interacção vb.net com websites / mostrar webpage num form etc...

Algum tutorial para se começar do zero?
Alguma dica sobre o que pesquisar para além do que o SoundSurfer disse?
 
Interessante!

há algum site/livro com mais informação acerca disto? isto é, interacção vb.net com websites / mostrar webpage num form etc...

Algum tutorial para se começar do zero?
Alguma dica sobre o que pesquisar para além do que o SoundSurfer disse?

The TRYNT Movie IMDB Web Service provides programatic access to a sub-set of IMDB data. While the IMDB is a very useful data-set (you can even download your own copy!) it lacks an API. This API was developed to bridge the gap.
TRYNT Movie IMDB Web Service (v2)
 
basicamente é fazer o que o soundsurfer disse, ou utilizar directamente a class webclient.

Para tratamento do html, é usar expressões regulares.
 
E recomendam algum livro para aprender a trabalhar especificamente com estas classes?
Não me sinto à vontade para aprender só com a informação microsoft convinha que fosse um livro!
 
Achei curioso e fiz um pequeno código para exemplificar.

Percebo pouco de expressões regulares, só mesmo as mais simples, para este exemplo construi uma que (muito) provavelmente é pouco ou nada eficiente :joker:



PHP:
Imports System.Net
Imports System.IO
Imports System.Text
Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim pedido As WebRequest = WebRequest.Create("http://www.imdb.com/title/tt0299977/")
        Dim resposta As HttpWebResponse = CType(pedido.GetResponse(), HttpWebResponse)
        Dim dataStream As Stream = resposta.GetResponseStream()
        Dim reader As New StreamReader(dataStream)
        Dim html As String = reader.ReadToEnd()

        Dim rgx_pattern As String = "<title>(?<titulo>.+)<\/title>|" _
        & "<div class=""photo"">\s*<a[^>]*>(?<imagem>.+)\s*<\/a>\s*<\/div>|" _
        & "<div class=""info"">\s*<h5>Director:<\/h5>\s*<a[^>]*>\s*(?<director>.+)\s*<\/a>|" _
        & "<div class=""info"">\s*<h5>Language:<\/h5>\s*<a[^>]*>\s*(?<lang>.+)\s*<\/a>"
        Dim rgx As Regex = New Regex(rgx_pattern, RegexOptions.IgnoreCase)

        Dim matches As MatchCollection = rgx.Matches(html)

        Dim values(4) As String
        Dim i As Int16 = 0
        For Each match As Match In matches
            i = i + 1
            If match.Success Then
                values(i - 1) = match.Groups(i).ToString()
            End If
        Next

        Response.Write(String.Format("Titulo<br/>{0}<br/>Imagem<br/>{1}<br/><br/>Realizador<br/>{2}<br/>Idioma<br/>{3}", values))

    End Sub
End Class

Vai escrever para o output esta informação:

Código:
Titulo<br/>
Ying xiong (2002)<br/>
Imagem<br/>
<img border="0" alt="Ying xiong" title="Ying xiong" src="http://ia.media-imdb.com/images/M/MV5BMTk5NjQyMzIwM15BMl5BanBnXkFtZTcwODQyNjYyMQ@@._V1._SY140_SX100_.jpg" /<br/><br/>
Realizador<br/>
Yimou Zhang<br/>
Idioma<br/>
Mandarin

A informação pode não ser totalmente correcta, se por ex. existir mais que um idioma, só aparece o 1º, mas para quem perceba em expressões regulares isto deve ser "fácil".

Para "apanhar" a fotografia do filme nem era preciso aquilo, por ex. quando há um poster do filme aparece dentro do anchor <a name="poster" ...><img ....../></a>, mas quando não há um poster isto já não se verifica, se por ex. inserirmos um filme sem poster (http://www.imdb.com/title/tt0293715/) vai devolver isto:

Código:
Titulo<br/>
Yeopgijeogin geunyeo (2001)<br/>
Imagem<br/>
<img border="0" src="http://ia.media-imdb.com/media/imdb/01/I/37/58/83/10.gif" width="100" height="150" alt="Poster Not Submitted" title="Poster Not Submitted"><br/><br/>
Realizador<br/>
Jae-young Kwak<br/>
Idioma<br/>
Korean

Aqui falha no idioma, pois no imdb tem "Korean | English"

Além de que se por ex. os programadores do imdb decidirem mudar a estrutura isto vai deixar de funcionar :D

Do pouco que sei, espero ter ajudado.
 
hi
Código:
[COLOR=#000000][COLOR=#dd0000]"<div class=""photo"">\s*<a[^>]*>(?<imagem>.+)\s*<\/a>\s*<\/div>|" [/COLOR][/COLOR]"
sera que podias fazer uma alteracao nesta parte expressao regular na parte da imagem, para em vez de sair a tag <img> toda , sair apenas o link (src)?
nao tenho muito jeito para Regexs..

de resto ta tudo a funcionar bem :D era mesmo isso que precisava

ja agora, para que serve esta parte da Regex:

(?<imagem>.+)
?

edit:
bem depois de olhar para isto parece que consegui
bastou meter mudar a linha para isto
Código:
 & "<div class=""photo"">\s*<a[^>]*>\s*<img[^>]*src=(?<imagem>.+)\s*\/><\/a>\s*<\/div>|" _
 
Última edição:
Acho que o (?<imagem>.+) é um groupname, permite-te que depois possas chamar por ex. rgx.Match(html).Groups("imagem")

Sim, acho que dessa maneira consegues ir buscar o src, pelo menos teoricamente pois n experimentei :), só acho que vai buscar o src incluindo as ""


Eu também percebo pouco de expressões regulares, tenho de começar a dar mais atenção :D
 
Back
Topo