Hoje, a empresa precisa fazer alguns dados de eliminação de dados após a consulta no site especificado, por isso levou algum tempo para escrever uma demonstração para uso da demonstração.
A ideia é muito simples: é acessar o link através do Java, obtenha a sequência HTML e analise os dados necessários, como o link. Tecnicamente, o JSOUP é conveniente para a análise da página. Obviamente, o JSUP é muito conveniente e simples. Você pode saber como usá -lo com apenas uma linha de código:
Documento doc = jsoup.connect ("http://www.oschina.net/") .data ("Query", "java") // Solicitação parâmetros.userAgent ("i 'M jsoup") // Definir user-agent .cookie ("Auth", "Set")/Set Locie. // Use o método post para acessar o URL Todo o processo de implementação é descrito abaixo:
1. Analise as páginas que precisam ser analisadas:
Site: http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicindexQuery
página:
Primeiro faça uma consulta nesta página: Observe o URL solicitado, parâmetros, método, etc.
Aqui usamos a ferramenta de desenvolvedor interna (key de atalho F12), e a seguir são os resultados da consulta:
Podemos ver o URL, o método e os parâmetros. Depois de saber como ou consulta URL, iniciarei o código abaixo. Para reutilizar e estender, defini várias classes:
1. Regra.java é usado para especificar URL de consulta, método, params, etc.
pacote com.zhy.spider.rule; / ** * Classe de regra * * @author zhy * */ public classe regra {/ ** * link */ private string url; / ** * Coleção de parâmetros */ private String [] params; / *** valores correspondentes ao parâmetro*/ private string [] valores; / ** * Para o html retornado, defina o tipo primeiro */ private string resultTagName; / ** * classe / id / seleção * Defina o tipo de resultado de resulta, padrão para id * / private int type = id; / ** *GET / POST *O tipo de solicitação, padrão get * / private int requestMoethod = get; public final static int get = 0; public final static int post = 1; public final static int class = 0; public final static int id = 1; Public final estático int seleção = 2; regra public regra () {} public regra (string url, string [] params, string [] valores, string resultTagName, int tipo, int requestMoethod) {super (); this.url = url; this.params = params; this.values = valores; this.ResultTAgName = resultadoTAGName; this.type = type; this.RequestMoethod = requestMoethod; } public string geturl () {return url; } public void Seturl (String url) {this.url = url; } public string [] getParams () {return params; } public void setParams (String [] params) {this.params = params; } public string [] getValues () {retorna valores; } public void SetValues (String [] valores) {this.values = valores; } public string getResultTAgName () {return resultTagName; } public void setResultTAgName (String resultTagName) {this.ResultTAgName = resultadoTAGName; } public int getType () {return type; } public void setType (int tipo) {this.type = type; } public int getRequestMoethod () {return requestMoethod; } public void setRequestMoethod (int requestMoethod) {this.RequestMoethod = requestMoethod; }}Deixe -me colocar brevemente: esta classe de regra define todas as informações necessárias durante o processo de consulta, o que facilita nossa extensão e reutilização de código. É impossível para nós escrever um conjunto de código para cada site que precisa estar rastreado.
2. O objeto de dados necessário, atualmente precisa apenas de links, linktedata.java
pacote com.zhy.spider.bean; classe pública linktypedata {private int id; / *** Endereço do link*/ private string linkhref; / *** Título do link*/ Private String linkText; / *** Resumo*/ Resumo da String Private; / *** Conteúdo*/ Conteúdo da String Private; public int getId () {return id; } public void setId (int id) {this.id = id; } public string getLinkhref () {return linkhref; } public void setLinkhref (string linkhref) {this.linkhref = linkhref; } public String getLinkText () {return linkText; } public void setLinkText (string linkText) {this.linkText = linkText; } public string getsummary () {return summary; } public void Setsummary (resumo da string) {this.summary = resumo; } public string getContent () {return content; } public void setContent (String content) {this.content = content; }} 3. Classe de consulta principal: ExtractService.java
pacote com.zhy.spider.core; importar java.io.ioException; importar java.util.arraylist; importar java.util.list; importar java.util.map; importar javax.swing.plaf.textui; importar org.jsoup.connection; importar org.jsoup.jsoup; importar org.jsoup.nodes.document; importar org.jsoup.nodes.Element; importar org.jsoup.select.Elements; importar com.zhy.spider.bean.linktypedata; importar com.zhy.spider.rule.rule; importar com.zhy.spider.rule.ruleexception; importar com.zhy.spider.util.textutil; / ** * * @author zhy * */ public classe ExtractService {/ ** * @param regra * @return */ list estática pública <LinkTypedata> Extract (regra da regra) {// executa a verificação necessária da regra de válculate (regra); Lista <LinkTyPedata> dados = new ArrayList <LinkTyPedata> (); LinkTyPedata dados = nulo; tente { / ** * parse regra * / string url = regra.geturl (); String [] params = regra.getParams (); String [] valores = regra.getValues (); String resultTagName = regra.getResultTagName (); int tipo = regra.getType (); int requesttype = regra.getRequestMoethod (); Conexão conn = jsoup.connect (url); // Defina parâmetros de consulta if (params! = Null) {for (int i = 0; i <params.length; i ++) {conn.data (params [i], valores [i]); }} // Definir tipo de solicitação Document doc = null; switch (requesttype) {regra de caso.get: doc = Conn.Timeout (100000) .get (); quebrar; regra de caso. post: doc = Conn.Timeout (1000000) .Post (); quebrar; } // Processo Retornar elementos de dados Resultados = new Elements (); switch (type) {regra de caso. quebrar; regra de caso.id: resultado do elemento = doc.getElementById (resultTagName); resultados.add (resultado); quebrar; regra de caso.SELECTION: Resultados = Doc.Select (ResultTagName); quebrar; padrão: // Quando o resultado do resultado está vazio, a etiqueta corporal é descontinuada se (textUtil.isempty (resultTagName)) {resulta = doc.getElementsByTag ("corpo"); }} para (resultado do elemento: resultados) {elementos links = resultado.getElementsByTag ("A"); para (link do elemento: links) {// necessário filtro string linkhref = link.attr ("href"); String linkText = link.text (); dados = new linktypedata (); data.setlinkhref (linkhref); data.setLinkText (linkText); data.add (dados); }}} catch (ioexception e) {e.printStackTrace (); } retornar dados; } / *** execute a verificação necessária nos parâmetros passados* / private estático void válida (regra de regra) {string url = regra.geturl (); if (textUtil.isEmpty (url)) {lança nova renEexception ("URL não pode estar vazio!"); } if (! url.startswith ("http: //")) {lança nova rengeexception ("URL está incorreto!"); } if (regra.getParams ()! = null && regra.getValues ()! = null) {if (regra.getParams (). length! = regra.getValues (). length) {atirar nova renomexception ("o valor da chave do parâmetro não corresponde ao número de teclas e valores!"); }}}}} 4. Uma classe de exceção é usada: renEexception.java
pacote com.zhy.spider.rule; public class RulEexception estende a RunTimeException {public renEexception () {super (); // TODO Construtor GOERATIDO AUTO GRABE} PUBLIC REGEEXCCOMPENS (MENSAGEM SING, CAUSA DE JOGAR) {super (mensagem, causa); // TODO Construtor GOERATADO AUTO GERODADO ESTUB} PUBLIC REGEEXCCIONCE (String message) {super (message); // TODO Construtor Godo Gerado Stub} Public RulEexception (Causa Throwable) {super (causa); // TODO Construtor GOERADO AUTOGRUTO ESTUB}} 5. Finalmente, é um teste: dois sites são usados para testes aqui e regras diferentes são usadas. Consulte o código para obter detalhes.
pacote com.zhy.spider.test; importar java.util.list; importar com.zhy.spider.bean.linktypedata; importar com.zhy.spider.core.extractService; importar com.zhy.spider.rule.rule; public class Test { @org.junit.test public void getDatasbyclass () {regra regra = new regra ("http://www1.sxcredit.gov.cn/public/infocomquery.do?methodnpublindexquery", new string.nfocery.ent.do?method=publindexquery ", new String.nferynt.ent.ent.Dery.Derhod=publicisquery", new String.nferynt. String [] {"xingwang", "}," cont_right ", regra.class, regulamento.post); list <linktypedata> extrações = extractservice.extract (regra); printf (extrações);} @org.junit.test public void getData Regra ("http://www.11315.com/search", new String [] {"name"}, new String [] {"Xingwang"}, "Div.G-mn Div.Con-Model", regra Printf (LISTA (LinkTepedata> dados) {para (LinkTepedata Data: DataS) {System.out.println (Data.getLinkText ()); Resultado da saída:
Shenzhen Netxing Technology Co., Ltd. http://14603257.11315.com Quanxing Internet Cafe# *************************** ***************************************
Por fim, use uma notícia do Baidu para testar nosso código: significa que nosso código é universal.
/*** Use o Baidu News, defina apenas as palavras -chave e as palavras -chave e os tipos de retorno*/ @org.junit.test public void getDataSbycSSQueryUserBaidu () {regra da regra = nova regra ("http://news.baid.com/ns", new String [] {"Word", [Word], [almull, almull, string, almull, almull, almull, almull, almull, e novo string, almull, e new) ("Word" {"wordslul, http://news.baid.com/ns", new "{" Word] Regra.get); List <LinkTyPedata> Extracts = ExtractService.extract (regra); printf (extratos); } Definimos apenas links, palavras -chave e tipos de solicitação e não definimos condições específicas de filtro.
Resultado: é certo que existem certos dados de lixo eletrônico, mas os dados necessários devem ser rastejados. Podemos definir a regra. Seção, bem como limites adicionais em condições de filtragem.
Classificar por tempo/ns? Word = alipay & ie = utf-8 & bs = alipay & sr = 0 & cl = 2 & rn = 20 & tn = notícias e ct = 0 & clk = sortbytime ************************************* Financie com várias partes para investir 40 milhões no primeiro lote http://finance.ifeng.com/a/20140409/12081871_0.shtml ************************************* Notícias/ns? Word =%E6%94%AF%E4%BB%98%E5%AE%9D+CONT: 2465146414%7C697779368%7C383**********1Gh] instantâneo http://cache.baidu.com/c?m=9D78D513D9D437AB4F9E91697D1CC0161D4381132BA7D3020CD0870FD3A541 B0120A1AC26510D19879E20345DFE1E4BEA876D26605F75A09BBFD91782A6C1352F8A2432721A844AFD019ADC 1452FC423875D9DAD0EEDE7CDB168D5F18C & P = C96EC64AD48B2DEF49BD9B780B64 & NEWP = C4769A4790934AEAEA28E 281C4092695912C10E3DDD796 & Usuário = Baidu & FM = SC & Query =%D6%A7%B8%B6%B1%A6 & QID = A400F3660007A6C5 & P1 = 1 ******************************************************** A vulnerabilidade Openssl envolve muitos sites que o Alipay diz que não há vazamento de dados ainda http://tech.ifeng.com/i-Tnernet/detail_2014_04/09/35590390_0.shtml *14_04/09/35590_0.shtmle 26 mesmas notícias/ns? Word =%e6%94%AF%E4%BB%98%E5%Ae%9D+CONT: 3869124100 & MESMO = 26 & CL = 1 & TN = Notícias e RN = 30 e FM = sd ***************** http://cache.baidu.com/c?m=9f65CB4A8C8507ED4FECE7631050803743438014678387492AC3933FC239045C1C3AA5EC 677E4742CE932B2152F4174BED843670340537B0EFCA8E57DFB08F29288F2C367117845615A71BB8CB31649B66CF04FDEA44 A7ECFF25E5AAC5A0DA4323C044757E97F1FB4D7017DD1CF4 & P = 8B2A970D95DF11A05AA4C32013 & NEWP = 9E39C64AD4D50FA40 BD9B7C5253D8304503C52251D5CE042ACC & Usuário = Baidu & FM = SC & Query =%D6%A7%B8%B6%B1%A6 & QID = A400F3660007A6C5 e P1 = 2 *****************************************
Se houver alguma falha, você poderá apontá -las; Se você acha que é útil para você, experimente ~~ haha
Faça o download do código fonte, clique aqui.
O exposto acima é um exemplo de informação de rastreador de java rastreando. Continuaremos a adicionar informações relevantes no futuro. Obrigado pelo seu apoio a este site!