Como fazer um web crawler

Java

09/04/2009

Eu gostaria de desenvolver um web crawler que ficasse estatico em um site apertando botoes, escrevendo e caixa de texto e lendo informacoes do site. Isso é possivel? E nao nao é para roubar senhas. O objetivo é desenvolver um porgram que opere em um homebroker sozinho. Obrigado
Sink0

Sink0

Curtidas 0

Respostas

Hudson Afonso

Hudson Afonso

09/04/2009

ja fiz isso para pegar combos de cartas de magic... é um trabalho braçal vc tem e usar algo como o apache httpclient http://hc.apache.org/httpclient-3.x/ e tem que fazer tudo na mão localizar a informação no resultado naum da para usar XML pq naum é garantia que o xml vai estar tudo ok, então acho melhor usar regexp vou colocar aki o código que fiz para buscar combos.
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;

public class Combo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			
			String card = "Torture";
			
			String url = "http://www.essentialmagic.com//combos/search.asp";
			HttpClient client = new HttpClient();
			PostMethod method = new PostMethod(url);

			List params = new ArrayList();

			params.add(new NameValuePair("txtName", ""));
			params.add(new NameValuePair("txtCreator", ""));
			params.add(new NameValuePair("cnbtxtCard", card));
			params.add(new NameValuePair("cnbhdnCard", "5"));
			params.add(new NameValuePair("selDateCompare", "BETWEEN"));
			params.add(new NameValuePair("txtDate", ""));
			params.add(new NameValuePair("selFormat", "3"));
			params.add(new NameValuePair("selThemes", "0"));
			params.add(new NameValuePair("selRatingCompare", ">="));
			params.add(new NameValuePair("selRatings", "0"));
			params.add(new NameValuePair("selNumRatingsCompare", ">="));
			params.add(new NameValuePair("selNumRatings", "-1"));
			params.add(new NameValuePair("selRarities", "0"));
			params.add(new NameValuePair("selInvalid", "0"));
			params.add(new NameValuePair("chkColor0", "on"));
			params.add(new NameValuePair("chkColor1", "on"));
			params.add(new NameValuePair("chkColor2", "on"));
			params.add(new NameValuePair("chkColor3", "on"));
			params.add(new NameValuePair("chkColor4", "on"));
			params.add(new NameValuePair("chkColor5", "on"));
			params.add(new NameValuePair("selColorCompare", "OR"));
			params.add(new NameValuePair("btnSearch", "Begin+Search"));

			method.setRequestBody((NameValuePair[]) params.toArray(new NameValuePair[params.size()]));

			client.executeMethod(method);

			method = new PostMethod("http://www.essentialmagic.com/combos/SearchResults.asp");
			client.executeMethod(method);

			String page = method.getResponseBodyAsString();

			//<div class="Label" style="font-size: 11pt; font-style: italic;">Grim Harvest</div>
			
			Pattern comboLinkpattern = Pattern.compile("(<[^>]*?div[^>]*?(?:Label)[^>]*>)((?:.*?(?:<[ \r\t]*div[^>]*>?.*?(?:<.*?/.*?div.*?>)?)*)*)(<[^>]*?/[^>]*?div[^>]*?>)");
			Matcher comboLinkmatcher = comboLinkpattern.matcher(page);
			
			List comboList = new ArrayList();
			List comboIndexList = new ArrayList();
			
			while(comboLinkmatcher.find()){
				Pattern comboStartLinkPattern = Pattern.compile("<[^>]*?div[^>]*?(?:Label)[^>]*>");
				Pattern comboEndLinkPattern = Pattern.compile("</div>");
				Matcher comboStartLinkmatcher = comboStartLinkPattern.matcher(page.substring(comboLinkmatcher.start(), comboLinkmatcher.end()));
				comboStartLinkmatcher.find();
				int start = comboStartLinkmatcher.end();
				comboStartLinkmatcher = comboEndLinkPattern.matcher(page.substring(comboLinkmatcher.start(), comboLinkmatcher.end()));
				comboStartLinkmatcher.find();
				int end = comboStartLinkmatcher.start();
				
				comboList.add(page.substring(comboLinkmatcher.start(), comboLinkmatcher.end()).substring(start,end));
				comboIndexList.add(new Integer(comboLinkmatcher.start()));
				
				//System.out.println(page.substring(comboLinkmatcher.start(), comboLinkmatcher.end()).substring(start,end));
			}
			
			
			Pattern cardLinkPattern = Pattern.compile("(<[^>]*?a[^>]*?(?:hidePopup)[^>]*>)((?:.*?(?:<[ \r\t]*a[^>]*>?.*?(?:<.*?/.*?a.*?>)?)*)*)(<[^>]*?/[^>]*?a[^>]*?>)");
			Matcher cardLinkmatcher = cardLinkPattern.matcher(page);

			int combo = 0;
			
			while (cardLinkmatcher.find()) {
				
				if((combo < comboIndexList.size()) && (combo==0 || cardLinkmatcher.start()>((Integer)comboIndexList.get(combo)).intValue())){
					
					System.out.println("\n\n>>"+comboList.get(combo));
					combo++;
				}
				
				Pattern cardStartLinkPattern = Pattern.compile("<[^>]*?a[^>]*?(?:hidePopup)[^>]*>");
				Pattern cardEndLinkPattern = Pattern.compile("</a>");
				Matcher cardStartLinkmatcher = cardStartLinkPattern.matcher(page.substring(cardLinkmatcher.start(), cardLinkmatcher.end()));
				cardStartLinkmatcher.find();
				int start = cardStartLinkmatcher.end();
				cardStartLinkmatcher = cardEndLinkPattern.matcher(page.substring(cardLinkmatcher.start(), cardLinkmatcher.end()));
				cardStartLinkmatcher.find();
				int end = cardStartLinkmatcher.start();
				
				System.out.println(page.substring(cardLinkmatcher.start(), cardLinkmatcher.end()).substring(start,end));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
qualquer coisa estou ai.
GOSTEI 0
Sink0

Sink0

09/04/2009

O que as linhas 60, 67 e 83 fazem? E o nome dos objetos vc pego no codigo fonte neh?
GOSTEI 0
Ricardo Staroski

Ricardo Staroski

09/04/2009

[quote="Sink0"]O que as linhas 60, 67 e 83 fazem?
Adquira algum material sobre expressões regulares ou algum livro de [b]Linguagens Formais[/b] ou de [b]Compiladores[/b] para entender o que essas linhas estão fazendo. Te aconselho a começar a ler a especificação da API do Java. ([i]Tem um link na assinatura dos meus posts[/i])
GOSTEI 0
Hudson Afonso

Hudson Afonso

09/04/2009

na linha 60 eu procuro por qualquer coisa parecida com <div class="Label" style="font-size: 11pt; font-style: italic;">Grim Harvest</div> na linha 67 e 68 eu pego o começo e o fim para eu isolar apenas o texto "Grim Harvest" na linha 83 eu busco por todos os cards na pagina e então mando imprimir cada card por combo. esse código ai era um plano para eu pegar a minha lista de cards e buscar combos para cada uma então eu iria cruzar as info para saber quantos combos eu ja tinha apenas com minha cartas velhas.
GOSTEI 0
Sink0

Sink0

09/04/2009

Hafonso, eu acho que o que voce fez é exatamente o que eu preciso, so que meus conhecimentos em java nao me permitem entender o seu codigo. Voce poderia me dar alguma indicacao de onde eu posso procurar informacao para conseguir entende-lo? E se possivel voce poderia me dar uma geral qual a logica do seu codigo do tipo quais os passos que ele faz pra conseguir devinir os atributos dos abjetos do sites, fazer o requisito com o botao e tals? Caso isso seja trampo demais a sua ajuda ja valew bastante ae. Valew por todo ajuda ae.
GOSTEI 0
Sink0

Sink0

09/04/2009

Caso outra pessoa com capacidade para abstrair o codigo e possa explica-lo no lugar do Afonso eu tambem estaria grato. O que eu preciso seria basicamente uma explicação da ordem logica de como as coisas contecem, e se possivel o que cada passagem ou grupo de passagens contribuem para tal. Obrigado por toda a ajuda.
GOSTEI 0
Mauricio Nunes

Mauricio Nunes

09/04/2009

[quote="staroski"][quote="Sink0"]O que as linhas 60, 67 e 83 fazem?
Adquira algum material sobre expressões regulares ou algum livro de [b]Linguagens Formais[/b] ou de [b]Compiladores[/b] para entender o que essas linhas estão fazendo. Te aconselho a começar a ler a especificação da API do Java. ([i]Tem um link na assinatura dos meus posts[/i])
Calma gente. Vamos as dicas. Então Sink0, tudo bem ? Eu estou começando a dar uma olhada nesse assunto, apenas por curiosidade. E dando uma ollhada na internet eu achei um lin que possui diversos Crawler feitos em java, segue ai o link abaixo : [url]http://java-source.net/open-source/crawlers[/url] Caso você queira fazer um do zero, tem um livro chamado [b]A arte do Java[/b], onde o mesmo aprensenta um capitulo explicando como se faz um crawler em java. Olha, vamos nos falando, meu e-mail é nunes.mauricio@gmail.com. Abraços.
GOSTEI 0
Sink0

Sink0

09/04/2009

Isso vai ajudar bastante, so que o o estilo que eu quero eh bem o que o afonso fez pq no meu caso o prgrama vai ter passar por um login basico , mas depois ele vai ficar estatico em uma pagina pegando valores e inserindo. Mas a juda eh bem valida, e vamos nos falando. Meu e-mail é: sink00@gmail.com
GOSTEI 0
POSTAR