ฉันต้องการฝึกฝนการคว้าข้อมูลมัลติเธรด Java เสมอ
วันหนึ่งฉันค้นพบว่าเว็บไซต์อย่างเป็นทางการของ Rings Duoduo (http://www.shoujiduoduo.com/main/) มีข้อมูลจำนวนมาก
โดยการสังเกต Ajax front-end ของพวกเขาเพื่อรับข้อมูลเสียงเรียกเข้า
http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getList&listid= {category id} & page = {หมายเลขหน้า pagination}
เป็นเรื่องง่ายที่จะค้นหาว่าโดยการเปลี่ยนรายการและหน้าคุณสามารถรับข้อมูล JSON ของเสียงเรียกเข้าจากเซิร์ฟเวอร์และโดยการแยกวิเคราะห์ข้อมูล JSON
คุณจะเห็นว่าพวกเขาทั้งหมดมีคำแนะนำเช่น {"Hasmore": 1, "curpage": 1} โดยการตัดสินคุณค่าของ Hasmore เราตัดสินใจว่าจะรวบรวมข้อมูลหน้าถัดไปหรือไม่
อย่างไรก็ตามที่อยู่ดาวน์โหลดใน JSON ที่ส่งคืนผ่านลิงค์ด้านบนโดยไม่มีเสียงเรียกเข้าไม่สามารถใช้ได้ใน JSON
ในไม่ช้าคุณจะพบว่าคุณจะเห็นมันโดยคลิกที่ "ดาวน์โหลด" บนหน้า
ผ่านคำขอต่อไปนี้คุณสามารถรับที่อยู่ดาวน์โหลดของเสียงเรียกเข้า
http://www.shoujiduoduo.com/ringweb/ringweb.php?type=geturl&act=down&rid= {Ringtone id}
ดังนั้นข้อมูลของพวกเขาจึงถูกขโมยได้ง่าย ฉันก็เริ่ม ...
ซอร์สโค้ดถูกโพสต์บน GitHub หากคุณสนใจรองเท้าเด็กโปรดตรวจสอบ
GitHub: https://github.com/yongbo000/duoduoaudiorobot
บนรหัส:
แพ็คเกจ me.yongbo.duoduoringrobot; นำเข้า java.io.bufferedreader; นำเข้า java.io.file; นำเข้า java.io.filewriter; นำเข้า java.io.ioException; นำเข้า java.io.inputstream; นำเข้า Java.Io.inputstreamreader; java.util.iterator; นำเข้า java.util.regex.matcher; นำเข้า java.util.regex.pattern; นำเข้า com.google.gson.gson; นำเข้า com.google.gson.jsonarray; นำเข้า com.google.gson.jsonelement; 2013/4/16 * * */คลาสสาธารณะ duoduoringrobotclient ใช้งานได้ {สตริงคงที่สาธารณะ get_ringinfo_url = "http://www.shoujiduoduo.com/ringweb/ringweb.php "http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getUrl&act=down&rid=%1$$d"; %1 $ d, หน้าปัจจุบัน: %2 $ d "; สตริงคงที่สาธารณะ file_dir =" e:/ringdata/"; สตริงคงที่สาธารณะ file_name =" listid = %1 $ d.txt "; boolean private errorflag = false; intlistid ส่วนตัว; @Param หน้าเริ่มหน้าหมายเลขหน้า* @param Endpage End หมายเลขหน้า**/public duoduoringrobotClient (int listId, int artiagpage, int endpage) {this.listid = listid; this.page = engatpage; this.endpage = endpage; */public duoduoringRobotClient (int listId, หน้า int) {this (listid, page, -1);}/** * รับเสียงเรียกเข้า * */โมฆะสาธารณะ getrings () {string url = string.format (get_ringinfo_url, listid, page); getNextPage (responsestr); ringparse (responsestr.replaceall ("// {/" Hasmore/": [0-9]*,/" curpage/": [0-9]* //},", ""). Replaceall (",]"] ")); httpget (สตริง weburl) {url url; urlconnection conn; stringbuilder sb = new Stringbuilder (); String resultstr = ""; ลอง {url = url ใหม่ (weburl); conn = url.openconnection (); conn.connect (); InputStreamReader (IS); bufferedReader bufreader = ใหม่ bufferedReader (ISR); สตริง linetext; ในขณะที่ ((linetext = bufreader.readline ())! = null) {sb.append (linetext);} resultstr = sb.toString ();} catch (exception e) {errorflag = true; // เขียนข้อผิดพลาดเพื่อ txtWriteTofile และบันทึกไว้ใน txt* @param json json string**/โมฆะสาธารณะ ringparse (สตริง json) {แหวนแหวน = null; องค์ประกอบ jsonelement = new jsonparser (). parse (json); jsonarray array = element.getasjsonarray (); // (it.hasnext () &&! errorflag) {jsonElement e = it.next (); // แปลง jsonElement เป็นแหวนวัตถุ javabean = gson.fromjson (e, ring.class); ring.setdownurl {system.out.println (ring.toString ()); // คุณสามารถเลือกที่จะเขียนลงในฐานข้อมูลหรือไปยังข้อความ // writetofile (ring.toString ()); writetoDatabase (แหวน);}}}/** string.format (file_name, listid); ไฟล์ dir = ไฟล์ใหม่ (file_dir); ไฟล์ไฟล์ = ไฟล์ใหม่ (พา ธ ); filewriter fw = null; ถ้า (! dir.exists ()) {dir.mkdirs ();} ลอง {if true); fw.write (data); fw.write ("/r/n"); fw.flush ();} catch (ioexception e) {// todo ที่สร้างขึ้นอัตโนมัติ catch blocke.printstacktrace ();}} {ลอง {ถ้า (fw! = null) catch blocke.printStackTrace ();}}}/*** เขียนลงในฐานข้อมูล* @param แหวนอินสแตนซ์ของแหวน**/โมฆะสาธารณะ writeTodatabase (แหวนแหวน) {dbhelper.execute ("addring", ring); ! = -1) {ถ้า (หน้า> EndPage) {break; }} system.out.println (string.format (status_msg, listid, page)); getrings (); system.out.println (string.format ("ข้อมูลที่เขียนในหน้านี้เสร็จสิ้น"));} system.out.println ("สิ้นสุด ... "); pattern.compile ("/" Hasmore/": ([0-9]*),/" curpage/": ([0-9]*)"); Matcher Match = P.Matcher (ResultsTR); if (match.find ()) {return integer.parseint (match.group (1)); } return 0;} int ส่วนตัว getNextPage (String resultsTr) {pattern p = pattern.compile ("/" Hasmore/": ([0-9]*),/" curpage/": ([0-9]*)"); Matcher Match = p.matcher (ResultsTr); * ตรวจสอบว่าแหวนปัจจุบันเป็นไปตามเงื่อนไขหรือไม่ เมื่อชื่อวงแหวนมากกว่า 50 อักขระหรือระยะเวลาเป็นทศนิยมมันจะไม่เป็นไปตามเงื่อนไขและจะถูกลบออก * @param แหวนวงแหวนวัตถุอินสแตนซ์**/บูลีนส่วนตัว isavailabering (แหวนแหวน) {รูปแบบ p = pattern.compile ("^[1-9] [0-9]* $"); การจับคู่จับคู่ = p.matcher (ring.getDuration (); if (! match.find () || ring.getDownUrl (). ความยาว () == 0) {return false;} return true;}/** * รับที่อยู่ดาวน์โหลดของเสียงเรียกเข้า * @param Rid Ringtone ID */สตริงสาธารณะ getRingDownUrl (String rid) {string url = string.format