1. Persyaratan dan Konfigurasi
Persyaratan: Merayap informasi di halaman pencarian ponsel JD, merekam nama, harga, jumlah komentar, dll. Dari setiap ponsel, dan membentuk tabel data yang dapat digunakan untuk analisis aktual.
Menggunakan proyek Maven, log4J log, log hanya diekspor ke konsol.
Maven tergantung sebagai berikut (pom.xml)
<Dependencies> <dependency> <GroupId> org.apache.httpComponents </groupId> <ArTifactId> httpClient </t Artifactid> <version> 4.5.3 </version> </dependency> <!-groupp.> groupger <groupg> org. <ArtifactId> jsoup </stifactid> <version> 1.11.2 </version> </dependency> <!-https://mvnrepository.com/artifact/log4j/log4j-</Artidence> </versi </groupid> <arttifactid> </art/art/versi </groupid> <TROPID> <TRIPRIFID> </ARTIFACTID> </art </dependensi>
Konfigurasi log4j (log4j.properties), info output dan informasi level di atas ke konsol, dan jangan mengatur dokumen output secara terpisah.
log4j.rootlogger = info, konsol #console log4j.appender.console = org.apache.log4j.consoleAppenderlog4j.applay.console.layout = org.apache.log4j.patternLayOutLog4j.appender.console.layout.apache. %M N
2. Analisis dan Kode Persyaratan
2.1 Analisis Persyaratan
Langkah pertama adalah membuat koneksi antara klien dan server, dan mendapatkan konten HTML di halaman web melalui URL.
Langkah kedua adalah mengurai konten HTML dan mendapatkan elemen yang diperlukan.
Langkah ketiga adalah mengeluarkan konten HTML ke dokumen teks lokal dan dapat secara langsung dianalisis melalui perangkat lunak analisis data lainnya.
Menurut analisis di atas, empat kelas ditetapkan, getHTML (digunakan untuk mendapatkan situs web html), parsehtml (digunakan untuk parse html), writeto (digunakan untuk mengeluarkan dokumen), dan utama (digunakan untuk mengontrol). Berikut ini adalah empat kelas. Untuk membuat kode secepat mungkin, semua pengecualian dilemparkan langsung dari metode tanpa tangkapan.
2.2 Kode
2.2.1GetHTML Kelas
Kelas ini berisi dua metode: geth (string url), urlcontrol (string baseUrl, int page), yang masing -masing digunakan untuk mendapatkan halaman web html dan url kontrol. Karena konten halaman web yang dirangkak kali ini hanya hasil pencarian dari jenis produk tertentu di JD.com, tidak perlu melintasi semua URL di halaman. Anda hanya perlu mengamati perubahan dalam URL saat memutar halaman dan memperkenalkan aturan. Hanya metode urlcontrol yang terpapar ke luar, dan properti log pribadi diatur di kelas: logger statis pribadi log = logger.getLogger (getHtml.class); digunakan untuk merekam log.
geth (string url), dapatkan konten html dari satu URL.
urlcontrol (string baseUrl, int halaman), mengatur loop dan mengakses data beberapa halaman. Dengan meninjau elemen, Anda dapat melihat bahwa perubahan di halaman halaman pencarian di JD.com sebenarnya merupakan perubahan dalam urutan aneh.
Jika Anda melihat perubahan dalam URL setelah mengklik, Anda akan menemukan bahwa perubahan aktual adalah nilai atribut halaman. Dengan menyambung, Anda dapat dengan mudah mendapatkan alamat halaman web berikutnya.
https://search.jd.com/search?keyword=%e6%89%8b%e6%9c%ba&enc=utf-8&qrst=1&rt=1&stop=1&s=2&cid2=653&cid3=65&page=3&s=4&cid=653&cid3=65&page=3&s=4&Cid=
https://search.jd.com/search?keyword=%e6%89%8b%e6%9c%ba&enc=utf-8&qrst=1&rt=1&stop=1&s=2&cid2=653&cid3=65&page=5&s=1&sok=.15&cid3=65&page=5&s=1&s=11&s=11&SKICK=
https://search.jd.com/search?keyword=%e6%89%8b%e6%9c%ba&enc=Utf-8&qrst=1&rt=1&stop=1&s=2&cid2=653&cid3=65&page=77&s=16 &kid=0.
Kode keseluruhan:
Impor java.io.ioException; impor org.apache.http.httpentity; impor org.apache.http.client.clientProtocolException; import org.apache.http.client.methods.closeHtpresponse; impor org.apache.apache.htpethods.htpeths. org.apache.http.impl.client.closeableHttpClient; import org.apache.http.impl.client.httpclients; import org.apache.http.util.entityutils; import org.apache.log4j.logger; kelas publik GEGHTITILS; Logger.getLogger (getHtml.class); String statis pribadi geth (string url) melempar klienProtocolException, ioException {// konsol output log, sehingga masing -masing URL yang diakses dapat melihat situasi akses pada log.info konsol ("menyelesaikan" + url); / * * Konten berikut adalah penggunaan umum httpClient untuk membuat koneksi * Gunakan httpClient untuk membuat klien * Gunakan metode GET untuk mengakses URL yang ditentukan * Dapatkan respons * */ closeableHttpClient Client = httpclients.createdefault (); Httpget get = httpget baru (url); CloseableHttpresponse response = client.execute (get); / * * Konten berikut adalah untuk mengubah konten html menjadi string * Dapatkan badan respons * Konversi badan respons ke format string, di sini metode tostring di entitas digunakan, dan format pengkodean diatur ke "UTF-8" * Tutup klien dan balas setelah penyelesaian * */ httpentity entitas = respon.getentity (); Konten string; if (entitas! = null) {content = entityutils.toString (entitas, "UTF-8"); client.close (); response.close (); mengembalikan konten; } lain return null; } public static void urlControl (string baseUrl, int halaman) melempar clientprotocolexception, ioException {// atur halaman saat ini int int count = 1; // Jika halaman saat ini kurang dari jumlah halaman yang ingin Anda rayak, jalankan sementara (hitung <halaman) {// URL sebenarnya diakses adalah nilai URL yang tidak berubah yang disambung dengan nilai URL perubahan string U = baseUrl + (2 * count - 1) + "& klik = 0"; // Di sini kami memanggil metode di kelas parsehtml untuk memproses halaman html di URL, dan kami akan memperkenalkan konten string kelas = parsehtml.parse (geth (u)). ToString (); // Di sini kami memanggil metode di kelas Writeto untuk menulis konten yang diuraikan secara lokal. Kemudian, kami akan memperkenalkan kelas Writeto.writeto (konten); Count ++; }}}2.2.2parsehtml kelas
Langkah ini membutuhkan elemen ulasan untuk menentukan tag yang perlu dirangkak, dan kemudian mendapatkannya melalui pemilih CSS di JSoup.
Impor org.jsoup.jsoup; impor org.jsoup.nodes.document; impor org.jsoup.nodes.element; impor org.jsoup.select.elements; public class parsehtml {public static StringBuilder Parse (string konten) {// menggunakan metode parseh dalam parse public ke public stringBuilder Parse (string content) {// menggunakan metode parseh dalam parse public to JsoPBUILDER PARSE (string Content) { Dokumen dokumen = jsoup.parse (konten); // Gunakan SELECT SELECT untuk mengambil elemen yang perlu Anda temukan. Misalnya, pilih pertama adalah konten yang atribut kelasnya sama dengan GL-Warp ClearFix dalam elemen tag UL ELE = DOC.SELECT ("UL [CLASS = GL-WARP ClearFix]"). SELECT ("Li [CLASS = GL-ITEM]"); // atur wadah untuk menginstal setiap atribut stringBuilder sb = stringBuilder baru (); // Gunakan pemilih sebelumnya untuk mendapatkan semua elemen yang memenuhi persyaratan di seluruh halaman, yaitu setiap telepon. Di bawah ini, Anda perlu melintasi setiap telepon untuk mendapatkan atributnya untuk (elemen e: ele) {// akuisisi setiap atribut di sini mengacu pada artikel yang merangkak konten di JD.com di internet. Seharusnya ada metode penulisan lain yang berbeda. String id = e.attr ("data-pid"); String mingzi = e. select ("Div [class = p-name p-name-tip-2]"). Pilih ("a"). Pilih ("em"). Text (); String jiage = e. select ("Div [class = p-price]"). Pilih ("kuat"). Pilih ("i"). Text (); String pinglun = e. select ("Div [class = p-commit]"). Pilih ("kuat"). Pilih ("a"). Text (); // Tambahkan atribut 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 kelas
Metode di kelas ini menulis konten yang diuraikan ke dalam file lokal. Hanya IO sederhana.
Impor java.io.bufferedwriter; import java.io.file; impor java.io.filewriter; import java.io.ioException; kelas publik writeto {// atur lokasi file penyimpanan file private static file f = baru file ("c: //jingdong.txt"); public static void writeto (konten string) melempar ioException {// Gunakan metode penulisan kontinu untuk menghindari menimpa konten yang ditulis sebelumnya bufferedwriter bw = baru buferedwriter (fileWriter baru (f, true)); BW.Append (konten); bw.flush (); bw.close (); }}2.2.4MainControl kelas
Program kontrol utama, tulis alamat dasar dan jumlah halaman yang akan diperoleh. Hubungi metode urlcontrol di kelas GetHTML untuk merangkak halaman.
impor java.io.ioException; impor org.apache.http.client.clientProtocolException; kelas publik MainControl {public static void main (string [] args) melempar klienProtocolException, iOException {// TODO Auto-Generated Metode Stub String Baseurle = "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 & halaman ="; int halaman = 5; // atur nomor halaman crawl getHtml.urlControl (baseUrl, halaman); }}3. Hasil merangkak
Merangkak 20 halaman.
3.1 Output Konsol
3.2 Output Dokumen
Anda dapat langsung membukanya dengan Excel, dan pembatas adalah karakter tab. Kolom adalah nomor produk, nama, harga, dan jumlah komentar masing -masing.
4. Ringkasan
Perayapan ini menggunakan HTTPClient dan JSoup, yang menunjukkan bahwa untuk kebutuhan sederhana, alat -alat ini masih sangat efisien. Bahkan, Anda juga dapat menulis semua kelas ke dalam satu kelas, dan gagasan menulis beberapa kelas lebih jelas.
Artikel di atas Java Crawler merayap halaman pencarian seluler httpclient+jsoup di jd.com adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.