Siempre he querido practicar Java Multi-Threading Data Arming.
Un día descubrí que el sitio web oficial de Rings Duoduo (http://www.shoujiduoduo.com/main/) tiene una gran cantidad de datos.
Observando su Ajax frontal para obtener datos de tono de llamada
http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getList&listid= /category id} & page = {número de página de paginación}
Es fácil encontrar que al cambiar la lista y la página, puede obtener los datos JSON del tono de llamada del servidor y analizando los datos JSON,
Puede ver que todos tienen instrucciones como {"HaSmore": 1, "Curpage": 1}. Al juzgar el valor de Hasmore, decidimos si rastrear la página siguiente.
Sin embargo, la dirección de descarga en JSON devuelta a través del enlace anterior sin tonos de llamada no está disponible en JSON
Pronto encontrará que lo verá haciendo clic en "Descargar" en la página.
A través de la siguiente solicitud, puede obtener la dirección de descarga del tono de llamada
http://www.shoujiduoduo.com/ringweb/ringweb.php?type=geturl&act=down&rid= /ringtone id}
Por lo tanto, sus datos se roban fácilmente. Entonces comencé ...
El código fuente ha sido publicado en GitHub. Si está interesado en los zapatos para niños, consulte
Github: https://github.com/yongbo000/duoduoaudiorobot
En el código:
paquete me.yongbo.duoduoringroBot; import java.io.bufferedReader; import java.io.file; import java.io.filewriter; import java.io.ioexception; import java.io.inputstream; import java.io.io.putstreamreader; import java.net.url; import java.net; java.util.iterator; import java.util.regex.matcher; import java.util.regex.pattern; import 2013/4/16 *) "http://www.shoujiduoduo.com/ringweb/ringweb.php?type=geturl&act=down&rid=%1$d";public static string error_msg =" Un error ocurrido con listid de %1 $ d y se han detenido automáticamente. %1 $ d, página actual: %2 $ d "; public static string file_dir =" e:/ringData/"; public static string file_name =" listId = %1 $ d.txt "; private boolean errorflag = false; private int listId; private int página; private int endpage = -1; intsmore = 1; privado dbhelper dbhelper;/*** war* @PariM* @PariR* @ArtUd @ @ @@PariM* @ArtUd @PariM* Número de página de inicio de la página @param* @Param Número de página final de FinPage**/public duoduoringRobotClient (int listId, int beginPage, int endpage) {this.listid = listId; this.page = beginPage; this.endPage = endpage; this.dbHelper = new dbHelper ();}/*** constructor* @param list* Menú* */public duoduoringRobotClient (int listId, int página) {this (listId, página, -1);}/** * Get RingTone * */public void getrings () {String url = string.format (get_ing_inginfo_url, listId, página); string la respuesta a la respuesta = httpget (url); ha más = gethasmore (respuestas (respuestas); getNextPage (respuestas); ringParse (Responsestr.replaceAll ("// {/" Hasmore/": [0-9]*,/" curpage/": [0-9]* ///},", "") .Replaceall (",",] ","]));}/*** Iniciate Http request* @Param Weburl Solicitud de la Conexión Solicitud*/Public Soly Soly. httpget (String WebURL) {url url; urlconnection conn; stringBuilder sb = new StringBuilder (); String ResultStr = ""; intente {url = new url (webURL); conn = url.openconnection (); conn.connect (); inputStream IS = conn.getinputput (); inputSeader isr = nuevo nuevo InputStreamReader (is); bufferedReader bufReader = new BufferedReader (ISR); String LinEtext; while ((lineText = bufReader.readLine()) != null) {sb.append(lineText);}resultStr = sb.toString();} catch (Exception e) {errorFlag = true;//Write an error to txtwriteToFile(String.format(ERROR_MSG, listId, page));}return resultStr;}/** * Convert the json string into a Ring object y guárdelo en txt* @param json json string**/public void ringparse (string json) {ring ring = null; jsonelement element = new jsonParser (). parse (json); jsonarray array = element.getasjsonArray (); // Trainse el iterador <jsonelement> it = array.Iterator (); GSON (); (it.hasnext () &&! Errorflag) {jsonElement e = it.next (); // convertir jsonelement a javabean object ring = gson.fromjson (e, ring.class); ring.setdownurl (getringdownurl (ring.getid ())); if (isavailableRering (ring))) {System.out.println (ring.ToString ()); // puede elegir escribir en la base de datos o al texto // writetofile (ring.ToString ()); writeTiTAtAbase (ring);}}}/** * Escribir a txt * @param data string * */public vud a writetofile (string) String.format (file_name, listId); file dir = new File (file_dir); file file = new File (path); filewriter fw = null; if (! Dir.exists ()) {dir.mkdirs ();} intente {if (! File.exists ()) {File.CreatEweWfile ();} FW = newWriter (File, File, File, File, File, true); fw.Write (data); fw.write ("/r/n"); fw.flush ();} catch (ioException e) {// tODO auto-generated Catch Blocke.PrintStackTrace Catch Generated Auto Generated BLOCKE.PrintStackTrace ();}}}/*** Escriba en la base de datos* @param anillo una instancia de anillo**/public void writeToTAtAbase (ring ring) {dbhelper.exeCute ("addring", ring);} @overridepublic book run () {while (ha más == 1 &&! Error {if) { -1) {if (page> endpage) {break; }} System.out.println (string.format (status_msg, listid, page)); getrings (); system.out.println (string.format ("Los datos escritos en esta página están completos"));} System.out.println ("Ending ...");} private int Pattern.compile ("/" Hasmore/": ([0-9]*),/" curpage/": ([0-9]*)"); Matcher Match = p.matcher (resultados); if (match.find ()) {return integer.parseInt (match.group (1)); } return 0;} private int getNextPage (String ResultStr) {Pattern P = Pattern.Compile ("/" Hasmore/": ([0-9]*),/" curpage/": ([0-9]*)"); Matcher Match = p.matcher (resultados); if ((find ()) {return.parseint (match.group (2);} Determine si el anillo actual cumple con la condición. Cuando el nombre del anillo es mayor de 50 caracteres o la duración es un decimal, no cumple con las condiciones y se eliminará. * @param anillo de ring || ring.getDownurl (). longitud () == 0) {return false;} return true;}/** * Obtenga la dirección de descarga del tono de llamada * @param rid tono de llamada * */public string getRingdoDure