Aujourd'hui, l'entreprise a besoin de faire des données de données après l'interrogation sur le site Web spécifié, il a donc fallu un certain temps pour rédiger une démo pour une utilisation de démonstration.
L'idée est très simple: il s'agit d'accéder au lien via Java, puis d'obtenir la chaîne HTML, puis d'analyser les données requises telles que le lien. Techniquement, JSoup est pratique pour l'analyse de page. Bien sûr, JSoup est très pratique et simple. Vous pouvez savoir comment l'utiliser avec une seule ligne de code:
Document Doc = JSoup.Connect ("http://www.oschina.net/") .data ("Query", "java") // Demande Paramètres.UserAgent ("I 'M JSoup") // Set User-agent .cookie ("Auth", "Token") // Set Cookie .Timeout (3000) // set Connection. // Utiliser la méthode du post pour accéder à l'URL L'ensemble du processus de mise en œuvre est décrit ci-dessous:
1. Analyser les pages qui doivent être analysées:
Site Web: http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicindexQuery
page:
Faites d'abord une requête sur cette page: observez l'URL, les paramètres, la méthode, etc.
Ici, nous utilisons l'outil de développeur intégré (Key Key F12), et les résultats suivants sont les résultats de la requête:
Nous pouvons voir l'URL, la méthode et les paramètres. Après avoir su comment ou une requête URL, je commencerai le code ci-dessous. Pour réutiliser et étendre, j'ai défini plusieurs classes:
1. Rule.java est utilisé pour spécifier l'URL de requête, la méthode, les paramètres, etc.
package com.zhy.spider.rule; / ** * Classe de règle * * @author zhy * * / public class Rule {/ ** * link * / private String URL; / ** * Collection de paramètres * / String privé [] Params; / ** * valeurs correspondant au paramètre * / private String [] valeurs; / ** * Pour le HTML renvoyé, veuillez définir le type d'abord * / private String resultTagName; / ** * class / id / sélection * Définissez le type de résultat, par défaut à id * / private int type = id; / ** * GET / POST * Le type de demande, par défaut Get * / private int requestMoethod = get; public final static int get = 0; public final statique int post = 1; Classe publique publique statique statique = 0; Int Int statique final public = 1; Sélection INT statique finale publique = 2; règle publique () {} règle publique (URL de chaîne, String [] params, String [] Values, String resultTagName, int type, int requestMoethod) {super (); this.url = url; this.params = params; this.values = valeurs; this.resultTagName = resultTagName; 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 () {return Values; } public void setValues (String [] valeurs) {this.values = valeurs; } public String getResultTagName () {return resultTagName; } public void setResultTagName (String resultTagName) {this.resulttagname = resultTagName; } public int getType () {return type; } public void setType (int type) {this.type = type; } public int getRequestMoethod () {return requestMoethod; } public void setRequestMoethod (int requestMoethod) {this.requestmoethod = requestMoethod; }}Permettez-moi de mettre brièvement: cette classe de règles définit toutes les informations dont nous avons besoin pendant le processus de requête, qui facilite notre extension et notre réutilisation de code. Il nous est impossible d'écrire un ensemble de code pour chaque site Web qui doit être rampé.
2. L'objet de données requis, n'a actuellement besoin que de liens, linkTypedata.java
package com.zhy.spider.bean; classe publique LinkTypedata {private int id; / ** * Adresse du lien * / chaîne privée LinkHref; / ** * Titre du lien * / LinkText de chaîne privée; / ** * Résumé * / Résumé de la chaîne privée; / ** * Contenu * / Contenu de chaîne privée; 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 résumé; } public void setsummary (Résumé de la chaîne) {this.summary = résumé; } public String getContent () {return Content; } public void setContent (String Content) {this.Content = Content; }} 3. Classe de requête Core: ExtractService.java
package com.zhy.spider.core; Importer java.io.ioException; import java.util.arraylist; Importer java.util.list; importation java.util.map; import javax.swing.plaf.textUi; import org.jsoup.connection; import org.jsoup.jsoup; import org.jsoup.nodes.document; import org.jsoup.nodes.element; import org.jsoup.select.elements; import com.zhy.spider.bean.linktypedata; import com.zhy.spider.rule.rule; import com.zhy.spider.rule.RuleException; import com.zhy.spider.util.textUtil; / ** * * @author zhy * * / public class ExtractService {/ ** * @param règle * @return * / public static List <BinkTypeData> extrait (règle de règle) {// effectuer la vérification nécessaire de la règle validaDaterule (règle); List <linkTypedata> dataS = new ArrayList <BinkTypeData> (); LinkTypeData data = null; essayez {/ ** * l'analyse de la règle * / string url = règle.getUrl (); String [] params = dule.getParams (); String [] valeurs = règle.getValues (); String resultTagName = dule.getResultTagName (); int type = règle.getType (); int requeandType = règle.getRequestMoethod (); Connexion conn = jsoup.connect (url); // Définit les paramètres de requête if (params! = Null) {for (int i = 0; i <params.length; i ++) {conn.data (params [i], valeurs [i]); }} // Définir le document de type de demande doc = null; switch (requestType) {case règle.get: doc = conn.timeout (100000) .get (); casser; Case Rule.Post: Doc = Conn.Timeout (1000000) .Post (); casser; } // RETOUR DE RETOUR DE RETOUR RÉSULTATS = NOUVEAU ÉLÉMENTS (); switch (type) {case règle.class: résultats = doc.getElementsBlass (resultTagName); casser; Case Rule.id: élément result = doc.getElementById (resultTagName); results.Add (résultat); casser; Case Rule.Selection: Results = doc.Select (resultTagName); casser; par défaut: // Lorsque le résultat est vide, la balise corporelle est dépréciée if (textUtil.iSempty (resultTagName)) {résultats = doc.getElementsByTag ("body"); }} pour (Résultat de l'élément: résultats) {Elements Links = result.getElementsByTag ("A"); pour (élément lien: links) {// string de filtre requis linkhref = link.attr ("href"); String linkText = link.text (); data = new LinkTypedata (); data.setLinkHref (linkhref); data.setLinkText (linkText); data.add (data); }}} catch (ioException e) {e.printStackTrace (); } return datas; } / ** * Effectuez la vérification nécessaire sur les paramètres passés * / private static void validaDaterule (règle règle) {String url = règle.getUrl (); if (textUtil.iSempty (url)) {lancer une nouvelle DuleException ("URL ne peut pas être vide!"); } if (! url.startswith ("http: //")) {lancer une nouvelle DoleException ("URL est incorrect!"); } if (dule.getParams ()! = null && règle.getValues ()! = null) {if (dule.getParams (). Length! = Rule.GetValues (). Length) {Throw New RuleException ("La valeur clé du paramètre ne correspond pas au nombre de clés et de valeurs!"); }}}}} 4. Une classe d'exception est utilisée: ruleexception.java
package com.zhy.spider.rule; La classe publique RuleException étend RuntimeException {public ruleException () {super (); // TODO Stub du constructeur généré automatique} public RuleException (message de chaîne, cause thrognable) {super (message, cause); // TODO Stub du constructeur généré automatiquement} public RuleException (String Message) {super (message); // TODO Stume du constructeur généré automatique} public RuleException (cause thrognable) {super (cause); // TODO STUD DE CONTRÔTEUR AUTO AUTO}} 5. Enfin, c'est un test: deux sites Web sont utilisés pour les tests ici, et différentes règles sont utilisées. Veuillez consulter le code pour plus de détails.
package com.zhy.spider.test; Importer java.util.list; import com.zhy.spider.bean.linktypedata; import com.zhy.spider.core.extractService; import com.zhy.spider.rule.rule; Test de classe publique {@ org.junit.test public void getDatasbyClass () {règle règle = new Rule ("http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicindexquery", New String [] {"Query.Entrand String [] {"xingwang", "}," cont_right ", règle.class, règle.post); list <linkTypedata> extraits = extractService.extract (règle); printf (extraits);} @ org.junit.test public void getDatasbyCSQuery () {Rule Rule = New Rule (http://www.11315.com/search ", new String [] {" name "}, new String [] {" xingwang "}," div.g-mn div.con-model ", extractService.Extrucle.get); printf (liskyTedata> datas) {for (linkTypedata data: datas) {System.out.println (data.getLinkText (); Résultat de sortie:
Shenzhen Netxing Technology Co., Ltd. http://14603257.11315.com *******************************************************************************************************************************. Quanxing Internet Cafe # *************************** COMTÉ Zichang Xinxing Net City # *********************************** La troisième branche de Shaanxi Tongxing Network Information Co., Ltd. # *****************************************************************************************************. ***********************************.
Enfin, utilisez une nouvelle Baidu pour tester notre code: cela signifie que notre code est universel.
/ ** * Utilisez Baidu News, définissez uniquement les mots URL et les mots clés et les types de retour * / @ org.junit.test public void getDatasbycsSqueryUserBaidu () {Rule Rule = New Rule ("http://news.baidu.com/ns", New String [] {"Word"}, New String [] {"allipay"} Règle.get); List <linkTypedata> extraits = extractService.Extract (règle); printf (extraits); } Nous définissons uniquement les liens, les mots clés et les types de demandes et ne définissons pas les conditions de filtre spécifiques.
Résultat: Il est certain qu'il existe certaines données indésirables, mais les données requises doivent être rampantes. Nous pouvons définir la SECTION de la règle, ainsi que des limites supplémentaires sur les conditions de filtrage.
Sort by time/ns?word=Alipay&ie=utf-8&bs=Alipay&sr=0&cl=2&rn=20&tn=news&ct=0&clk=sortbytime ********************************* x javascript:void(0) ********************************************* Alipay will jointly build a security Fonds avec plusieurs parties pour investir 40 millions dans le premier lot http://finance.ifeng.com/a/20140409/12081871_0.shtml ***************************************** 7 NOUVELLES / NS? Word =% E6% 94% AF% E4% BB% 98% E5% AE% 9D + Cont: 2465146414% 7C697779368% 7C3832159921 & MÊME = 7 & CL = 1 & TN = NEWS & RN = 30 & FM = SD ************************************************************************************* instantané http://cache.baidu.com/c?m=9d78d513d9d437ab4f9e91697d1cc0161d4381132ba7d3020cd0870fd33a541 B0120A1AC26510D19879E20345DFE1E4BEA876D26605F75A09BBFD91782A6C1352F8A2432721A844A0FD019ADC 1452FC423875D9DAD0EE7CDB168D5F18C & P = C96EC64AD48B2DEF49BD9B780B64 & NEWP = C4769A4790934EA95EA28E 281C4092695912C10E3DD796 & User = Baidu & FM = SC & Query =% D6% A7% B8% B6% B1% A6 & QID = A400F3660007A6C5 & P1 = 1 ****************************************************** OpenSLL La vulnérabilité implique de nombreux sites Web Alipay dit qu'il n'y a pas encore de fuite de données 11 instantané http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece7631050803743438014678387492ac3933fc239045c1c3aa5ec 677E4742CE932B2152F4174BED843670340537B0EFCA8E57DFB08F29288F2C367117845615A71BB8CB31649B66CF04FDEA44 A7ECFF25E5AAC5A0DA4323C044757E97F1FB4D7017DD1CF4 & P = 8B2A970D95DF11A05AA4C32013 & NEWP = 9E39C64AD4DD50FA40 BD9B7C5253D8304503C52251D5CE042ACC & USER = BAIDU & FM = SC & Query =% D6% A7% B8% B6% B1% A6 & QID = A400F3660007A6C5 & P1 = 2 ***********************************.
S'il y a des lacunes, vous pouvez les signaler; Si vous pensez que cela vous est utile, veuillez essayer ~~ haha
Téléchargez le code source, cliquez ici.
Ce qui précède est un exemple d'informations sur le robot de java rampant. Nous continuerons d'ajouter des informations pertinentes à l'avenir. Merci pour votre soutien à ce site!