Jump to content

[VB.NET] WebCrawler - dúvidas


Bint

Recommended Posts

Boas!

Sou novo por aqui, apesar de já seguir a revista já á algum tempo 🙂

Pretendo iniciar um pequeno projecto em conjunto com um amigo, e precisamos de algumas dicas aqui do pessoal mais versado em VB (.NET)!

Basicamente, necessitamos construír uma espécie de micro-WebCrawler "especializado":

Ou seja: com base em URLs pré-definidos, a aplicação deverá aceder aos links, analisar o HTML, e retirar apenas as "frases" que interessam.

Para ajudar a visualizar o conceito, imaginem o seguinte:

- Aceder a 5 sites de lojas de informática (à Lista de Produtos);

- Localizar o Nome, Preço e Imagem do mesmo;

- Guardar essa info em BD;

Na práctica, o resultado final será qualquer coisa semelhante a www.itcomponents.net.

As nossas questões/dúvidas mais importantes são:

- Qual a maneira mais eficiente de "aceder e carregar" o conteúdo das páginas, em termos de código VB?

- Para localizar as Strings que se pretende (Nome, Preço, etc) pensámos usar Regular Expressions, mas pela análise que fizemos, deve ser necessário usar alguma parametrização prévia, baseada no HTML próprio site... como fariam isto  ?

Os nossos conhecimentos em VB.NET são (ainda!) limitados 😉

Aguardamos as vossas opiniões!

Podem sugerir, como é óbvio, maneiras ou linguagens completamente diferentes para executar esta tarefa...

Cumps,

Bint

Link to comment
Share on other sites

Boas,

Como não percebo nada de VB.NET a única ajuda que posso dar é na melhor forma de 'sacar' o conteudo de interesse. Para isso a melhor solução seria através de Expressões regulares, de certeza que existe algum módulo de regex para VB.NET que vocês possam usar.

http://www.vbdotnetheaven.com/UploadFile/sushmita_kumari/Regex111092006074200AM/Regex1.aspx

Abraço

Link to comment
Share on other sites

Acerca de basica nao posso dizer nada porque nem sequer sei fazer um hello world em basic.

Sobre as expressões regulares...

uma coisa deste tipo deve sacar os links todos

|(href|HREF)=(\"|\')(.*?)(\"|\')|

Não experimentei mas com uma ou outra modificação deve ser isto.

Tens é que ter conhecimento do url da página onde estas para sacar o endereço do servidor e path para os links relativos.

Link to comment
Share on other sites

O .NET (VB Express edition) já suporta o uso de RegExp - pelo menos, já consegui executar sobre uma string com HTML de testes...

Precisa é de mais algum trabalho, mas já consigo "isolar" os links todos 😉

Por exemplo, acho que vou ter que paraemtrizar algumas "caracteristicas genéricas" do HTML de cada site em particular, e depois usar isso para gerar a string RegExp correcta.

É que o HTML muda muito de site para site, e sem isso não estou a ver com identificar numa página o que é o "Nome do produto" sem alguma TAG especifica...

A minha questão vai nesse sentido: qual a melhor forma de executar isso?

PS: já agora, já atinei com a expressão RegExp para sacar os links MAS não com uma para os sacar com o conteúdo interno, isto é, sacar todas as strings que comecem em <A> e acabem em </A> (assim saco o link e a descrição do mesmo - o que aparece escrito no browser)?

Obrigado!

Cumps,

Bint

Link to comment
Share on other sites

Qualquer coisa como isto deve dar.

Agora não me lembro se o espaço precisa de ser escapado ou se tem um metacaracter para o representar. Se tiver tens que mudar a última parte da regex. onte aparece isto: ( *)

|<(a|A) (.*) (href|HREF)=(\"|\')(.*?)(\"|\')(.*)>(.*)<\/(a|A)( *)>|

Pois... se estás a sacar informação que é especifica do site tens que introduzir parametros que dependem do site em si.

O que te acoselho a fazer é o seguinte:

crias uma classe chamada spider ou coisa do estilo e defines métodos como get_links() e como membros deves definir o url da pagina.

Depois defines uma outra classe chamada por exemplo catcher() que deve receber um ponteito para um classe do tipo spider.

Essa classe deve ter dois delimitadores que são usados para sacar o preço por exemplo.

Basicamente podes crias quantos objectos desta classe quantos items necessitares de sacar da pagina... e tens sempre acesso ao url da pagina através do ponteiro para a outra classe.

Se não for possivel sacar um item através de dois delimitadores podes sempre herdar esta classe e extende-la.

Isto éuma das aproximações possiveis que tira partido de POO.

Link to comment
Share on other sites

Obrigado pelas dicas!!

Estou a usar esta Exp para sacar os links:

(?:[hH][rR][eE][fF]\s*=)(?:[\s""']*)(?!#|[Mm]ailto|[lL]ocation.|[jJ]avascript|.*css|.*this\.)(.*?)(?:[\s>""'])

E esta para o preço:

(?:[€])*\d*(?:[\.|,]\d*)*

Em um HTML deste género:

<td width="80%" colspan="2"><a style="font-size: 16px; font-weight: bold;" href="http://www.exnet.pt/loja/index.php?page=shop.product_details&flypage=shop.flypage&product_id=1502&category_id=67f2567d27518b0d0503fa0effe754a2&option=com_phpshop&Itemid=1">Portátil Toshiba Portégé M400 - PPM41E-01H02FHP</a>
</td>

o match é apenas na parte:

href="http://www.exnet.pt/loja/index.php?page=shop.product_details&flypage=shop.flypage&product_id=1502&category_id=67f2567d27518b0d0503fa0effe754a2&option=com_phpshop&Itemid=1"

Existem aqui dois problemas:

1- na primeira, não é devolvida a totalidade da tag <A></A> como já referido;

2- na segunda, consigo fazer o match de algo do género "€2.146,00" ou "2.146,00€", mas também de todos os itens numéricos que existam no html - seria óptimo se conseguisse o mtach apenas de números antecedidos ou precedidos do simbolo € 😉

Vou tentar com a que referiste!

Link to comment
Share on other sites

Hum...... já vi que me meti num grande sarilho!!

?

Acabei de ler uns artigos relacionados na net, e acho que vou pensar mais a fundo no assunto antes de mais...

Há uma série de coisas que tenho que ter em atenção, como por exemplo evitar "loops" no parsing dos URLs, etc.

Info:

http://www.vsj.co.uk/dotnet/display.asp?id=407

Tenho que estudar isto com mais calma e depois logo volto aqui para esclarecer as dúvidas- que vão ser muitas, lol

Obrigado a todos!!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.