لطالما أردت ممارسة الحصول على بيانات جافا متعددة الخيوط.
في أحد الأيام اكتشفت أن الموقع الرسمي لـ Rings Duoduo (http://www.shoujiduoduo.com/main/) يحتوي على كمية كبيرة من البيانات.
من خلال مراقبة AJAX الواجهة الأمامية للحصول على بيانات نغمة الرنين
http://www.shoujiduoDuo.com/ringweb/ringweb.php؟type=getList&Listid= {معرف} و page = {رقم صفحة pagination}
من السهل العثور على أنه عن طريق تغيير ListId و Page ، يمكنك الحصول على بيانات JSON من نغمة الرنين من الخادم ، ومن خلال تحليل بيانات JSON ،
يمكنك أن ترى أن جميعهم لديهم تعليمات مثل {"hasmore": 1 ، "curpage": 1}. من خلال الحكم على قيمة هاسور ، نقرر ما إذا كان سيتم الزحف في الصفحة التالية.
ومع ذلك ، فإن عنوان التنزيل في JSON الذي تم إرجاعه عبر الرابط أعلاه بدون نغمات غير متوفرة في JSON
ستجد قريبًا أنك ستراها من خلال النقر على "التنزيل" على الصفحة.
من خلال الطلب التالي ، يمكنك الحصول على عنوان تنزيل نغمة الرنين
http://www.shoujiduoduo.com/ringweb/ringweb.php؟type=geturl&act=down&rid= {errestone id}
لذلك ، يتم سرقة بياناتهم بسهولة. لذلك بدأت ...
تم نشر رمز المصدر على Github. إذا كنت مهتمًا بأحذية الأطفال ، فيرجى التحقق من ذلك
Github: https://github.com/yongbo000/duoduoaudiorobot
على الرمز:
package me.yongbo.duoduoringRobot ؛ import java.io.bufferedreader ؛ import java.io java.util.iterator ؛ استيراد java.util.regex.matcher ؛ استيراد java.util.regex.pattern ؛ استيراد com.google.gson.gson ؛ استيراد com.google.gson.jsonarray ؛ 2013/4/16 * * */public class duoduoringRobotClient تنفذ Runnable {public static string get_ringinfo_url = "http://www.shoujiduoduo.com/ringweb/ringweb.php؟type=getlist & alisted=٪1 $ 0٪2URDEDRIDDIS ؛ ' ٪ 1 $ d ، الصفحة الحالية: ٪ 2 $ d "؛ السلسلة الثابتة العامة file_dir =" e:/ringdata/"؛ سلسلة ثابتة piles_name =" listid = ٪ 1 $ d.txt "؛ private boolean error ؛ PARAM صفحة بدء الصفحة رقم الصفحة* param رقم الصفحة نهاية الصفحة رقم الصفحة**//duoduoringRobotClient العامة (int listID ، int beginpage ، int endpage) {this.listid = listid ؛ this.page = startPage ؛ */duoduoringRobotClient (int listid ، int) {this (listid ، page ، -1) ؛}/** * احصل على رنين * */public void getRings () {string url = string.format (get_ringinfo_url ، listid ، page) ؛ getNextPage (Responster) ؛ RingParse (ResponStR.ReplaceAll ("// {/" hasmore/": [0-9]* ،/" curpage/": [0-9]* //} ،" ، "") .Replaceall ("،" ، "]) ؛ httpget (string weburl) {url url ؛ urlConnection conn ؛ stringbuilder sb = new StringBuilder () ؛ String Resultstr = "" ؛ Try {url = new url (weburl) ؛ conn = url.openconnection () ؛ inputStreamReader (IS) ؛ BufferedReader Bufreader = جديد BufferedReader (ISR) ؛ String linetext ؛ بينما ((linetext = bufreader.readline ())!! = null) {sb.append (linetext) ؛} النتائج = sb.toString () ؛} catch (استثناء e) {errorflag = true ؛ وحفظه في TXT* param json json string**/public void ringparse (string json) {ring ring = null ؛ jsonelement element = new jsonparser (). parse (json) ؛ jsonarray array = element.getasjsonarray () ؛ (it.hasnext () &&! errorflag) {jsonelement e = it.next () ؛ // تحويل jsonelement إلى javabean compling ring = gson.fromson (e ، ring.class) ؛ ring.setDownurl (getringdownurl (ring.getid ()))) ؛ {system.out.println (ring.toString ()) ؛ // يمكنك اختيار الكتابة إلى قاعدة البيانات أو إلى text // writeTofile (ring.toString ()) ؛ writetodatabase (ring) ؛}}}/** listId) ؛ file dir = new file (file_dir) ؛ file file = new file (path) ؛ filewRiter fw = null ؛ if (! dir.exists ()) {dir.mkdirs () ؛ صحيح) ؛ fw.write (data) ؛ fw.write ("/r/n") ؛ fw.flush () ؛} catch (ioException e) {// todo acto catch blocke.printstacktrace () ؛ catch catch blocke.printstacktrace () ؛}}}/*** اكتب إلى قاعدة بيانات* param حلقة مثيل من الحلقة**/public void writeTodatabase (حلقة الحلقة) {dbhelper.execute ("addring" ، ring) ؛ -1) {if (page> page) {break ؛ }} system.out.println (string.format (status_msg ، listid ، page)) ؛ getRings () ؛ system.out.println (string.format ("تم إكمال البيانات المكتوبة في هذه الصفحة"))) ؛ 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 (سلسلة النتائج) {pattern p = pattern.compile ("/" hasmore/": ([0-9]*) ،/" curpage/": ([0-9]*) تحديد ما إذا كانت الحلقة الحالية تلبي الشرط. عندما يكون اسم الحلقة أكبر من 50 حرفًا أو المدة تكون عشرية ، فإنه لا يلبي الشروط وسيتم إزالته. * @param ring current consum joulse extle**/private boolean isavailablering (ring ring) {pattern p = pattern.compile ("^[1-9] [0-9]* $") ؛ matcher match = p.matcher (ring.getDuration ()) ؛ if (! ||. ring.getDownurl ().