1. المتطلبات
في الآونة الأخيرة ، قمت بإعادة تشكيل تطبيق الأخبار الخاص بي بناءً على تصميم المواد ، ومصدر البيانات يمثل مشكلة.
قام سلف بتحليل واجهات برمجة التطبيقات مثل Zhihu Daily و Phoenix News ، ويمكنه الحصول على بيانات News JSON بناءً على عنوان URL المقابل. من أجل ممارسة مهارات كتابة التعليمات البرمجية ، يخطط المؤلف لزحف صفحة الأخبار والحصول على بيانات بمفرده لبناء واجهة برمجة تطبيقات.
2. تأثير الصورة
الصورة أدناه هي صفحة الموقع الأصلي
حصل الزاحف على البيانات وعرضها على محطة الهاتف المحمول
3. أفكار الزاحف
لعملية تطبيق التطبيق ، يمكنك الرجوع إلى هذه المقالات. تشرح هذه المقالة بشكل رئيسي كيفية الزحف للبيانات.
عملية تسجيل تطبيقات التسجيل الكاملة على Android لإنشاء صور ديناميكية GIF: //www.vevb.com/article/78236.htm
تعلم تصميم مواد Android (RecyClerview بدلاً من ListView): //www.vevb.com/article/78232.htm
مشروع Android Project التقليد العملي لصفحة أخبار Netease (RecyClerview): //www.vevb.com/article/78230.htm
مقدمة إلى JSoup
JSoup هو محلل HTML مفتوح المصدر لـ Java ، والذي يمكنه تحليل عنوان URL معين ومحتوى HTML النص مباشرة.
لدى JSoup بشكل أساسي الوظائف التالية:
4. عملية الزحف
احصل على طلب للحصول على صفحة الويب html
كما يلي Tree Tree of the News Web Page HTML على النحو التالي:
يستخدم الرمز التالي الرمز للحصول على رمز مصدر HTML الذي تم إرجاعه بواسطة طلب GET بناءً على عنوان URL المحدد.
السلسلة الثابتة العامة DOGE (سلسلة urlstr) يلقي commonexception {url url ؛ سلسلة html = "" ؛ حاول {url = url جديد (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) ؛ } آخر {رمي commonexception جديد ("قيمة إرجاع خادم الأخبار ليست 200") ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ رمي commonexception جديد ("الحصول على طلب فشل") ؛ } إرجاع html ؛}inputStream في = connection.getInputStream () ؛ يعد تحويل دفق الإدخال الناتج إلى سلسلة متطلبًا شائعًا. نلخصها ونكتب طريقة أداة.
الفئة العامة StreamTool {Static Static intostringByTy (inputStream in) يلقي الاستثناء {bytearrayoutputstream outstr = جديد bytearrayoutputstream () ؛ Byte [] Buffer = New Byte [1024] ؛ int len = 0 ؛ stringBuilder content = new StringBuilder () ؛ بينما ((len = in.read (buffer))! = -1) {content.append (سلسلة جديدة (buffer ، 0 ، len ، "utf -8")) ؛ } outstr.close () ؛ إرجاع content.toString () ؛ }}5. تحليل HTML للحصول على اللقب
استخدم عنصر الرقابة في متصفح Google لمعرفة رمز HTML لعنوان الأخبار:
<div id = "article_title"> <h1> <a href = "http://see.xidian.edu.cn/html/news/7428.html"
نحتاج إلى العثور على جزء من id = "article_title" من HTML أعلاه ، واستخدام طريقة getElementByID (معرف السلسلة)
سلسلة htmlstr = httptool.doget (urlstr) ؛ // تحويل رمز مصدر html الذي تم الحصول عليه من documentDocument doc = jsoup.parse (htmlstr) ؛ element articlele = doc.getElementById ("article")6. الحصول على تاريخ الإصدار ومصدر المعلومات
اكتشف أيضًا رمز HTML لـ
<html> <head> </head> <body> <div id = "article_detail"> <span> 2015-05-28 </span> <span> المصدر: </span> <span> عدد المشاهدات: <script language = "javaScript" src = "http://see.xidian.edu.cn/index.php/news/clk/news/clik/dclk/dclk/news/clk/dclk/dcls/news/clod </script> 477 </span> </viv> </body> </html>
الفكرة تشبه ما سبق. استخدم طريقة getElementById (معرف السلسلة) لمعرفة أن ID = "article_detail" عنصر ، ثم استخدم getElementsBytag للحصول على الجزء الممتد. نظرًا لوجود 3 <span> ... </span> في المجموع ، يتم إرجاع العناصر بدلاً من العنصر.
// article_detail يتضمن 2016-01-15 المصدر: المشاهدات: 177ELEMENT DELICEELE = articleleelementbybyid ("article_detail") ؛ تفاصيل العناصر = التفاصيل.7. عدد أوقات التحليل
إذا قمت بطباعة التفاصيل أعلاه
عدد المشاهدات:
لا وجهات نظر؟ لماذا؟
نظرًا لأن عدد المشاهدات يتم تقديمه بواسطة JavaScript ، فقد يقوم JSOUP بزاحف JSOUP فقط باستخراج محتوى HTML ولا يمكنه الحصول على بيانات يتم تقديمها ديناميكيًا.
هناك حلان
إذا قمت بزيارة urlhttp: //see.xidian.edu.cn/index.php/news/click/id/7428 ، ستحصل على النتائج التالية
document.write (478)
هذا 478 هو عدد المشاهدات التي نحتاجها. نقدم طلب الحصول على عنوان URL أعلاه ، والحصول على السلسلة التي تم إرجاعها ، ونستخدم العادية للعثور على الرقم فيه.
// عند زيارة صفحة الأخبار هذه ، سيكون عدد المشاهدات +1 ، وعدد المرات هو السلسلة التي يتم تقديمها بواسطة JS JSSTR = httptool.doget (count_base_url + currentpage) ؛ int readtimes = integer.parseint (jsstr.replaceall ("// d+" ، "")) ؛ // أو استخدم الطريقة العادية التالية // string readtimesstr = jsstr.replaceall ("[^0-9]" ، "") ؛8. تحليل محتوى الأخبار
في الأصل ، كان شكل من أشكال الحصول على محتوى الأخبار في نص عادي ، ولكن في وقت لاحق تبين أن جانب Android يمكن أن يعرض أيضًا تنسيق CSS ، لذلك تم الاحتفاظ بالمحتوى بتنسيق HTML لاحقًا.
element contentEle = articleleelementByById ("article_content") ؛ // أخبار سلسلة محتوى الجسم contentstr = contentele.toString () ؛ // إذا تم استخدام طريقة text () ، فسيتم فقد علامة html من محتوى هيئة الأخبار //9. تحليل عنوان URL الصورة
لاحظ أن هناك العديد من الصور الكبيرة والصغيرة على صفحة ويب. من أجل الحصول على المحتوى في نص الأخبار فقط ، من الأفضل أولاً تحديد عناصر محتوى الأخبار ، ثم استخدام GetElementsBytag ("IMG") لتصفية الصور.
element contentele = articlele.getElementById ("article_content") ؛ // أخبار سلسلة محتوى الجسم contentstr = contentele.toString () ؛ // إذا تم استخدام طريقة text () ، فستفقد علامة html من محتوى جسم الأخبار = contentLe ؛ contentele.getElementsByTag ("img") ؛ string [] imageUrls = new string [images.size ()]10. كيان الأخبار جافابان
ما سبق هو الحصول على العنوان ، تاريخ الإصدار ، عدد القراءات ، محتوى الأخبار ، إلخ. من الأخبار. نحتاج بطبيعة الحال إلى إنشاء جافابان وتغليف المحتوى الذي تم الحصول عليه في فئة الكيان.
الطبقة العامة articleitem {private int index ؛ سلسلة خاصة [] ImageUrls ؛ عنوان السلسلة الخاصة ؛ سلسلة خاصة publishDate ؛ مصدر السلسلة الخاص ؛ أوقات القراءة الخاصة سلسلة سلسلة خاصة publicitiTem (int index ، string [] ImageUrls ، trup string ، string publishDate ، String source ، int readtimes ، string body) {this.index = index ؛ this.imageUrls = imageUrls ؛ this.title = title ؛ this.publishDate = publishDate ؛ this.Source = Source ؛ this.ReadTimes = times ؛ this.body = الجسم ؛ } Override public string toString () {return "articleItem [index =" + index + "،/n imageUrls =" + arrays.toString (imageUrls) + "،/n ،/n publishDate =" + publishDate + "،/n source =" source + "،/n readtimes =" }}امتحان
articleitem getNewSitem (int currentpage) static static static articietem (int currentpage) يلقي commonexception {// وفقًا لرقم اللاحقة ، قم بربط سلسلة url urlstr = article_base_url + currentpage + ".html" ؛ سلسلة htmlstr = httptool.doget (urlstr) ؛ مستند المستند = jsoup.parse (htmlstr) ؛ element articlele = doc.getElementById ("article") ؛ // title element titleele = articleele.getElementById ("article_title") ؛ String titlestr = titleele.text () ؛ // article_detail يتضمن 2016-01-15 المصدر: المشاهدات: 177 العنصر التفصيلية = articleleelementbybyid ("article_detail") ؛ تفاصيل العناصر = التفاصيل. // relect time string datestr = details.get (0) .Text () ؛ // News Source String sourcestr = details.get (1) .Text () ؛ // قم بزيارة صفحة الأخبار هذه وسيكون عدد المشاهدات +1 ، وهو عدد المرات التي تقدمها JS. JSSTR = httptool.doget (count_base_url + currentpage) ؛ int readtimes = integer.parseint (jsstr.replaceall ("// d+" ، "")) ؛ // أو استخدم الطريقة العادية التالية // string readtimesstr = jsstr.replaceall ("[^0-9]" ، "") ؛ element contentEle = articleele.getElementById ("article_content") ؛ // News Body Content String ContentStr = ContentEle.ToString () ؛ // إذا تم استخدام طريقة Text () ، فسيتم فقد علامة HTML لمحتوى جسم الأخبار // من أجل عرض HTML مع WebView على Android ، استخدم ToString () // String ContentStr = contentele.text () ؛ عناصر الصور = contentele.getElementsBytag ("img") ؛ String [] ImageUrls = new string [picture.size ()] ؛ لـ (int i = 0 ؛ i <imageurls.length ؛ i ++) {imageUrls [i] = images.get (i) .Attr ("src") ؛ } إرجاع articleitem جديد (CurrentPage ، ImageUrls ، titlestr ، datestr ، sourcestr ، readtimes ، contentStr) ؛} رمي Main static void (سلسلة [] args)معلومات الإخراج
articleItem [index = 7928 ، ImageUrls = [/uploads/image/20160114/20160114225911_34428.png] ، title = The School of Engineering active strlead level = 200 ، body = <sivel vertys ver the Winter Campus "نشاط التعليم ، publishdate = 2016-01-14 ، المصدر = id = "article_content"> <p style = "text-indent: 2em ؛" align = "refify"> <strong> <span style = "font-size: 16px ؛ line-height: 1.5 ؛"> شبكة الأخبار xidian </span> </strong> <span style = "font-size: 16px ؛ line-height: 1.5 ؛ دان </span> </strong> <span style = "font-size: 16px ؛ Line-Height: 1.5 ؛"> ...)
تشرح هذه المقالة كيفية تنفيذ زاحف الويب JSoup. إذا كانت المقالة مفيدة لك ، فأعطاني إبهامًا.