ฉันเคยเขียนโปรแกรมรวบรวมข้อมูล Python หน้าเดียวมาก่อนและฉันรู้สึกว่า Python ยังคงมีประโยชน์มาก ที่นี่ฉันใช้ Java เพื่อสรุปตัวรวบรวมข้อมูลหลายหน้ารวบรวมการเชื่อมโยงทั้งหมดของหน้าเมล็ดและบันทึกไว้ทั้งหมดภายใต้เส้นทาง TMP
1. คำนำ
การใช้งานตัวรวบรวมข้อมูลนี้ต้องการการสนับสนุนจากสองโครงสร้างข้อมูลคิวที่ไม่ได้เข้าชม (PriorityQueue: สามารถคำนวณความสำคัญของ URL) และตารางที่เข้าชม (Hashset: สามารถค้นหาได้อย่างรวดเร็วว่า URL มีอยู่) หรือไม่) คิวใช้เพื่อใช้การรวบรวมข้อมูลที่กว้างเป็นครั้งแรกและตารางที่เข้าเยี่ยมชมใช้เพื่อบันทึก URL ที่รวบรวมข้อมูลโดยไม่ต้องรวบรวมข้อมูลซ้ำ ๆ อีกต่อไปหลีกเลี่ยงวงแหวน ชุดเครื่องมือที่ต้องการโดย Java Crawlers รวมถึง httpClient และ HTMLPARSER1.5 และคุณสามารถดูการดาวน์โหลดของเวอร์ชันเฉพาะใน maven repo
1. เว็บไซต์เป้าหมาย: Sina http://www.sina.com.cn/
2. ภาพหน้าจอของผลลัพธ์:
มาพูดคุยเกี่ยวกับการใช้งานซอฟต์แวร์รวบรวมข้อมูล ซอร์สโค้ดจะถูกอัปโหลดไปยัง GitHub ในภายหลัง เพื่อนที่ต้องการมันสามารถฝากข้อความ:
2. การเขียนโปรแกรมตัวอักษร
1. สร้าง URL ของหน้าเมล็ด
MyCrawler Crawler = new MyCrawler ();
crawler.crawling (สตริงใหม่ [] {"http://www.sina.com.cn/"});
2. เริ่มต้นตารางที่ไม่ได้เข้าชมเป็น URL เมล็ดข้างต้น
linkqueue.addunvisitedurl (เมล็ด [i]);
3. ส่วนการใช้งานเชิงตรรกะที่สำคัญที่สุด: นำ URL ที่ไม่ได้เข้าชมในคิวดาวน์โหลดจากนั้นเพิ่มตารางที่เข้าชมแยกวิเคราะห์ URL อื่น ๆ ในหน้า URL ที่เปลี่ยนแปลงและเพิ่มคิวที่ยังไม่ได้อ่านไปยังคิวที่ไม่ได้เข้าชม วนซ้ำจนกว่าคิวจะว่างเปล่าดังนั้นเครือข่าย URL นี้ยังคงมีขนาดใหญ่มาก โปรดทราบว่าการดาวน์โหลดหน้าเว็บและการแก้ไขหน้าที่นี่จำเป็นต้องมีการใช้งาน Java Toolkit และการใช้ชุดเครื่องมือจะอธิบายอย่างละเอียดด้านล่าง
ในขณะที่ (! linkqueue.unvisitedurlsempty () && linkqueue.getVisitedUrlnum () <= 1,000) {// URL ส่วนหัวออกมาจากคิวสตริง VisitUrl = (สตริง) linkqueue if (visiturl == null) ดำเนินการต่อ; downloadfile downloadfile downloader = new ดาวน์โหลด file (); // ดาวน์โหลดหน้าเว็บดาวน์โหลด DownloadFile (Visiturl); // URL ถูกวางไว้ใน URL ที่เข้าชม linkqueue.addvisitedurl (Visiturl); // แยก URL จากชุดดาวน์โหลดเว็บเพจ <String> ลิงก์ = htmlParsertool.extraclinks (Visiturl, ตัวกรอง); // ใหม่ URL ที่ไม่ได้เข้าชมเข้าร่วม (ลิงก์สตริง: ลิงก์) {linkqueue.addunvisitedurl (ลิงก์); -4. ดาวน์โหลดชุดเครื่องมือสำหรับหน้า HTML ต่อไปนี้
Public String downloadFile (url สตริง) {String filePath = null; / * 1. สร้างวัตถุ httpclinet และตั้งค่าพารามิเตอร์ */ httpClient httpClient = httpClient ใหม่ (); // ตั้งค่าการหมดเวลาการเชื่อมต่อ HTTP สำหรับ 5S httpClient.getHttpConnectionManager (). getParams (). setConnectionTimeOut (5000); / * 2. สร้างวัตถุ getMethod และตั้งค่าพารามิเตอร์ */ getMethod getMethod = ใหม่ getMethod (URL); // ตั้งค่าการหมดเวลาการร้องขอสำหรับ 5s getMethod.getParams (). setParameter (httpmethodparams.so_timeout, 5000); // ตั้งค่าการร้องขอการประมวลผลอีกครั้ง getMethod.getParams (). setParameter (httpmethodparams.retry_handler ใหม่ defaulthttpmethodretryhandler ()); /* 3. ดำเนินการ http รับคำขอ*/ ลอง {int statusCode = httpClient.executemethod (getMethod); // กำหนดรหัสสถานะของการเข้าถึง if (statusCode! = httpstatus.sc_ok) {system.err.println ("วิธีการล้มเหลว:" + getMethod.getStatusline ()); filepath = null; }/* 4. กระบวนการตอบสนอง HTTP เนื้อหา*/byte [] ResponceBody = getMethod.getResponseBody (); // อ่านเป็นอาร์เรย์ไบต์ // สร้างชื่อไฟล์เมื่อบันทึกตาม URL ของเว็บเพจ filepath = "Temp //" + getFilenameByurl Savetolocal (Responsebody, Filepath); } catch (httpexception e) {// มีข้อยกเว้นที่ร้ายแรงเกิดขึ้นซึ่งอาจเป็นไปได้ว่าโปรโตคอลไม่ถูกต้องหรือมีปัญหากับระบบเนื้อหาที่ส่งคืนออกมา E.PrintStackTrace (); } catch (ioexception e) {// ข้อยกเว้นเครือข่ายเกิดขึ้น e.printstacktrace (); } ในที่สุด {// ปล่อยการเชื่อมต่อ getMethod.releaseconnection (); } return filepath; -5. HTML Page Parsing Toolkit:
Set Static สาธารณะ <String> extracLinks (url สตริง, ตัวกรอง linkFilter) {set <String> links = new HashSet <String> (); ลอง {parser parser = new parser (URL); parser.setencoding ("GB2312"); // กรองตัวกรองของแท็ก <frame> เพื่อแยกลิงก์ที่แสดงโดยแอตทริบิวต์ SRC ในแท็กเฟรม nodefilter framefilter = new NodeFilter () {บูลีนสาธารณะยอมรับ (โหนดโหนด) {ถ้า (node.getText () startswith ("frame src =") {กลับมาจริง; } else {return false; - // orfilter เพื่อตั้งค่าการกรอง <a> แท็กและ <frame> แท็ก orfilter linkFilter = ใหม่ orfilter (ใหม่ nodeClassFilter (linktag.class), framefilter); // รับแท็กที่ผ่านการกรองทั้งหมดรายการ nodeList = parser.extractallNodestHatMatch (LinkFilter); สำหรับ (int i = 0; i <list.size (); i ++) {node tag = list.elementat (i); if (แท็กอินสแตนซ์ของ linktag) // <a> แท็ก {linktag link = (linktag) แท็ก; String linkurl = link.getLink (); // url ถ้า (filter.accept (linkurl)) links.add (linkurl); } อื่น // <frame> แท็ก {// แยกลิงค์ไปยังแอตทริบิวต์ SRC ในเฟรมเช่น <frame src = "test.html"/> สตริงเฟรม = tag.getText (); int start = frame.indexof ("src ="); frame = frame.substring (เริ่มต้น); int end = frame.indexof (""); if (end == -1) end = frame.indexof (">"); String Frameurl = frame.substring (5, end - 1); if (filter.accept (frameurl)) links.add (frameurl); }}} catch (parserexception e) {e.printstacktrace (); } ลิงก์ส่งคืน; -6. หน้าที่ไม่ได้เข้าชมจะถูกบันทึกโดยใช้ PriorityQueue พร้อมคิวที่ต้องการส่วนใหญ่จะใช้กับอัลกอริทึมเช่น PageRank URL บางตัวมีความภักดีมากขึ้น ตารางที่เข้าชมจะถูกนำไปใช้โดยใช้ HashSet ให้ความสนใจเพื่อค้นหาอย่างรวดเร็วว่ามีอยู่หรือไม่
Linkqueue คลาสสาธารณะ {// Accessed URL Collection Private Static Set VisitedUrl = new HashSet (); // Accessed URL Collection ส่วนตัวคิวคงที่ unvisitedUrl = ใหม่ priorityQueue (); // รับ URL QUEUE สาธารณะคงที่คิว getUnvisitedUrl () {return unvisitedurl; } // เพิ่มลงใน URL คิวสาธารณะที่เข้าชมเป็นโมฆะคงที่คงที่ addVisitedUrl (สตริง url) {visitedurl.add (URL); } // ลบ URL ที่เข้าถึงได้เป็นโมฆะคงที่สาธารณะ removeVisitedUrl (url สตริง) {visitedurl.remove (URL); } // URL ที่ไม่ได้รับการคัดเลือกอยู่นอกวัตถุสาธารณะแบบคงที่ของคิวไม่ได้รับการตรวจสอบ () {return unvisitedurl.poll (); } // ตรวจสอบให้แน่ใจว่า URL แต่ละตัวสามารถเข้าถึงได้เพียงครั้งเดียวกับโมฆะสาธารณะคงที่ addunVisitedUrl (url สตริง) {ถ้า (url! = null &&! url.trim (). เท่ากับ ("") &&! visitedurl.contains (url) &&! unvisitedurl.contains (url) } // รับจำนวน URL ที่ได้รับการเข้าถึงสาธารณะคงที่ int getVisitedUrlnum () {return visitedurl.size (); } // ตัดสินว่าคิว URL ที่ไม่ได้เข้าชมนั้นว่างเปล่าบูลีนสาธารณะที่ว่างเปล่า unvisitedurlsempty () {return unvisitedurl.isempty (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น