Я всегда хотел попрактиковаться в получении многопоточных данных Java.
Однажды я обнаружил, что официальный веб -сайт колец duoduo (http://www.shoujiduoduo.com/main/) имеет большое количество данных.
Наблюдая за их фронтальным Ajax, чтобы получить данные рингтона
http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getlist&listid=;
Легко обнаружить, что, изменяя ListId и Page, вы можете получить данные JSON рингтона с сервера и анализируя данные JSON,
Вы можете видеть, что у всех есть инструкции, такие как {"hasmore": 1, "curpage": 1}. Оценивая ценность Hasmore, мы решаем, нужно ли ползти на следующей странице.
Тем не менее, адрес загрузки в JSON вернулся через ссылку выше без рингтонов, недоступен в JSON
Вскоре вы обнаружите, что увидите его, нажав на «Скачать» на странице.
С помощью следующего запроса вы можете получить адрес загрузки рингтона
http://www.shoujiduoduo.com/ringweb/ringweb.php?type=geturl&act=dow
Следовательно, их данные легко украдены. Итак, я начал ...
Исходный код был опубликован на GitHub. Если вы заинтересованы в детской обуви, пожалуйста, проверьте это
github: https://github.com/yongbo000/duoduoaudiorobot
На коде:
Пакет me.yongbo.duoduoringRobot; Import java.io.bufferedReader; импорт java.io.file; импорт java.io.filewriter; импорт java.io.ioexception; импорт java.io.inputstream; импорт java.io.inptreamerer; import java.l java.util.iterator; import java.util.regex.matcher; import java.util.regex.pattern; import com.google.gson.gson; импорт com.google.gson.jsonarray; импорт com.google.gson.jsonelement; импорт com.google.gson.jsonparser; 2013/4/16 * * *//Public Class DuoDuoringRobotClient реализует runnable {public Static String get_ringinfo_url = "http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getlist&listid=%1$&page=%2$ Znoidlislist&listId=%1, "http://www.shoujiduoduo.com/ringweb/ringweb.php?type=geturl&act= down&rid=%1$"; pubbublic user error_msg =" Произошла ошибка с ListId of %1 $ D и была остановлена. Состояние. Состояние. %1 $ d, текущая страница: %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 page;/*** * @param Начальная страница Номер страницы* @param конечная страница конечная страница номер**/public duoduoringRobotClient (int listId, int undpage, int endpage) {this.ListId = listId; this.page = beginpage; this.endPage = endPage; this.Dbhelper = new dbhelper ();}/*************************** номер**/public duoduoringRobotClient (int listId, int page) {this (listId, page, -1);}/*** Get Ringtone**/public void getrings () {string url = string.format (get_ringinfo_url, listid, page); string stractestr = httpget (url); getNextPage (responseStR); RingParse (outsersestR.Replaceall ("// {/" hasmore/": [0-9]*,/" curpage/": [0-9]* //},", "") .Replaceall (",]", "]");}/** initiate http arder* @param webur webur httpget (string weburl) {url url; urlconnection conn; stringbuilder sb = new StringBuilder (); String ResultStr = ""; try {url = new URL (weburl); conn = url.openconconection (); conn.connect (); inputstream is = conn.getinptream (); 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; // Написать ошибку txtwritetofile (string.format (error_ms, listid, page)); и сохранить его в txt* @param json json string**/public void ringparse (string json) {ring ring = null; jsonelement element = new jsonparser (). parse (json); jsonarray array = element.getasjsonarray (); // traverse reverse iterator <jsonelement> iT = array. (it.hasnext () &&! errorflag) {jsonelement e = it.next (); // преобразование jsonelement в Javabean Object Ring = gson.fromjson (e, Ring.class); Ring.setDownUrl (getRingDownUrl (RING.GETID ()); ifaVailAblering (RINGDON))))) {System.out.println (Ring.ToString ()); // Вы можете выбрать написать в базу данных или в Text // writetoFile (ring.tostring ()); writetodatabase (кольцо);}}}/** * write tot * @parat data string */public writeToFile (String Data) {string = string_diR + -формат. ListId); File dir = new File (file_dir); file file = new File (path); fileWriter fw = null; if (! dir.exists ()) {dir.mkdirs ();} try {if (! file.exists ()) {file.createnewfile ();} fw = new FileWriter (file, file, file.createnewfile (); FW.Write (data); fw.write ("/r/n"); fw.write ();} catch (ioexception e) {// todo автоматически сгенерированный слок. Автопогенерированный Catch Blocke.printStackTrace ();}}}/*** Напишите в базу данных* @param Ring Колени. -1) {if (page> endpage) {break; }} System.out.println (string.format (status_msg, listid, page)); getrings (); system.out.println (string.format («Данные, записанные на этой странице"));} system.out.println ("ending ...");} private int gethasmor Pattern.compile ("/" hasmore/": ([0-9]*),/" curpage/": ([0-9]*)"); Matcher Match = P.Matcher (ResultStr); 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 (ressultr); if (match.find () {return integer.parseInt (match. Определите, соответствует ли текущее кольцо. Когда имя кольца превышает 50 символов, или продолжительность десятичная, оно не соответствует условиям и будет удалено. * @param кольцо. ||.