วันนี้ บริษัท มีความจำเป็นที่จะต้องทำการขูดข้อมูลบางอย่างหลังจากสอบถามในเว็บไซต์ที่ระบุดังนั้นจึงต้องใช้เวลาพอสมควรในการเขียนตัวอย่างสำหรับการใช้การสาธิต
แนวคิดนั้นง่ายมาก: การเข้าถึงลิงก์ผ่าน Java จากนั้นรับสตริง HTML จากนั้นแยกวิเคราะห์ข้อมูลที่ต้องการเช่นลิงก์ ในทางเทคนิคแล้ว JSOUP นั้นสะดวกสำหรับการแยกเพจ แน่นอน JSOUP นั้นสะดวกและเรียบง่ายมาก คุณสามารถรู้วิธีใช้ด้วยรหัสเดียว:
เอกสาร doc = jsoup.connect ("http://www.oschina.net/") .data ("คำถาม", "java") // คำขอพารามิเตอร์. useragent ("i 'jsoup") // set agent .cookie // ใช้วิธีการโพสต์เพื่อเข้าถึง URL กระบวนการดำเนินการทั้งหมดอธิบายไว้ด้านล่าง:
1. วิเคราะห์หน้าเว็บที่ต้องแยกวิเคราะห์:
เว็บไซต์: http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicindexQuery
หน้าหนังสือ:
ก่อนอื่นทำแบบสอบถามในหน้านี้: สังเกต URL ที่ร้องขอพารามิเตอร์วิธีการ ฯลฯ
ที่นี่เราใช้เครื่องมือนักพัฒนาในตัว (คีย์ทางลัด F12) และต่อไปนี้เป็นผลลัพธ์ของการสืบค้น:
เราสามารถเห็น URL, วิธีการและพารามิเตอร์ หลังจากรู้วิธีหรือสอบถาม URL ฉันจะเริ่มรหัสด้านล่าง เพื่อที่จะนำกลับมาใช้ใหม่และขยายฉันได้กำหนดหลายคลาส:
1. Rule.java ใช้เพื่อระบุ URL แบบสอบถามวิธีการพารามิเตอร์ ฯลฯ
แพ็คเกจ com.zhy.spider.rule; / ** * กฎกฎ * * @author Zhy * */ กฎคลาสสาธารณะ {/ ** * ลิงก์ */ url สตริงส่วนตัว; / ** * การรวบรวมพารามิเตอร์ */ สตริงส่วนตัว [] params; / *** ค่าที่สอดคล้องกับพารามิเตอร์*/ สตริงส่วนตัว [] ค่า; / ** * สำหรับ HTML ที่ส่งคืนโปรดตั้งค่าประเภทแรก */ สตริงส่วนตัวผลลัพธ์ / ** * คลาส / ID / การเลือก * ตั้งค่าประเภทของ ResultTagname, ค่าเริ่มต้นเป็น ID * / INT ส่วนตัวประเภท = ID; / ** *รับ / โพสต์ *ประเภทของคำขอ, เริ่มต้นรับ * / private int requestMoethod = get; สาธารณะสุดท้ายคงที่ int get = 0; โพสต์ int คงสุดท้ายสุดท้ายสาธารณะ = 1; ระดับสุดท้ายของสาธารณะ int class = 0; ID int คงสุดท้ายสุดท้ายสาธารณะ = 1; การเลือก int คงสุดท้ายสาธารณะสุดท้าย = 2; กฎสาธารณะ () {} กฎสาธารณะ (สตริง url, string [] params, string [] ค่า, string resulttagname, ประเภท int, int requestmoethod) {super (); this.url = url; this.params = params; this.values = ค่า; this.resultTagname = resultTagname; this.type = type; this.requestmoethod = requestmoethod; } สตริงสาธารณะ getUrl () {return url; } โมฆะสาธารณะ setUrl (rl String) {this.url = url; } สตริงสาธารณะ [] getParams () {return params; } โมฆะสาธารณะ setParams (String [] params) {this.params = params; } สตริงสาธารณะ [] getValues () {ค่าส่งคืน; } โมฆะสาธารณะ setValues (สตริง [] ค่า) {this.values = ค่า; } สตริงสาธารณะ getResultTagname () {return resultTagname; } โมฆะสาธารณะ setResultTagname (String resultTagname) {this.resultTagname = resultTagname; } public int getType () {ประเภท return; } โมฆะสาธารณะ setType (ประเภท int) {this.type = type; } public int getRequestMoethod () {return requestmoethod; } โมฆะสาธารณะ setRequestMoethod (int requestMoethod) {this.requestMoethod = requestmoethod; -ให้ฉันใส่สั้น ๆ : คลาสกฎนี้กำหนดข้อมูลทั้งหมดที่เราต้องการในระหว่างกระบวนการสอบถามซึ่งอำนวยความสะดวกในการขยายและนำรหัสกลับมาใช้ซ้ำ เป็นไปไม่ได้ที่เราจะเขียนชุดรหัสสำหรับแต่ละเว็บไซต์ที่ต้องคลาน
2. วัตถุข้อมูลที่ต้องการในปัจจุบันต้องการลิงก์เท่านั้น linktypedata.java
แพ็คเกจ com.zhy.spider.bean; LinkTypedata ชั้นเรียนสาธารณะ {ID INT ส่วนตัว; / *** ที่อยู่ลิงก์*/ สตริงส่วนตัว Linkhref; / *** ชื่อลิงก์*/ สตริงส่วนตัว linktext; / *** สรุป*/ บทสรุปสตริงส่วนตัว; / *** เนื้อหา*/ เนื้อหาสตริงส่วนตัว; สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getLinkhref () {return linkhref; } โมฆะสาธารณะ setLinkHref (String linkhref) {this.linkhref = linkhref; } สตริงสาธารณะ getLinkText () {return linkText; } โมฆะสาธารณะ setLinkText (สตริง linktext) {this.linktext = linkText; } สตริงสาธารณะ getSummary () {สรุปผลตอบแทน; } โมฆะสาธารณะ setSummary (สรุปสตริง) {this.summary = สรุป; } สตริงสาธารณะ getContent () {return content; } โมฆะสาธารณะ setContent (เนื้อหาสตริง) {this.content = เนื้อหา; - 3. คลาสคิวรีหลัก: ExtractService.java
แพ็คเกจ com.zhy.spider.core; นำเข้า java.io.ioException; นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า java.util.map; นำเข้า Javax.swing.plaf.textui; นำเข้า org.jsoup.connection; นำเข้า org.jsoup.jsoup; นำเข้า org.jsoup.nodes.document; นำเข้า org.jsoup.nodes.element; นำเข้า org.jsoup.select.elements; นำเข้า com.zhy.spider.bean.linktypedata; นำเข้า com.zhy.spider.rule.rule; นำเข้า com.zhy.spider.rule.ruleexception; นำเข้า com.zhy.spider.util.textutil; / ** * * @author Zhy * */ คลาสสาธารณะ ExtractService {/ ** * @param กฎ * @return */ รายการคงที่สาธารณะ <LinkTypedata> สารสกัด (กฎกฎ) {// ดำเนินการตรวจสอบที่จำเป็น รายการ <LinkTypEdata> datas = new ArrayList <LinkTypEdata> (); linkTypedata data = null; ลอง { / ** * Parse Rule * / string url = rule.getUrl (); String [] params = regu.getParams (); String [] values = regu.getValues (); String resultTagname = Rule.getResultTagname (); int type = regu.getType (); int requestType = Rule.getRequestMoethod (); การเชื่อมต่อ conn = jsoup.connect (url); // ตั้งค่าพารามิเตอร์การสืบค้นถ้า (params! = null) {สำหรับ (int i = 0; i <params.length; i ++) {conn.data (params [i], ค่า [i]); }} // ตั้งค่าประเภทคำขอเอกสารเอกสาร = null; switch (requestType) {case regu.get: doc = conn.timeout (100000) .get (); หยุดพัก; Case Rule.post: doc = conn.timeout (1000000) .post (); หยุดพัก; } // กระบวนการส่งคืนองค์ประกอบข้อมูลผลลัพธ์ = องค์ประกอบใหม่ (); สวิตช์ (พิมพ์) {case regu.class: results = doc.getElementByClass (resultTagname); หยุดพัก; Case Rule.id: Element Result = doc.getElementById (resultTagname); ผลลัพธ์ ADD (ผลลัพธ์); หยุดพัก; Case Rule.Selection: ผลลัพธ์ = doc.select (resultTagname); หยุดพัก; ค่าเริ่มต้น: // เมื่อ ResultTagname ว่างเปล่าแท็กร่างกายจะเลิกใช้ถ้า (textutil.isempty (resultTagname)) {results = doc.getElementsByTag ("body"); }} สำหรับ (ผลลัพธ์องค์ประกอบ: ผลลัพธ์) {องค์ประกอบการเชื่อมโยง = result.getElementByTag ("A"); สำหรับ (ลิงก์องค์ประกอบ: ลิงก์) {// สตริงตัวกรองที่ต้องการ linkhref = link.attr ("href"); สตริง linktext = link.text (); data = ใหม่ linktypedata (); data.setLinkhref (Linkhref); data.setLinkText (linktext); data.add (ข้อมูล); }}} catch (ioexception e) {e.printstacktrace (); } ส่งคืนข้อมูล; } / *** ดำเนินการตรวจสอบที่จำเป็นเกี่ยวกับพารามิเตอร์ที่ผ่าน* / Void Validaterule (กฎกฎ) {string url = regu.getUrl (); if (textutil.isempty (url)) {โยน ulleexception ใหม่ ("url ไม่สามารถว่างเปล่า!"); } if (! url.startswith ("http: //")) {โยน uleeleexception ใหม่ ("url ไม่ถูกต้อง!"); } if (regu.getParams ()! = null && regu.getValues ()! = null) {ถ้า (regu.getParams (). length! = Rule.getValues (). ความยาว) {โยน RuleeException ใหม่ ("ค่าคีย์ของพารามิเตอร์ไม่ตรงกับจำนวน Keys และค่านิยม!"); - 4. ใช้คลาสข้อยกเว้น: RuleeException.java
แพ็คเกจ com.zhy.spider.rule; RuleeException ระดับสาธารณะขยาย RuntimeException {Public RuleeException () {super (); // todo todo ที่สร้างขึ้นใหม่ stub stub} public Ruleexception (ข้อความสตริง, สาเหตุที่สามารถโยนได้) {super (ข้อความ, สาเหตุ); // todo toDo ที่สร้างขึ้นใหม่ stub stub} public Ruleexception (ข้อความสตริง) {super (ข้อความ); // todo toDo ที่สร้างขึ้นใหม่ stub stub} RuleeException สาธารณะ (สาเหตุที่สามารถลดลงได้) {super (สาเหตุ); // todo stub stub stub}}}} 5. ในที่สุดก็เป็นการทดสอบ: มีการใช้สองเว็บไซต์สำหรับการทดสอบที่นี่และใช้กฎที่แตกต่างกัน โปรดดูรหัสสำหรับรายละเอียด
แพ็คเกจ com.zhy.spider.test; นำเข้า java.util.list; นำเข้า com.zhy.spider.bean.linktypedata; นำเข้า com.zhy.spider.core.extractService; นำเข้า com.zhy.spider.rule.rule; การทดสอบคลาสสาธารณะ { @org.junit.test โมฆะสาธารณะ getDatasByClass () {กฎกฎ = กฎใหม่ ("http://www1.sxcredit.gov.cn/public/infocomQuery.do?method=publicindexquery" string [] {"Xingwang", "}," cont_right ", rule.class, rule.post); รายการ <linktypedata> extracts = extractservice.extract (กฎ); printf (สารสกัด);} @org.junit.test สาธารณะ กฎ ("http://www.11315.com/search", สตริงใหม่ [] {"ชื่อ"}, สตริงใหม่ [] {"Xingwang"}, " printf (รายการ <linktypedata> data) {สำหรับ (linktypedata data: data) {system.out.println (data.getLinkText ()); ผลลัพธ์ผลลัพธ์:
Shenzhen Netxing Technology Co. , Ltd. http://14603257.11315.com ********************************* jingzhou Xingwang Materials Co. , Ltd. Quanxing Internet Cafe# ******************************************************************************************************************************************************************* ********************************* Shaanxi Tongxing Network Co. , Ltd. Xi'an Branch# ******************************
ในที่สุดใช้ข่าว Baidu เพื่อทดสอบรหัสของเรา: หมายความว่ารหัสของเราเป็นสากล
/*** ใช้ข่าว Baidu ตั้งค่าเฉพาะ URL และคำหลักและประเภทการส่งคืน*/ @org.junit.test โมฆะสาธารณะ getDatasBycsSqueryuserBaidu () {กฎกฎ = กฎใหม่ ("http://news.baidu.com/ns", สตริงใหม่ [] Rule.get); รายการ <LinkTypEdata> extracts = extractService.extract (กฎ); printf (สารสกัด); - เราตั้งค่าลิงก์คำหลักและประเภทคำขอเท่านั้นและไม่ได้ตั้งค่าเงื่อนไขตัวกรองเฉพาะ
ผลลัพธ์: แน่นอนว่ามีข้อมูลขยะบางอย่าง แต่ข้อมูลที่ต้องการจะต้องถูกรวบรวมข้อมูล เราสามารถตั้งค่ากฎการตัดรวมถึงข้อ จำกัด เพิ่มเติมเกี่ยวกับเงื่อนไขการกรอง
เรียงลำดับตามเวลา/ns? word = alipay & ie = utf-8 & bs = alipay & sr = 0 & cl = 2 & rn = 20 & tn = ข่าว & ct = 0 & clk = sortbytime ***************************************************************************************************** กองทุนกับหลายฝ่ายเพื่อลงทุน 40 ล้านในชุดแรก http://finance.ifeng.com/a/20140409/12081871_0.shtml ******************************* News/ns? word =%e6%94%af%e4%bb%98%e5%ae%9d+cont: 2465146414%7C6977779368%7C3832153************************************** ภาพรวม http://cache.baidu.com/c?m=9d78d513d9d437ab4f9e91697d1cc0161d4381132ba7d3020cd0870fd33a541 B0120A1AC26510D19879E20345DFE1E4BEA876D26605F75A09BBFD91782A6C1352F8A2432721A8444A0FD019ADC 1452FC423875D9DAD0EE7CDB168D5F18C & P = C96EC64AD48B2DEF49BD9B780B64 & NEWP = C4769A4790934EA95EA28E 281C4092695912C10E3DD796 & USER = BAIDU & FM = SC & QUERY =%D6%A7%B8%B6%B1%A6 & QID = A400F3660007A6C5 & P1 = 1 ************************************************************************************************************************************************ *************************************** 26 ข่าวเดียวกัน/ns? word =%e6%94%af%e4%bb%98%e5%ae%9d+ต่อ: 3869124100 & same = 26 & cl = 1 & tn = ข่าว & rn = 30 & fm = sd *************************** ภาพรวม http://cache.baidu.com/c?m=9F65CB4A8C8507ED4FECE7631050803743438014678387492AC3933FC239045C1C3AA5EC 677E4742CE932B2152F4174BED843670340537B0EFCA8E57DFB08F29288F2C367117845615A71BB8CB31649B6666666666 A7ECFF25E5AAC5A0DA4323C044757E97F1FB4D7017DD1CF4 & P = 8B2A970D95DF11A05AA4C32013 & newP = 9E39C64AD4DD50FA40 BD9B7C5253D8304503C52251D5CE042ACC & USER = BAIDU & FM = SC & QUERY =%D6%A7%B8%B6%B1%A6 & QID = A400F3660007A6C5 & P1 = 2 *********************************** yahoo ญี่ปุ่นเริ่มสนับสนุนการชำระเงิน Alipay ตั้งแต่เดือนมิถุนายน http://www.techweb.com.cn/ucweb/news/id/2025843 *****************************************************
หากมีข้อบกพร่องใด ๆ คุณสามารถชี้ให้เห็นได้ หากคุณคิดว่ามันมีประโยชน์สำหรับคุณโปรดลองดู ~~ ฮ่าฮ่า
ดาวน์โหลดซอร์สโค้ดคลิกที่นี่
ข้างต้นเป็นตัวอย่างของข้อมูลการรวบรวมข้อมูล Java Crawler เราจะยังคงเพิ่มข้อมูลที่เกี่ยวข้องในอนาคต ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!