• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Bint

[VB.NET] WebCrawler - dúvidas

9 mensagens neste tópico

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  :hmm:

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas tu tem cuidado porque essa expresao regular que o pedrotuga forneceu dá TODOS os links, ou seja, apanhas scripts de javascript, apanhas css, apanhas imagens. Tens de arranjar uma para sacar so as com tags <a>. Ao trabalho! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

na primeira podes usar uma regex como a que eu escrevi acima, mas provavelmente precisa de algum debugging.

Na segnda... assim de repente só estou a ver como fazer isso usando duas regex, mas dá para fazer isso có com uma... deixa ca ver

Tipo: isto é gajo para funcionar:

€[a-0\,\.]*

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

:shocking:

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!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora