1. ข้อกำหนดและการกำหนดค่า
ข้อกำหนด: รวบรวมข้อมูลข้อมูลในหน้าการค้นหาโทรศัพท์มือถือ JD บันทึกชื่อราคาจำนวนความคิดเห็น ฯลฯ ของโทรศัพท์มือถือแต่ละเครื่องและรูปแบบตารางข้อมูลที่สามารถใช้สำหรับการวิเคราะห์จริง
การใช้โครงการ Maven, บันทึก log4j, บันทึกจะถูกส่งออกไปยังคอนโซลเท่านั้น
Maven ขึ้นอยู่กับดังนี้ (pom.xml)
<การพึ่งพา> <การพึ่งพา> <roupId> org.apache.httpComponents </groupId> <ratifactId> httpClient </artifactid> <cersion> 4.5.3 </เวอร์ชัน> </dependency> <ArtIfactId> JSOUP </artIfactId> <Sersion> 1.11.2 </Servive> </การพึ่งพา> <!-https://mvnrepository.com/artifact/log4j/log4j-> <dependency> </dependencies>
การกำหนดค่า log4j (log4j.properties), ข้อมูลเอาต์พุตและข้อมูลระดับสูงกว่าไปยังคอนโซลและไม่ได้ตั้งค่าเอกสารเอาต์พุตแยกกัน
log4j.rootlogger = ข้อมูล, คอนโซล #console log4j.appender.console = org.apache.log4j.consoleapenderlog4j.appender.console.layout = org.apache.log4j.patternlayoutlog4j.appender.console %m %n
2. การวิเคราะห์ข้อกำหนดและรหัส
2.1 การวิเคราะห์ข้อกำหนด
ขั้นตอนแรกคือการสร้างการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์และรับเนื้อหา HTML บนหน้าเว็บผ่าน URL
ขั้นตอนที่สองคือการแยกวิเคราะห์เนื้อหา HTML และรับองค์ประกอบที่ต้องการ
ขั้นตอนที่สามคือการส่งออกเนื้อหา HTML ไปยังเอกสารข้อความท้องถิ่นและสามารถวิเคราะห์ได้โดยตรงผ่านซอฟต์แวร์การวิเคราะห์ข้อมูลอื่น ๆ
จากการวิเคราะห์ข้างต้นมีการจัดตั้งสี่คลาส Gethtml (ใช้เพื่อรับเว็บไซต์ html), parsehtml (ใช้ในการแยกวิเคราะห์ HTML), writeto (ใช้สำหรับเอกสารเอาท์พุท) และ maincontrol (ใช้ในการควบคุม) ต่อไปนี้เป็นสี่คลาส เพื่อให้รหัสกระชับที่สุดเท่าที่จะเป็นไปได้ข้อยกเว้นทั้งหมดจะถูกโยนโดยตรงจากวิธีการโดยไม่ต้องจับ
2.2 รหัส
2.2.1GetHtml คลาส
คลาสนี้มีสองวิธี: GETH (String URL), URLCONTROL (String baseUrl, หน้า int) ซึ่งใช้ตามลำดับเพื่อรับเว็บเพจ HTML และ URL ควบคุม เนื่องจากเนื้อหาของเว็บเพจที่รวบรวมข้อมูลในครั้งนี้เป็นเพียงผลการค้นหาของผลิตภัณฑ์บางประเภทใน JD.com จึงไม่จำเป็นต้องสำรวจ URL ทั้งหมดในหน้า คุณจะต้องสังเกตการเปลี่ยนแปลงใน URL เมื่อเปลี่ยนหน้าและแนะนำกฎ มีเพียงวิธี urlControl ที่สัมผัสกับภายนอกและคุณสมบัติบันทึกส่วนตัวถูกตั้งค่าในคลาส: logger แบบคงที่ส่วนตัว = logger.getLogger (gethtml.class); ใช้เพื่อบันทึกบันทึก
GETH (URL String) รับเนื้อหา HTML ของ URL เดียว
urlControl (String baseUrl หน้า int) ตั้งค่าลูปและเข้าถึงข้อมูลของหลาย ๆ หน้า โดยการตรวจสอบองค์ประกอบคุณจะเห็นว่าการเปลี่ยนแปลงในหน้าของหน้าการค้นหาบน jd.com เป็นการเปลี่ยนแปลงตามลำดับคี่
หากคุณดูการเปลี่ยนแปลงใน URL หลังจากคลิกคุณจะพบว่าการเปลี่ยนแปลงที่แท้จริงคือค่าของแอตทริบิวต์หน้า โดยการประกบคุณสามารถรับที่อยู่ของหน้าเว็บถัดไปได้อย่างง่ายดาย
https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655
https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=5&s=11
https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655
รหัสโดยรวม:
นำเข้า java.io.ioException; นำเข้า org.apache.http.htttentity; นำเข้า org.apache.http.client.clientprotocolexception; นำเข้า org.apache.http.client.methods.closeablehttpresponse; org.apache.http.impl.client.closeablehttpclient นำเข้า org.apache.http.impl.client.httpclients; นำเข้า org.apache.http.util.entityutils; นำเข้า org.log4j.logger logger.getLogger (gethtml.class); สตริงคงที่ส่วนตัว geth (rl url string) พ่น clientprotocolexception, ioexception {// บันทึกการส่งออกคอนโซลเพื่อให้แต่ละ URL ที่เข้าถึงสามารถดูสถานการณ์การเข้าถึงบนคอนโซล log.info ("การแก้ไข" + url); / * * เนื้อหาต่อไปนี้คือการใช้งานทั่วไปของ httpClient เพื่อสร้างการเชื่อมต่อ * ใช้ httpClient เพื่อสร้างไคลเอนต์ * ใช้วิธี GET เพื่อเข้าถึง URL ที่ระบุ * รับการตอบกลับ * */ closeablehttpClient client = httpClients.createdefault (); httpget get = new httpget (url); การตอบสนองแบบ closeablehtpResponse = client.execute (รับ); / * * เนื้อหาต่อไปนี้คือการแปลงเนื้อหา HTML เป็นสตริง * รับการตอบสนอง * แปลงร่างการตอบสนองเป็นรูปแบบสตริงที่นี่วิธีการ toString ในเอนทิตีทิลส์ถูกใช้และรูปแบบการเข้ารหัสถูกตั้งค่าเป็น "UTF-8" * ปิดไคลเอนต์และตอบกลับหลังจากเสร็จสิ้นเอนทิตี เนื้อหาสตริง; if (เอนทิตี! = null) {content = entityUtils.toString (เอนทิตี, "UTF-8"); client.close (); Response.close (); ส่งคืนเนื้อหา; } else return null; } โมฆะสาธารณะคงที่ urlControl (สตริง baseUrl, หน้า int) พ่น clientprotocolexception, ioexception {// ตั้งค่าจำนวนหน้าปัจจุบันนับจำนวน int = 1; // หากหน้าปัจจุบันน้อยกว่าจำนวนหน้าเว็บที่คุณต้องการรวบรวมข้อมูลให้ดำเนินการในขณะที่ (นับ <หน้า) {// URL ที่เข้าถึงได้จริงคือค่า URL ที่ไม่เปลี่ยนแปลงที่เชื่อมต่อกับสตริงการเปลี่ยน URL U = baseUrl + (2 * นับ - 1) + "& คลิก = 0"; // ที่นี่เราเรียกวิธีการในคลาส Parsehtml เพื่อประมวลผลหน้า HTML ใน URL และเราจะแนะนำเนื้อหาสตริงคลาส = parsehtml.parse (geth (u)). toString (); // ที่นี่เราเรียกวิธีการในคลาส Writeto เพื่อเขียนเนื้อหาที่แยกวิเคราะห์ในเครื่อง ต่อมาเราจะแนะนำคลาส writeto.writeto (เนื้อหา); นับ ++; -2.2.2Parsehtml คลาส
ขั้นตอนนี้ต้องใช้องค์ประกอบการตรวจสอบเพื่อกำหนดแท็กที่ต้องคลานแล้วรับผ่านตัวเลือก CSS ใน JSOUP
นำเข้า org.jsoup.jsoup; นำเข้า org.jsoup.nodes.document; นำเข้า org.jsoup.nodes.element; นำเข้า org.jsoup.select.elements; Public Class Parsehtml {public Stringbuilder Parse (เนื้อหาสตริง) เอกสารเอกสาร DOC = jsoup.parse (เนื้อหา); // ใช้เลือกเลือกเพื่อคว้าองค์ประกอบที่คุณต้องการ ตัวอย่างเช่นการเลือกครั้งแรกคือเนื้อหาที่มีแอตทริบิวต์คลาสเท่ากับ GL-WARP ClearFix ในองค์ประกอบแท็ก UL ELE = DOC.SELECT ("UL [class = GL-WARP CLEARFIX]") SELECT ("LI [class = GL-item]"); // ตั้งค่าคอนเทนเนอร์เพื่อติดตั้งแต่ละแอตทริบิวต์สตริง builder sb = new StringBuilder (); // ใช้ตัวเลือกก่อนหน้าเพื่อรับองค์ประกอบทั้งหมดที่ตรงตามข้อกำหนดในหน้าทั้งหมดนั่นคือโทรศัพท์แต่ละเครื่อง ด้านล่างคุณต้องสำรวจโทรศัพท์แต่ละเครื่องเพื่อรับแอตทริบิวต์สำหรับ (องค์ประกอบ E: ELE) {// การได้มาของแต่ละแอตทริบิวต์ที่นี่หมายถึงบทความรวบรวมข้อมูลบทความบน JD.com บนอินเทอร์เน็ต ควรมีวิธีการเขียนอื่น ๆ string id = e.attr ("data-pid"); String Mingzi = E.Select ("div [class = p-name p-name-type-2]"). select ("a"). select ("em"). text (); String jiage = E.Select ("div [class = p-price]") select ("strong") select ("i"). text (); สตริง pinglun = eSelect ("div [class = p-commit]") select ("strong"). select ("a"). text (); // เพิ่มแอตทริบิวต์ sb.append (id+"/t"); sb.append (Mingzi+"/t"); sb.append (jiaage+"/t"); sb.append (pinglun+"/t"); sb.append (pinglun+"/t"); sb.append ("/r/n"); } return sb; -2.2.3writeto คลาส
วิธีการในชั้นเรียนนี้เขียนเนื้อหาที่แยกวิเคราะห์ลงในไฟล์ท้องถิ่น แค่ IO ง่ายๆ
นำเข้า java.io.bufferedWriter; นำเข้า java.io.file; นำเข้า java.io.fileWriter; นำเข้า java.io.ioException; คลาสสาธารณะ writeto {// ตั้งตำแหน่งของไฟล์ที่เก็บไฟล์ส่วนตัวไฟล์คงที่ f = ไฟล์ใหม่ ("c: //jingdong.txt"); โมฆะสาธารณะคงที่ writeto (เนื้อหาสตริง) พ่น IOException {// ใช้วิธีการเขียนอย่างต่อเนื่องเพื่อหลีกเลี่ยงการเขียนทับเนื้อหาที่เขียนก่อนหน้านี้ bufferedWriter bw = bufferedWriter ใหม่ (FileWriter ใหม่ (f, true)); bw.append (เนื้อหา); bw.flush (); bw.close (); -2.2.4MainControl คลาส
โปรแกรมควบคุมหลักเขียนที่อยู่พื้นฐานและจำนวนหน้าเว็บที่จะได้รับ โทรหาวิธี urlcontrol ในคลาส Gethtml เพื่อรวบรวมข้อมูลหน้า
นำเข้า java.io.ioException; นำเข้า org.apache.http.client.clientprotocolexception; คลาสสาธารณะ MainControl {โมฆะสาธารณะคง "https://search.jd.com/search?keyword=%E6%89%8B%E6%9C%BA&enc=" + "UTF-8 & qrst = 1 & rt = 1 & หยุด = 1 & vt = 2 & cid2 = 653 & cid3 = 655 & page ="; int page = 5; // ตั้งค่าหน้าการรวบรวมข้อมูล gethtml.urlControl (baseUrl, หน้า); -3. ผลลัพธ์คลาน
คลาน 20 หน้า
3.1 เอาต์พุตคอนโซล
3.2 เอาต์พุตเอกสาร
คุณสามารถเปิดได้โดยตรงด้วย Excel และตัวคั่นเป็นอักขระแท็บ คอลัมน์คือหมายเลขผลิตภัณฑ์ชื่อราคาและจำนวนความคิดเห็นตามลำดับ
4. สรุป
การรวบรวมข้อมูลนี้ใช้ HTTPClient และ JSOUP ซึ่งแสดงให้เห็นว่าสำหรับความต้องการง่าย ๆ เครื่องมือเหล่านี้ยังคงมีประสิทธิภาพมาก ในความเป็นจริงคุณยังสามารถเขียนคลาสทั้งหมดในคลาสเดียวและแนวคิดในการเขียนหลายชั้นเรียนนั้นชัดเจนขึ้น
บทความข้างต้น Java Crawler รวบรวมข้อมูลหน้าการค้นหาบนมือถือ httpClient+JSOUP บน JD.com เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น