1. Persyaratan
Baru -baru ini, saya memperbaiki aplikasi berita saya sendiri berdasarkan desain material, dan sumber data adalah masalah.
Seorang pendahulu telah menganalisis API seperti Zhihu Daily dan Phoenix News, dan dapat memperoleh data JSON berita berdasarkan URL yang sesuai. Untuk menggunakan keterampilan menulis kode, penulis berencana untuk merangkak halaman berita dan mendapatkan data sendiri untuk membangun API.
2. Gambar efek
Gambar di bawah ini adalah halaman situs web asli
Crawler memperoleh data dan menampilkannya ke terminal seluler aplikasi
3. Ide Crawler
Untuk proses implementasi APP, Anda dapat merujuk ke artikel ini. Artikel ini terutama menjelaskan cara merangkak data.
Seluruh proses perekaman operasi aplikasi di Android untuk menghasilkan gambar dinamis GIF: //www.vevb.com/article/78236.htm
Pelajari Desain Bahan Android (RecyclerView alih -alih ListView): //www.vevb.com/article/78232.htm
Proyek Android Praktis Imitasi Halaman Berita NetEase (RecyclerView): //www.vevb.com/article/78230.htm
Pengantar JSoup
Jsoup adalah parser html open source untuk Java, yang dapat secara langsung menguraikan alamat URL tertentu dan konten teks HTML.
JSoup terutama memiliki fungsi berikut:
4. Proses merangkak
Dapatkan permintaan untuk mendapatkan halaman web html
Pohon dom dari halaman web berita html adalah sebagai berikut:
Kode berikut menggunakan kode untuk mendapatkan kode sumber HTML yang dikembalikan oleh permintaan GET berdasarkan URL yang ditentukan.
Public Static String doGet (String URLST) melempar Commonexception {url url; String html = ""; coba {url = url baru (urlstr); HttpurlConnection connection = (httpurlConnection) url.openconnection (); connection.setRequestMethod ("get"); Connection.setConnectTimeout (5000); Connection.setDoInput (true); Connection.setDoOutput (true); if (connection.getResponsecode () == 200) {inputStream in = connection.getInputStream (); html = streamTool.intostringbybyte (IN); } else {throw new commonexception ("NEWS Server Nilai pengembalian bukan 200"); }} catch (Exception e) {e.printstacktrace (); Lempar Commonexception baru ("Dapatkan permintaan gagal"); } return html;}InputStream in = connection.getInputStream (); Mengubah aliran input yang dihasilkan menjadi string adalah persyaratan umum. Kami mengabstraksikannya dan menulis metode alat.
kelas publik streamTool {public static string intostringbybyte (inputStream in) melempar pengecualian {bytearrayoutputStream outstr = new bytearrayoutputStream (); byte [] buffer = byte baru [1024]; int len = 0; StringBuilder Content = New StringBuilder (); while ((len = in.read (buffer))! = -1) {content.append (string baru (buffer, 0, len, "utf -8"))); } outstr.close (); return content.toString (); }}5. Parsing html untuk mendapatkan judul
Gunakan elemen sensor browser Google untuk mengetahui kode HTML untuk judul berita:
<Div id = "artikel_title"> <h1> <a href = "http://see.xidian.edu.cn/html/news/7428.html"> Pemberitahuan tentang kuliah tentang "apresiasi karya musik klasik dan acetesik humanistik" </a> </h1>
Kita perlu menemukan bagian dari id = "artikel_title" dari html di atas, menggunakan metode getElementById (string id)
String htmlstr = httptool.doget (urlstr); // konversi kode sumber html yang diperoleh dari halaman web menjadi dokumen document doc = jsoup.parse (htmlStr); elemen artikelele = doc.geteLementById ("artikel"); // judul elemen titleele = artikelele.getelementById ("artikel"); // judul titleele = artikelele.getelementById ("artikel"); // judul titleele = Artikelele.getelement = titleele.text ();6. Dapatkan Tanggal Rilis dan Sumber Informasi
Cari tahu juga kode HTML untuk
<html> <head> </head> <body> <v id = "artikel_detail"> <span> 2015-05-28 </span> <span> Sumber: </span> <span> Jumlah tampilan: <script = "javaScript" src = "http://see.xidian.edu.cn.cn/index/prc/prc/see.see.xidian.edu.cn.cn.prick =" http:/see.xidian.edu.cn.cn.index/prc = "http:/see.xidian.edu.cn.cn.index </script> 477 </span> </div> </body> </html>
Idenya mirip dengan di atas. Gunakan metode getElementById (string id) untuk mengetahui bahwa id = "artikel_detail" adalah elemen, dan kemudian gunakan GetElementsByTag untuk mendapatkan bagian rentang. Karena ada 3 <span> ... </span> Total, elemen dikembalikan, bukan elemen.
// Artikel_Detail termasuk 2016-01-15 Sumber: Tampilan: 177Element detailele = Artikelele.getElementById ("artikel_detail"); elemen detail = detailele.getElementsbytag ("span"); // rilis waktu string dateRestr = details.get (0) .text (); // span sourcing sourcestr = detail.7. Jumlah waktu analisis
Jika Anda mencetak detail di atas. Get (2) .text (), Anda hanya akan mendapatkan
Jumlah tampilan:
Tidak ada pandangan? Mengapa?
Karena jumlah tampilan yang diberikan oleh JavaScript, jsoup crawler hanya dapat mengekstrak konten HTML dan tidak dapat memperoleh data yang diberikan secara dinamis.
Ada dua solusi
Jika Anda mengunjungi urlhttp di atas: //see.xidian.edu.cn/index.php/news/click/id/7428, Anda akan mendapatkan hasil berikut
Document.write (478)
478 ini adalah jumlah tampilan yang kita butuhkan. Kami membuat permintaan mendapatkan URL di atas, mendapatkan string yang dikembalikan, dan menggunakan reguler untuk menemukan nomor di dalamnya.
// Saat mengunjungi halaman berita ini, jumlah tampilan akan +1, dan berapa kali string yang diberikan oleh JS JSSTR = httptool.doget (count_base_url + currentpage); int readtimes = integer.parseint (jsstr.replaceall ("// d+", "")); // atau gunakan metode reguler berikut // string readtimesstr = jsstr.replaceall ("[^0-9]", "");8. Menganalisis konten berita
Awalnya, itu adalah bentuk mendapatkan konten berita dalam teks biasa, tetapi kemudian ditemukan bahwa sisi Android juga dapat menampilkan format CSS, sehingga konten dipertahankan dalam format HTML nanti.
Element contentEle = articleEle.getElementById("article_content");// News body content String contentStr = contentEle.toString();// If the text() method is used, the html tag of the news body content will be lost// In order to display html with WebView on Android, use toString()// String contentStr = contentEle.text();9. Analisis URL gambar
Perhatikan bahwa ada banyak gambar besar dan kecil di halaman web. Untuk hanya mendapatkan konten dalam teks berita, yang terbaik adalah menemukan elemen konten berita terlebih dahulu, dan kemudian menggunakan GetElementsByTag ("IMG") untuk menyaring gambar.
Elemen contentele = artikelele.getElementById ("artikel_content"); // berita body konten konten string = contentele.tostring (); // jika metode teks () digunakan, tag html dari konten bodi berita () untuk menampilkan html dengan html dengan webview on android, menggunakan tephing elite () () ficsions () () ficsex () () contents/ contents/ contents = html dengan webview on android, use toostring () ficstring () () ficsies () () contents.t/ contents/ contents/ contents/ contents/ contents/ contents/ contents/ contents = html dengan webview on android, use toString () ficstring () ficsies () () contents. contentele.geteLementsbytag ("img"); string [] imageUrls = string baru [gambar.size ()]; for (int i = 0; i <imageurls.length; i ++) {imageUrls [i] = image.get (i) .attr ("src");}10. Entitas Berita Javabean
Di atas diperoleh judul, tanggal rilis, jumlah bacaan, konten berita, dll. Dari berita. Kami secara alami perlu membangun Javabean dan merangkum konten yang diperoleh ke dalam kelas entitas.
Public Class ArticleItem {private int index; Private String [] ImageUrls; judul string pribadi; Private String PublishDate; sumber string pribadi; waktu ready int private; tubuh string pribadi; Public ArticterItem (int index, String [] ImageUrls, Judul String, String PublishDate, String Source, Int Readtimes, String Body) {this.index = index; this.imageUrls = ImageUrls; this.title = judul; this.publishDate = publishDate; this.source = sumber; this.readtimes = readTimes; this.body = body; } @Override Public String ToString () {return "ArticleItem [index =" + index + ",/n ImageUrls =" + arrays.tostring (ImageUrls) + ",/n,/n publishDate =" + publishDate + ",/n Sumber =" + Sumber + ",/n Readimes =" + READTIMES + ",/N SUMBER =" + SUMBER + ",/N READTIMES =" + READTIMES + ",/N SUMBER =" + SUMBER + ",/N READTIMES =" + READTIMES + ",/N SOURDE =" + SOURDE + ",/N READTIMES =" + READTIMES + ",/N SUMBER =" + "SUMBER +" }}tes
Public Static ArticleItem getNewSitem (int currentpage) melempar Commonexception {// Menurut nomor akhiran, splice berita URL URL URLSTR = artikel_base_Url + currentPage + ".html"; String htmlstr = httptool.doget (urlstr); Dokumen doc = jsoup.parse (htmlstr); Elemen artikelele = doc.geteLementById ("artikel"); // judul elemen titleele = artikelele.geteLementById ("artikel_title"); String titleStr = titleele.text (); // artikel_detail termasuk 2016-01-15 Sumber: Tampilan: 177 Elemen Detailele = Artikelele.GetElementById ("Artikel_Detail"); Detail elemen = detailele.geteLementsbytag ("span"); // rilis waktu string dateStr = details.get (0) .text (); // sumber berita string sourcestr = details.get (1) .text (); // Kunjungi halaman berita ini dan jumlah pandangan akan +1, yang merupakan berapa kali diberikan oleh JS. jsstr = httptool.doget (count_base_url + currentpage); int readtimes = integer.parseint (jsstr.replaceall ("// d+", "")); // atau gunakan metode reguler berikut // string readtimesstr = jsstr.replaceall ("[^0-9]", ""); Elemen contentele = artikelele.getElementById ("artikel_content"); // Konten Badan Berita ContentSTR = Contentele.ToString (); // Jika metode teks () digunakan, tag HTML dari konten badan berita akan hilang // untuk menampilkan HTML dengan WebView di Android, gunakan ToString () // String ContentSTR = Contentele.Text (); Elemen gambar = contentele.getElementsbytag ("img"); String [] imageUrls = string baru [gambar.size ()]; untuk (int i = 0; i <imageurls.length; i ++) {imageUrls [i] = image.get (i) .attr ("src"); } kembalikan artikel baru (currentpage, imageUrls, titleStr, dateStr, sourcestr, readtimes, contentStr);} public static void main (string [] args) melempar Commonexception {System.out.println (getNewSitem (7928)));Informasi keluaran
ArticleItem [index=7928, imageUrls=[/uploads/image/20160114/20160114225911_34428.png], title=The School of Electrical Engineering launched the "Let the Flower of Integrity Bloom all over the Winter Campus" education activity, publishDate=2016-01-14, source=Source: Movie News Network, readTimes=200, body=<div id = "artikel_content"> <p style = "Text-Indent: 2em;" align="justify"> <strong><span style="font-size:16px;line-height:1.5;">XiDian News Network</span></strong><span style="font-size:16px;line-height:1.5;"> (Comradesperson</span><strong><span style="font-size:16px;line-height:1.5;"> Ding Tong Wang Zhu Dan </span> </strong> <span style = "font-size: 16px; line-height: 1.5;"> ...)
Artikel ini menjelaskan cara mengimplementasikan jsoup web crawler. Jika artikel ini bermanfaat bagi Anda, maka beri saya jempol ke atas.