Hari ini, perusahaan memiliki kebutuhan untuk melakukan beberapa pengikisan data setelah bertanya di situs web yang ditentukan, jadi butuh waktu untuk menulis demo untuk penggunaan demonstrasi.
Idenya sangat sederhana: itu adalah untuk mengakses tautan melalui Java, lalu dapatkan string HTML, dan kemudian parsing data yang diperlukan seperti tautan. Secara teknis, JSoup nyaman untuk penguraian halaman. Tentu saja, JSoup sangat nyaman dan sederhana. Anda dapat tahu cara menggunakannya hanya dengan satu baris kode:
Dokumen Doc = jsoup.connect ("http://www.oschina.net/") .data ("kueri", "java") // permintaan parameter.useragent ("i 'm jsoup") // atur user-agent .cookie ("auth", "ToKen") // set. // Gunakan metode pos untuk mengakses URL Seluruh proses implementasi dijelaskan di bawah ini:
1. Menganalisis halaman yang perlu diuraikan:
Situs web: http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicIndexQuery
halaman:
Pertama lakukan pertanyaan pada halaman ini: Amati URL yang diminta, parameter, metode, dll.
Di sini kami menggunakan alat pengembang bawaan (kunci pintas F12), dan berikut ini adalah hasil dari kueri:
Kita dapat melihat URL, metode, dan parameter. Setelah mengetahui bagaimana atau kueri URL, saya akan memulai kode di bawah ini. Untuk menggunakan kembali dan memperluas, saya telah mendefinisikan beberapa kelas:
1. Aturan.java digunakan untuk menentukan URL kueri, metode, params, dll.
paket com.zhy.spider.rule; / ** * aturan kelas * * @author zhy * */ aturan kelas publik {/ ** * tautan */ private string url; / ** * Koleksi Parameter */ Private String [] params; / *** nilai yang sesuai dengan nilai parameter*/ private string []; / ** * Untuk html yang dikembalikan, silakan atur ketik pertama */ private string resultTagname; / ** * Kelas / ID / Pilihan * Atur Jenis HasilTagname, default ke ID * / private int type = ID; / ** *Get / Posting *Jenis permintaan, default dapatkan * / private int requestMoethod = get; Int statis akhir publik get = 0; Posting int statis final publik = 1; Kelas int statis final publik = 0; ID int statis final publik = 1; Seleksi int statis final publik = 2; aturan publik () {} aturan publik (string url, string [] params, string [] nilai, string resultTagname, tipe int, int requestMoethod) {super (); this.url = url; this.params = params; this.values = nilai; this.ResultTagname = resultTagname; this.type = type; this.requestmoethod = requestMoethod; } public String getUrl () {return url; } public void setUrl (string url) {this.url = url; } public string [] getParams () {return params; } public void setParams (string [] params) {this.params = params; } public string [] getValues () {return value; } public void setValues (string [] values) {this.values = values; } public String getResultTagname () {return resultTagname; } public void setResultTagname (String resultTagname) {this.resultTagname = resultTagname; } public int getType () {type return; } public void setType (int tipe) {this.type = type; } public int getRequestMoethod () {return requestMoethod; } public void setRequestMoethod (int requestMoethod) {this.requestMoethod = requestMoethod; }}Izinkan saya menempatkan secara singkat: kelas aturan ini mendefinisikan semua informasi yang kami butuhkan selama proses kueri, yang memfasilitasi ekstensi dan kode kembali kami. Tidak mungkin bagi kita untuk menulis satu set kode untuk setiap situs web yang perlu dirangkak.
2. Objek data yang diperlukan, saat ini hanya membutuhkan tautan, linktypedata.java
paket com.zhy.spider.bean; kelas publik linkTypedata {private int id; / *** Alamat Tautan*/ Private String LinkHref; / *** Judul Tautan*/ Private String LinkText; / *** ringkasan*/ ringkasan string privat; / *** konten*/ konten string pribadi; publik int getId () {return id; } public void setid (int id) {this.id = id; } public string getLinkHref () {return linkHref; } public void setLinkHref (string linkHref) {this.linkhref = linkhref; } public String getLinkText () {return linkText; } public void setLinkText (string linkText) {this.linkText = linkText; } public string getSummary () {review ringkasan; } public void setSummary (ringkasan string) {this.summary = ringkasan; } public String getContent () {return content; } public void setContent (string content) {this.content = content; }} 3. Kelas Kueri Inti: ExtractService.java
paket com.zhy.spider.core; impor java.io.ioException; impor java.util.arraylist; impor java.util.list; impor java.util.map; impor javax.swing.plaf.textUi; impor org.jsoup.connection; impor org.jsoup.jsoup; impor org.jsoup.nodes.document; impor org.jsoup.nodes.element; impor org.jsoup.select.elements; impor com.zhy.spider.bean.linktypedata; impor com.zhy.spider.rule.rule; impor com.zhy.spider.rule.ruleException; impor com.zhy.spider.util.textutil; / ** * * @author zhy * */ kelas publik ExtractService {/ ** * @param aturan * @return */ Daftar statis publik <linktypedata> ekstrak (aturan aturan) {// lakukan verifikasi yang diperlukan dari aturan validaterule (aturan); Daftar <LinkTypeData> data = ArrayList baru <LinkTypeData> (); Data linktypedata = null; coba { / ** * aturan parse * / string url = aturan.getUrl (); String [] params = aturan.getParams (); String [] values = aturan.getValues (); String resultTagname = aturan.getResultTagname (); int type = aturan.getType (); int requestType = aturan.getRequestMoethod (); Koneksi conn = jsoup.connect (url); // atur parameter kueri if (params! = Null) {for (int i = 0; i <params.length; i ++) {conn.data (params [i], nilai [i]); }} // Setel type permintaan dokumen dokumen = null; switch (requestType) {case aturan.get: doc = conn.timeout (100000) .get (); merusak; aturan kasus.post: doc = conn.timeout (1000000) .post (); merusak; } // Proses Hasil Pengembalian Data = Elemen Baru (); switch (type) {case aturan.class: result = doc.geteLementsbyclass (resultTagname); merusak; aturan kasus.id: elemen hasil = doc.geteLementById (resultTagname); results.add (hasil); merusak; aturan kasus.Selection: result = doc.select (resultTagname); merusak; default: // Ketika resultTagname kosong, tag tubuh sudah usang if (textutil.isempty (resultTagname)) {result = doc.geteLementsbytag ("body"); }} untuk (hasil elemen: hasil) {elemen tautan = result.geteLementsbytag ("a"); untuk (elemen tautan: tautan) {// filter yang diperlukan string linkhref = link.attr ("href"); String linkText = link.text (); data = LinkTypeData baru (); data.setLinkHref (LinkHref); data.setLinkText (LinkText); data.add (data); }}} catch (ioException e) {E.PrintStackTrace (); } return datas; } / *** Lakukan verifikasi yang diperlukan pada parameter yang dilewatkan* / private static void validaterule (aturan aturan) {string url = aturan.getUrl (); if (textutil.isempty (url)) {lempar ruleException baru ("URL tidak bisa kosong!"); } if (! url.startswith ("http: //")) {lempar ruleeexception baru ("url salah!"); } if (aturan.getParams ()! = null && aturan.getValues ()! = null) {if (aturan.getParams (). length! = aturan.getValues (). Panjang) {lempar ruleeException baru ("Nilai kunci parameter tidak cocok dengan jumlah tombol dan nilai!"); }}}}} 4. Kelas Pengecualian Digunakan: Ruleeexception.java
paket com.zhy.spider.rule; RuleException kelas publik memperluas runimeException {public ruleeException () {super (); // TODO Stub Konstruktor yang Dihasilkan Otomatis} Public RuleException (Pesan String, Penyebab yang Dapat Dibuat) {Super (pesan, penyebab); // TODO Stub Konstruktor yang Dihasilkan Otomatis} Public RuleException (String Message) {Super (pesan); // TODO Stub Konstruktor yang Dihasilkan Otomatis} Public RuleException (Throwable Cause) {super (penyebab); // Todo Stub Konstruktor yang Dihasilkan Otomatis}} 5. Akhirnya, ini adalah tes: Dua situs web digunakan untuk pengujian di sini, dan aturan yang berbeda digunakan. Silakan lihat kode untuk detailnya.
paket com.zhy.spider.test; impor java.util.list; impor com.zhy.spider.bean.linktypedata; impor com.zhy.spider.core.extractservice; impor com.zhy.spider.rule.rule; tes kelas publik { @org.junit.test public void getDatasbyclass () {aturan aturan = aturan baru ("http://www1.sxcredit.gov.cn/public/infocomquery.do?method=publicIndexQuery", string baru [] {] {] {] {{] {] {] {] {] {] {] " String [] {"xingwang", "}," cont_right ", aturan.class, aturan.post); daftar <linktypedata> ekstrak = extractservice.extract (aturan); printf (ekstrak);} @org.junit.test public void getDataSbyCssQuery () {aturan = aturan = aturan = aturan = ne baru = aturan = ne baru = aturan = aturan =) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) { Aturan ("http://www.11315.com/search", string baru [] {"name"}, string baru [] {"Xingwang"}, "div.g-mn div.con-model", aturan, aturan); printf (LinkTypedata> data) {for (LinkTypedata Data: data) {System.out.println (data.getLinkText (); Hasil output:
Shenzhen Netxing Technology Co., Ltd. http://14603257.11315.com *************************************** Jingzhou Xingwang Highway Materials Co., Ltd. http://05155980.11315.com *************************** Xi'an Quanxing internet cafe# *********************** ************************************* Shaanxi Tongxing Network Information Co., Ltd Cabang Xi'an# ************************************
Akhirnya, gunakan berita Baidu untuk menguji kode kita: itu berarti kode kita universal.
/** * Use Baidu News, only set the url and keywords and return types*/ @org.junit.Test public void getDatasByCssQueryUserBaidu() { Rule rule = new Rule("http://news.baidu.com/ns", new String[] { "word" }, new String[] { "Alipay" }, null, -1, Aturan.get); Daftar <LinkTypeData> Extracts = ExtractService.Extract (aturan); printf (ekstrak); } Kami hanya mengatur tautan, kata kunci, dan jenis permintaan, dan tidak mengatur kondisi filter tertentu.
Hasil: Dapat dipastikan bahwa ada data sampah tertentu, tetapi data yang diperlukan harus dirangkak. Kita dapat menetapkan aturan. Bagian, serta batasan lebih lanjut pada kondisi penyaringan.
Sort by time/ns?word=Alipay&ie=utf-8&bs=Alipay&sr=0&cl=2&rn=20&tn=news&ct=0&clk=sortbytime ********************************* x javascript:void(0) ********************************************* Alipay will jointly build a security Dana dengan banyak pihak untuk berinvestasi 40 juta dalam batch pertama http://finance.ifeng.com/a/20140409/12081871_0.shtml ********************************* 7 sama news/ns?word=%E6%94%AF%E4%BB%98%E5%AE%9D+cont:2465146414%7C697779368%7C3832159921&same=7&cl=1&tn=news&rn=30&fm=sd *************************************** Baidu snapshot http://cache.baidu.com/c?m=9D78D513D9D437AB4F9E91697D1CC0161D4381132BA7D3020CD0870FD33A541 B0120A1AC26510D19879E20345DFE1E4BEA876D26605F75A09BBFD91782A6C1352F8A2432721A844A0FD019ADC 1452FC423875D9DAD0EE7CDB168D5F18C & P = C96EC64AD48B2DEF49BD9B780B64 & NEWP = C4769A4790934EA95A28E 281c4092695912c10e3dd796 & user = baidu & fm = sc & kueri =%d6%a7%b8%b6%b1%a6 & qid = a400f36.0007a6c5 & p1 = 1 ********************************************** OpenSsl Kerentanan melibatkan banyak situs web Alipay mengatakan belum ada kebocoran data http://tech.ifeng.com/internet/detail_2014_04/09/355590390.shtml ******************************************* 26 same news/ns?word=%E6%94%AF%E4%BB%98%E5%AE%9D+cont:3869124100&same=26&cl=1&tn=news&rn=30&fm=sd ****************************************** Baidu snapshot http://cache.baidu.com/c?m=9F65CB4A8C8507ED4FECE7631050803743438014678387492AC3933FC239045C1C3AA5EC 677E4742CE932B2152F4174BED843670340537B0EFCA8E57DFB08F29288F2C367117845615A71BB8CB31649B66CF04FDEA44 A7ECFF25E5AAC5A0DA0DA4323C044757E97F1FB4D7017DD1CF4 & P = 8B2A970D95DF11A05AA4C32013 & NEWP = 9E39C64AD4DD40FA40 BD9B7C5253D8304503C52251D5CE042ACC & USER = BAIDU & FM = SC & QUERY =%D6%A7%B8%B6%B1%A6 & QID = A400F360007A6C5 & P1 = 2 *************************************** Yahoo Japan starts supporting Alipay payments from June http://www.techweb.com.cn/ucweb/news/id/2025843 ************************************************
Jika ada kekurangan, Anda dapat menunjukkannya; Jika Anda pikir itu berguna bagi Anda, cobalah ~~ haha
Unduh kode sumbernya, klik di sini.
Di atas adalah contoh dari java crawler informasi merangkak. Kami akan terus menambahkan informasi yang relevan di masa mendatang. Terima kasih atas dukungan Anda untuk situs ini!