จากลิงค์ไปยังเว็บไซต์เป้าหมายบทความนี้จะเพิ่มความยากขึ้นเพิ่มเนื้อหาที่เราต้องการในหน้าเป้าหมายและบันทึกไว้ในฐานข้อมูล กรณีทดสอบที่นี่ใช้เว็บไซต์ดาวน์โหลดภาพยนตร์ที่ฉันมักจะใช้ (http://www.80s.la/) เดิมทีฉันต้องการรวบรวมข้อมูลลิงค์ดาวน์โหลดภาพยนตร์ทั้งหมดบนเว็บไซต์ แต่ต่อมาฉันรู้สึกว่ามันใช้เวลานานเกินไปดังนั้นฉันจึงเปลี่ยนมันเพื่อรวบรวมข้อมูลลิงค์ดาวน์โหลดสำหรับภาพยนตร์ปี 2015
รู้เบื้องต้นเกี่ยวกับหลักการแรก
ในความเป็นจริงหลักการมีความคล้ายคลึงกับบทความแรก ความแตกต่างคือเนื่องจากมีรายการการจำแนกประเภทมากเกินไปในเว็บไซต์นี้จึงเป็นไปไม่ได้หากแท็กเหล่านี้ไม่ได้เลือก
คุณไม่จำเป็นต้องใช้ลิงก์หมวดหมู่หรือลิงก์แท็ก คุณไม่ได้ใช้ลิงก์เหล่านี้เพื่อรวบรวมข้อมูลหน้าอื่น ๆ คุณสามารถรับรายการภาพยนตร์ของหน้าอื่น ๆ ผ่านการแบ่งหน้าของภาพยนตร์ทุกประเภทที่ด้านล่างของหน้า ในเวลาเดียวกันสำหรับหน้ารายละเอียดภาพยนตร์คุณเพียงรวบรวมข้อมูลภาพยนตร์และลิงก์ดาวน์โหลด Thunder และอย่าคลานลึก คุณไม่จำเป็นต้องมีภาพยนตร์ที่แนะนำและลิงก์อื่น ๆ ในหน้ารายละเอียด
ในที่สุดบันทึกลิงก์ดาวน์โหลดของภาพยนตร์ที่ได้รับทั้งหมดในคอลเลกชัน VideoLinkMap และบันทึกข้อมูลใน MySQL โดยการสำรวจคอลเลกชันนี้
การใช้สองรหัส
หลักการการใช้งานได้รับการกล่าวถึงข้างต้นและมีความคิดเห็นโดยละเอียดในรหัสดังนั้นฉันจะไม่พูดถึงที่นี่รหัสมีดังนี้:
การกระทำของแพ็คเกจ; นำเข้า java.io.bufferedreader; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.inputstreamreader; นำเข้า java.net.httpurlconnection; นำเข้า java.net.malformedurlexception; java.sql.preparedStatement; นำเข้า java.sql.sqlexception; นำเข้า java.util.linkedhashmap; นำเข้า java.util.map นำเข้า java.util.regex.matcher; นำเข้า Java.util.regex.pattern; คลาสสาธารณะ VideoLinkGrab {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {videoLinkGrab videoLinkGrab = ใหม่ videoLinkGrab (); VideoLinkGrab.savedata ("http://www.80s.la/movie/list/-2015-----p"); } / ** * บันทึกข้อมูลที่ดึงมาในฐานข้อมูล * * @param baseUrl * จุดเริ่มต้นตัวรวบรวมข้อมูล * @return null * * / โมฆะสาธารณะ savedata (String baseUrl) {แผนที่ <สตริง, บูลีน> oldMap = ใหม่ linkedHashMap <สตริง, บูลีน> (); // store-link-is มันผ่านแผนที่ <สตริงสตริง> videoLinkMap = ใหม่ linkedHashMap <สตริงสตริง> (); // วิดีโอดาวน์โหลดลิงค์สตริง oldLinkHost = ""; // รูปแบบโฮสต์ p = pattern.compile ("(https?: //)? [^/// s]*"); // ตัวอย่างเช่น: http://www.zifangsky.cn matcher m = p.matcher (baseUrl); if (m.find ()) {oldLinkHost = m.group (); } oldMap.put (baseUrl, false); VideoLinkMap = Crawllinks (OldLinkHost, OldMap); // traverse และบันทึกข้อมูลในฐานข้อมูลลอง {การเชื่อมต่อการเชื่อมต่อ = jdbcdemo.getConnection (); สำหรับ (map.entry <string, string> mapping: videoLinkMap.entrySet ()) {precedStatement pStatement = การเชื่อมต่อ. การเตรียมการ ("แทรกลงในภาพยนตร์ (moviename, movielink) ค่า (?,?)"); pstatement.setstring (1, mapping.getKey ()); pstatement.setstring (2, mapping.getValue ()); pstatement.executeUpdate (); pstatement.close (); // system.out.println (mapping.getKey () + ":" + mapping.getValue ()); } connection.close (); } catch (sqlexception e) {e.printstacktrace (); }} /*** คลานลิงก์เว็บเพจทั้งหมดที่สามารถรวบรวมข้อมูลได้บนเว็บไซต์ ในความคิดอัลกอริทึมลำดับความสำคัญที่กว้างถูกใช้เพื่อเริ่มต้นรับคำขอสำหรับลิงก์ใหม่ที่ไม่ได้ถูกสำรวจอย่างต่อเนื่อง จนกว่าชุดที่สมบูรณ์จะถูกสำรวจไม่พบลิงก์ใหม่*ซึ่งหมายความว่าไม่สามารถหาลิงค์ใหม่ได้ งานจบลง * * เมื่อทำการร้องขอลิงก์ให้ใช้การค้นหาปกติสำหรับลิงค์วิดีโอที่เราต้องการสำหรับหน้าเว็บแล้วบันทึกไว้ในคอลเลกชัน VideoLinkMap * * @param oldlinkhost * ชื่อโดเมนเช่น: http://www.zifangsky.cn * @param oldmap CrawlLinks (สตริง oldLinkhost, แผนที่ <สตริง, บูลีน> oldMap) {แผนที่ <สตริง, บูลีน> newMap = ใหม่ linkedHashMap <สตริง, บูลีน> (); // ลิงค์ใหม่ที่ได้รับจากแต่ละแผนที่ลูป <สตริงสตริง> videoLinkMap = ใหม่ linkedHashMap <สตริงสตริง> (); // วิดีโอดาวน์โหลดลิงค์สตริง oldLink = ""; สำหรับ (map.entry <string, boolean> การแมป: oldMap.entrySet ()) {// system.out.println ("ลิงก์:" + maping.getKey () + "-------- ตรวจสอบ:" // + maping.getValue ()); // ถ้ามันไม่ได้ถูกสำรวจโดย (! mapping.getValue ()) {oldLink = mapping.getKey (); // เริ่มคำขอรับ {url url = url ใหม่ (oldLink); การเชื่อมต่อ httpurlConnection = (httpurlConnection) url .openconnection (); Connection.setRequestMethod ("รับ"); Connection.setConnectTimeOut (2500); Connection.setReadtimeout (2500); if (connection.getResponsecode () == 200) {inputStream inputStream = connection.getInputStream (); bufferedReader reader = new BufferedReader (ใหม่ inputStreamReader (inputStream, "UTF-8")); สตริงบรรทัด = ""; รูปแบบรูปแบบ = null; matcher matcher = null; // หน้ารายละเอียดภาพยนตร์นำลิงก์ดาวน์โหลดวิดีโอออกมาและอย่าดำเนินการรวบรวมข้อมูลหน้าอื่น ๆ ในเชิงลึกหาก (isMoviePage (oldLink)) {boolean chectitle = false; String title = ""; ในขณะที่ ((line = reader.readline ())! = null) {// ดึงชื่อวิดีโอในหน้าถ้า (! checkTitle) {pattern = pattern.compile ("([^// s]+).*? </title>"); matcher = pattern.matcher (บรรทัด); if (matcher.find ()) {title = matcher.group (1); checkTitle = true; ดำเนินการต่อ; }} // ลบลิงก์ดาวน์โหลดวิดีโอในรูปแบบหน้า = รูปแบบ. compile ("(Thunder: [^/"]+).*Thunder [rr] es [tt] itle =/"[^/"]*/""); matcher = pattern.matcher (บรรทัด); if (matcher.find ()) {videoLinkMap.put (ชื่อ, matcher.group (1)); System.out.println ("ชื่อวิดีโอ:" + title + "------ ลิงก์วิดีโอ:" + matcher.group (1)); หยุดพัก; // หน้าปัจจุบันถูกตรวจพบ}}} // หน้ารายการภาพยนตร์อื่น ๆ ถ้า (checkurl (oldLink)) {ในขณะที่ ((line = reader.readline ())! = null) {pattern = pattern .compile ("<a href =/" (^/"// s]*)/" ") Matcher.group (1) .Trim (); (newLink.endswith ("/")) newLink = newLink.substring (0, newLink.length () - 1); System.out.println ("อุณหภูมิ:" newLink); E.PrintStackTrace (); } ลอง {thread.sleep (1,000); } catch (interruptedException e) {e.printStackTrace (); } oldMap.replace (oldLink, false, true); }} // มีลิงก์ใหม่ดำเนินการต่อเพื่อสำรวจถ้า (! newMap.isEmpty ()) {oldMap.putAll (newMap); VideoLinkMap.putall (Crawllinks (OldLinkHost, OldMap)); // เนื่องจากลักษณะของแผนที่คู่คีย์ค่าซ้ำจะไม่เกิดขึ้น} return videoLinkMap; }/** * ตัดสินว่าเป็นหน้ารายการภาพยนตร์ปี 2015 * @param url url ที่จะตรวจสอบ * สถานะ @return * */public boolean checkurl (url สตริง) {รูปแบบรูปแบบ = pattern.compile ("http://www.80s.la/movie/list/-2015 matcher matcher = pattern.matcher (url); if (matcher.find ()) ส่งคืนจริง; // 2015 รายการอื่นส่งคืน FALSE; }/** * ตัดสินว่าหน้านี้เป็นหน้ารายละเอียดภาพยนตร์ * @param url ลิงค์หน้า * @ @ @ @ @@turn สถานะ * */public boolean ismoviePage (url สตริง) {รูปแบบรูปแบบ = pattern.compile ("http://www.80s.la/movie//d+"); matcher matcher = pattern.matcher (url); if (matcher.find ()) ส่งคืนจริง; // หน้าหนังอื่น ๆ กลับมาเป็นเท็จ - หมายเหตุ: หากคุณต้องการรวบรวมข้อมูลเนื้อหาที่ระบุจากเว็บไซต์อื่น ๆ คุณจะต้องแก้ไขการแสดงออกปกติบางอย่างตามสมเหตุสมผลตามสถานการณ์จริง
ผลการทดสอบสามรายการ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น