Como fazer um web crawler
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
Curtidas 0
Respostas
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.
qualquer coisa estou ai.
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();
}
}
}GOSTEI 0
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
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
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
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
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
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]) GOSTEI 0
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