1. Requisitos y configuración
Requisitos: rastree la información en la página de búsqueda del teléfono móvil JD, registre el nombre, el precio, el número de comentarios, etc. de cada teléfono móvil y forme una tabla de datos que pueda usarse para el análisis real.
Utilizando el proyecto Maven, los registros LOG4J, los registros se exportan solo a la consola.
Maven depende de lo siguiente (pom.xml)
<pendencies> <pendency> <uproupid> org.apache.httpcomponents </groupid> <artifactid> httpclient </artifactid> <versión> 4.5.3 </version> </pendency> <pendency> <!-jsoup html biblioteca @ https://jsoup.org/-> <proupid> ogs. <artifactid> jSoup </sartifactid> <versión> 1.11.2 </versión> </dependence> <!-https://mvnrepository.com/artifact/log4j/log4j-> <pendency> </groupid> log4j </groupid> <artifactid> log4j </artifactid> <verserse> 1.2.17 </versión> log4j </groupid> <arifactid> log4j </artifactid> <versions> 1.2.17 </Versión> </dependencias>
Configuración LOG4J (LOG4J.Properties), información de salida e información de nivel anterior a la consola, y no establezca el documento de salida por separado.
log4j.rootlogger = info, console #console log4j.appender.console = org.apache.log4j.consoleppenderlog4j.appender.console.layout = org.apache.log4j.patternlaglog4j.appender.console.layout.conconversionpattern
2. Análisis y código de requisitos
2.1 Análisis de requisitos
El primer paso es establecer una conexión entre el cliente y el servidor, y obtener el contenido HTML en la página web a través de la URL.
El segundo paso es analizar el contenido HTML y obtener los elementos requeridos.
El tercer paso es generar el contenido HTML al documento de texto local y puede analizarse directamente a través de otro software de análisis de datos.
Según el análisis anterior, se establecen cuatro clases, Gethtml (se utiliza para obtener HTML del sitio web), parsehtml (utilizado para analizar HTML), WriteTo (utilizado para emitir documentos) y Principal Control (utilizado para controlar). Las siguientes son cuatro clases. Para que el código sea lo más conciso posible, todas las excepciones se arrojan directamente del método sin captura.
2.2 Código
2.2.1gethtml clase
Esta clase contiene dos métodos: GETH (URL de cadena), URLControl (String BaseUrl, INT Page), que se utilizan respectivamente para obtener HTML de la página web y URL de control. Dado que el contenido de la página web se arrastró esta vez son solo los resultados de búsqueda de un cierto tipo de producto en jd.com, no es necesario atravesar todas las URL en la página. Solo necesita observar los cambios en la URL al girar la página e introducir las reglas. Solo el método de URLControl está expuesto al exterior, y una propiedad de registro privado se establece en la clase: Logger static privado log = logger.getLogger (gethtml.class); se usa para grabar registros.
Geth (URL de cadena), obtenga el contenido HTML de una sola URL.
URLControl (String BaseUrl, INT Page), establece el bucle y accede a los datos de varias páginas. Al revisar los elementos, puede ver que el cambio en la página de la página de búsqueda en jd.com es en realidad un cambio en el orden extraño.
Si observa los cambios en la URL después de hacer clic, encontrará que el cambio real es el valor del atributo de página. Al empalmar, puede obtener fácilmente la dirección de la siguiente página web.
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
Código general:
import java.io.ioException; import org.apache.http.httpentity; import org.apache.http.client.clientprotocoleException; import org.apache.http.client.methods.closablehttttpesponse; import org.apache.http.impl.client.closEableHttpClient; import org.apache.http.imp.client.httpclients; import opache.http.util.entityUtils; import org.apache4j.logger; public class gethtml {// CREATE LOGGER STATIC LOGGER = Logger.getLogger (gethtml.class); Private static string geth (URL de cadena) arroja ClientProtocolexception, IOException {// Registros de salida de consola, de modo que cada URL accedida puede ver la situación de acceso en la consola log.info ("resolución" + URL); / * * El siguiente contenido es el uso general de HttpClient para establecer conexiones * Use httpclient para establecer un cliente * Use el método GET para acceder a la URL especificada * Obtener una respuesta * */ ClosableHttpClient Client = httpclients.createDefault (); Httpget get = new httpget (url); ClosableHttPResponse Response = Client.execute (get); / * * El siguiente contenido es convertir el contenido HTML en cadena * Obtener el cuerpo de respuesta * Convierta el cuerpo de respuesta en formato de cadena, aquí se usa el método de tostración en entityUtils, y el formato de codificación se establece en "UTF-8" * Cierre el cliente y responda después de la finalización * */ httpentity entity = Response.getEntity ();; Contenido de cadena; if (entity! = null) {content = entityUtils.toString (entidad, "utf-8"); client.close (); respuesta.close (); devolver contenido; } else return null; } public static void urlControl (String baseUrl, int página) arroja ClientProtocolexception, ioexception {// establece el recuento de página actual int count = 1; // Si la página actual es menor que el número de páginas que desea rastrear, ejecute mientras (contar <page) {// La URL realmente accedida es el valor de URL sin cambios empalmado con la cadena de valor de cambio de URL u = baseUrl + (2 * recuento - 1) + "& click = 0"; // Aquí llamamos al método en la clase parsehtml para procesar la página HTML en la URL, y presentaremos el contenido de cadena de clase = parsehtml.parse (geth (u)). ToString (); // Aquí llamamos al método en la clase WriteTo para escribir el contenido analizado localmente. Más tarde, presentaremos la clase WriteTo.WriteTo (contenido); contar ++; }}}2.2.2parsehtml clase
Este paso requiere el elemento de revisión para determinar las etiquetas que deben arrastrarse, y luego obtenerlas a través del selector CSS en JSOUP.
import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class ParseHTML { public static StringBuilder parse(String content) { //Use the parse method in Jsoup to analyze the HTML content that has been converted to String, and the return value is Document class Documento doc = JSoup.Parse (contenido); // Use Seleccionar seleccionar para tomar los elementos que necesita encontrar. Por ejemplo, la primera selección es el contenido cuyo atributo de clase es igual a GL-WARP ClearFix en los elementos de etiqueta UL ele = doc.select ("UL [class = GL-warp Clearfix]"). Seleccione ("li [class = gl-item]"); // Establecer un contenedor para instalar cada atributo StringBuilder sb = new StringBuilder (); // Use el selector anterior para obtener todos los elementos que cumplan con los requisitos en toda la página, es decir, cada teléfono. A continuación, debe atravesar cada teléfono para obtener sus atributos para (Elemento E: ELE) {// La adquisición de cada atributo aquí se refiere a un artículo que arrastra el contenido en JD.com en Internet. Debe haber otros métodos de escritura diferentes. 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 [class = p-price]"). Seleccione ("Strong"). Seleccione ("I"). Text (); String pinglun = e.select ("div [class = P-Commit]"). Seleccione ("Strong"). Seleccione ("A"). Text (); // agregar atributos 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.3 Clase de WriteTo
Los métodos en esta clase escriben contenido analizado en un archivo local. Solo un simple IO.
import java.io.bufferedwriter; import java.io.file; import java.io.filewriter; import java.io.ioException; public class writeToTo {// Establezca la ubicación del archivo estático privado de almacenamiento de archivos f = nuevo archivo ("c: //jingdong.txt"); public static void writeTo (String Content) lanza IOException {// Use el método de escritura continua para evitar sobrescribir el contenido escrito previamente bufferedWriter bw = new BufferedWriter (New FileWriter (F, True)); bw.append (contenido); bw.flush (); bw.close (); }}2.2.4MainControl Clase
El programa de control principal, escriba la dirección base y el número de páginas a obtener. Llame al método URLControl en la clase GETHTML para rastrear la página.
import java.io.ioException; import org.apache.http.client.clientprotocoleException; public class principalControl {public static void main (string [] args) lanza ClientProtocolException, IOException {// TODO Auto Generado Método String String Baseurl = "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 página = 5; // Establezca el número de página de rastreo gethtml.urlControl (baseUrl, página); }}3. Resultados de arrastre
Rastrear 20 páginas.
3.1 Salida de la consola
3.2 Salida del documento
Puede abrirlo directamente con Excel, y el delimitador es un carácter de pestaña. Las columnas son el número de producto, el nombre, el precio y el número de comentarios respectivamente.
4. Resumen
Este rastreo utiliza httpclient y jsoup, que muestra que para las necesidades simples, estas herramientas siguen siendo muy eficientes. De hecho, también puede escribir todas las clases en una sola clase, y la idea de escribir múltiples clases es más clara.
El artículo anterior Java Crawler rastrea la página de búsqueda móvil httpclient+jsoup en jd.com es todo el contenido que comparto con ustedes. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.