1. Exigences et configuration
Exigences: Crawer les informations sur la page de recherche de téléphone mobile JD, enregistrer le nom, le prix, le nombre de commentaires, etc. de chaque téléphone mobile et former une table de données qui peut être utilisée pour l'analyse réelle.
En utilisant le projet Maven, les journaux log4j, les journaux sont exportés uniquement vers la console.
Maven dépend comme suit (pom.xml)
<Dependances> <Dependency> <GroupId> org.apache.httpComponents </rom grouped> <ArtifActid> httpclient </ artifactId> <version> 4.5.3 </ version> </ Dependency> <Dendency> <! - Jsoup html Parserd> Library @ https://jsoup.org/ -> <grouped> ORG.J <Artifactid> JSoup </ artifactId> <Dersion> 1.11.2 </ version> </ Dependency> <! - https://mvnrepository.com/artifact/log4j/log4j -> <dependency> <proupId> LOG4J </ GroupID> <Artifactid> Log4j </ ArtifActid> <Dursed> 1.2.17 <fri version> </Dedency> </DENDENDENCES>
Configuration log4j (log4j.properties), informations de sortie et informations supérieures aux informations de niveau à la console, et ne définissez pas le document de sortie séparément.
log4j.rootlogger = info, console #console log4j.appendender.console = org.apache.log4j.consoleAppenderLog4j.appenden
2. Analyse et code des exigences
2.1 Analyse des exigences
La première étape consiste à établir une connexion entre le client et le serveur et d'obtenir le contenu HTML sur la page Web via l'URL.
La deuxième étape consiste à analyser le contenu HTML et à obtenir les éléments requis.
La troisième étape consiste à sortir le contenu HTML vers le document texte local et peut être analysé directement via d'autres logiciels d'analyse de données.
Selon l'analyse ci-dessus, quatre classes sont établies, GETHTML (utilisée pour obtenir le site Web HTML), le parsehtml (utilisé pour analyser HTML), WriteTo (utilisé pour produire des documents) et MainControl (utilisé pour contrôler). Voici quatre classes. Pour rendre le code aussi concis que possible, toutes les exceptions sont jetées directement à partir de la méthode sans capture.
2.2 Code
2.2.1Gethtml Classe
Cette classe contient deux méthodes: GETH (URL de chaîne), URLControl (String Bustanl, INT Page), qui sont respectivement utilisées pour obtenir la page Web HTML et l'URL de contrôle. Étant donné que le contenu de la page Web a rampé cette fois que les résultats de recherche d'un certain type de produit sur JD.com, il n'est pas nécessaire de traverser toutes les URL de la page. Il vous suffit d'observer les modifications de l'URL lors de la tournage de la page et d'introduire les règles. Seule la méthode URLControl est exposée à l'extérieur, et une propriété de journal privé est définie dans la classe: logger statique privé Log = logger.getLogger (gethtml.class); est utilisé pour enregistrer les journaux.
Geth (URL de chaîne), obtenez le contenu HTML d'une seule URL.
URLControl (String BounseUrl, INT Page), définit la boucle et accède aux données de plusieurs pages. En examinant les éléments, vous pouvez voir que le changement dans la page de la page de recherche sur JD.com est en fait un changement de commande ODD.
Si vous regardez les modifications de l'URL après avoir cliqué, vous constaterez que la modification réelle est la valeur de l'attribut de page. En épissant, vous pouvez facilement obtenir l'adresse de la page Web suivante.
https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=3&s=47&click=0
https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=5&s=111&click=0
https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=7&s=162&click=0
Code global:
import java.io.ioException; import org.apache.http.httpentity; import org.apache.http.client.clientprotocolexception; import org.apache.http.client.methods.closeablehttprosse; import org.apache.http.client.Methods.httpget; org.apache.http.impl.client.closeablehttpclient; import org.apache.http.impl.client.httpclients; importer org.apache.http.util.entityutils; import org.apache.log4j.logger; classe publique Gethtml {// créer log private STatic logger log = Logger.getLogger (gethtml.class); String statique privé Geth (URL de chaîne) lève ClientProtoCoLexception, ioException {// Console Sorties Journals, afin que chaque URL accessible puisse voir la situation d'accès sur la console log.info ("résoudre" + URL); / * * Le contenu suivant est l'utilisation générale de HttpClient pour établir des connexions * Utilisez httpClient pour établir un client * Utilisez la méthode GET pour accéder à l'URL spécifiée * Get a Response * * / CloseableHttpClient client = httpClient.CreateDefault (); Httpget get = new httpget (url); CloseableHttpResponse Response = client.Execute (get); / * * Le contenu suivant est de convertir le contenu HTML en chaîne * Obtenez le corps de réponse * Convertir le corps de réponse au format de chaîne, ici la méthode de toString dans EntityUtils est utilisée, et le format de codage est défini sur "utf-8" * Fermez le client et réponse après l'achèvement * * / httpentity entity = réponse.getEntity (); String Content; if (entité! = null) {content = entityUtils.tostring (entité, "utf-8"); client.close (); réponse.close (); retourner le contenu; } else return null; } public static void urlControl (String Bustanl, int page) lève ClientProtoCoLexception, ioException {// Définir le nombre de page actuel int count = 1; // Si la page actuelle est inférieure au nombre de pages que vous souhaitez ramper, exécutez while (compter <page) {// L'URL réellement accessible est la valeur d'URL inchangée épissée avec la chaîne de valeur de modification d'URL U = BUSUTURL + (2 * COUNT - 1) + "& click = 0"; // Nous appelons ici la méthode dans la classe parsehtml pour traiter la page HTML dans l'URL, et nous présenterons la classe Class String Content = paSehtml.Parse (Geth (U)). ToString (); // Ici, nous appelons la méthode de la classe WriteTo pour écrire le contenu analysé localement. Plus tard, nous présenterons la classe WriteTo.WriteTo (Contenu); Count ++; }}}2.2.2Parsehtml Classe
Cette étape nécessite l'élément de révision pour déterminer les balises qui doivent être rampantes, puis les obtenir via le sélecteur CSS dans JSoup.
import org.jsoup.jsoup; import org.jsoup.nodes.document; import org.jsoup.nodes.element; import org.jsoup.select.elements; classe publique Parsehtml {public stating stringbuilder parse (string contenu) {// Utiliser la méthode de l'analyse, pour analyser le contenu HTML qui a été converti, et le document de retour pour analyser le HTML Document de classe Doc = JSoup.Parse (Contenu); // Utilisez SELECT SELECT pour saisir les éléments que vous devez trouver. Par exemple, le premier Select est le contenu dont l'attribut de classe est égal à GL-warp clearFix dans les éléments de balise ul ele = doc.select ("ul [class = gl-warp clearfix]"). SELECT ("li [classe = gl-item]"); // Définissez un conteneur pour installer chaque attribut stringBuilder sb = new StringBuilder (); // Utilisez le sélecteur précédent pour obtenir tous les éléments qui répondent aux exigences de toute la page, c'est-à-dire chaque téléphone. Ci-dessous, vous devez traverser chaque téléphone pour obtenir ses attributs pour (élément e: ele) {// L'acquisition de chaque attribut ici fait référence à un article rampant de contenu sur JD.com sur Internet. Il devrait y avoir d'autres méthodes d'écriture différentes. String id = e.attr ("data-pid"); String mingzi = e.select ("div [class = p-name p-name-type-2]"). Select ("a"). Select ("em"). Text (); String jiage = e.select ("div [classe = p String Pinglun = E.Select ("div [class = p-comit]"). SELECT ("Strong"). SELECT ("A"). Text (); // Ajouter des attributs sb.append (id + "/ t"); SB.APPEND (Mingzi + "/ T"); SB.APPEND (jiaage + "/ t"); SB.APPEND (Pinglun + "/ T"); SB.APPEND (Pinglun + "/ T"); sb.append ("/ r / n"); } return sb; }}2.2.3writeTo Classe
Les méthodes de cette classe écrivent du contenu analysé dans un fichier local. Juste une simple IO.
Importer java.io.bufferedwriter; Importer java.io.file; import java.io.filewriter; import java.io.ioexception; public class WriteTo {// Définissez l'emplacement du fichier de fichier file statique privé f = nouveau fichier ("c: //jingdong.txt"); Public Static Void WriteTo (String Content) lève IOException {// Utilisez la méthode d'écriture continue pour éviter d'écraser le contenu écrit précédemment BufferedWriter BW = new BufferedWriter (nouveau FileWriter (F, True)); bw.append (contenu); bw.flush (); bw.close (); }}2.2.4 mainControl Classe
Le programme de contrôle principal, rédigez l'adresse de base et le nombre de pages à obtenir. Appelez la méthode UrlControl dans la classe GETHTML pour ramper la page.
Importer java.io.ioException; import org.apache.http.client.clientprotocolexception; public class Mainontrol {public static void main (string [] args) lève la méthode clientProtocolexception, ioException {// TODO généré par la méthode générée automatique "https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&enc=" + "utf-8 & qrst = 1 & rt = 1 & stop = 1 & vt = 2 & cid2 = 653 & cid3 = 655 & page ="; int page = 5; // Définissez le numéro de page Crawl GETHTML.UrlControl (BUSURL, PAGE); }}3. Résultats rampants
Crawer 20 pages.
3.1 Sortie de la console
3.2 Sortie du document
Vous pouvez l'ouvrir directement avec Excel, et le délimiteur est un caractère d'onglet. Les colonnes sont le numéro de produit, le nom, le prix et le nombre de commentaires respectivement.
4. Résumé
Cette rampe utilise HttpClient et JSoup, qui montre que pour les besoins simples, ces outils sont toujours très efficaces. En fait, vous pouvez également écrire toutes les classes en une seule classe, et l'idée d'écrire plusieurs classes est plus claire.
L'article ci-dessus Java Crawler explore la page de recherche mobile HttpClient + JSoup sur JD.com est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.