لقد كتبت العديد من زحف Python في صفحة واحدة من قبل ، وأشعر أن بيثون لا يزال مفيدًا للغاية. أستخدم هنا Java لتلخيص زاحف متعدد الصفحات ، وزحف بشكل متكرر جميع روابط صفحة البذور ، وحفظها جميعًا تحت مسار TMP.
1. مقدمة
يتطلب تنفيذ هذا الزاحف الدعم من هيكلين للبيانات ، قائمة الانتظار غير الزمنية (Priminitequeue: يمكن حساب أهمية عنوان URL) والجدول المزيت (Hashset: يمكن أن تعرف بسرعة ما إذا كان عنوان URL موجودًا) ؛ يتم استخدام قائمة الانتظار لتنفيذ الزحف الأول للعرض ، ويتم استخدام الجدول المزروع لتسجيل عنوان URL المزروع ، ولم يعد يزحف بشكل متكرر ، وتجنب الخواتم. تتضمن مجموعات الأدوات المطلوبة من قبل Java Crawlers httpclient و htmlparser1.5 ، ويمكنك عرض تنزيل الإصدار المحدد في ريبو Maven.
1. موقع الهدف: sina http://www.sina.com.cn/
2. لقطة الشاشة للنتائج:
دعنا نتحدث عن تنفيذ الزواحف. سيتم تحميل الرمز المصدر إلى GitHub لاحقًا. يمكن للأصدقاء الذين يحتاجون إليها ترك رسالة:
2. البرمجة الزاحف
1. قم بإنشاء عنوان URL لصفحة البذور
MyCrawler Crawler = new MyCrawler () ؛
Crawler.Crawling (سلسلة جديدة [] {"http://www.sina.com.cn/"}) ؛
2. تهيئة الجدول غير المورق باعتباره عنوان URL أعلاه البذرة
linkqueue.addunvisitedurl (البذور [i]) ؛
3. الجزء الأكثر أهمية للتنفيذ المنطقي: قم بإخراج عنوان URL الذي لم تتم زيارته في قائمة الانتظار ، وقم بتنزيله ، ثم أضف الجدول الزائر ، وحوض عناوين URL الأخرى على صفحة عنوان URL المتغير ، وأضف قائمة الانتظار غير المنفذة إلى قائمة الانتظار غير المرغوب فيها ؛ تكرار حتى تصبح قائمة الانتظار فارغة ، لذلك لا تزال شبكة URL كبيرة جدًا. لاحظ أن تنزيل الصفحة ودقة الصفحة هنا تتطلب تطبيق مجموعة أدوات Java ، ويتم شرح استخدام مجموعة الأدوات بالتفصيل أدناه.
بينما (! linkqueue.unvisitedurlsempty () && linkqueue.getVisitedUrlnum () <= 1000) {// يخرج عنوان url الرئيسي من سلسلة الانتظار Visiturl = (String) linkqueue.unvisitedurldequeue () ؛ إذا (visiturl == null) تابع ؛ DownloadFile DownloadFile Downloader = new DownloadFile () ؛ // قم بتنزيل صفحة الويب Downloader.DownloadFile (Visiturl) ؛ // يتم وضع عنوان URL في عنوان URL الذي تمت زيارته. . . }}4. قم بتنزيل مجموعة أدوات لصفحة HTML التالية
السلسلة العامة downloadFile (url url) {string filepath = null ؛ / * 1. إنشاء كائن httpclinet وضبط المعلمات */ httpclient httpclient = new httpclient () ؛ // قم بتعيين مهلة اتصال HTTP لـ 5S httpclient.gethttpconnectionManager (). getParams (). setConnectionTimeout (5000) ؛ / * 2. قم بإنشاء كائن getMethod وقم بتعيين المعلمات */ getMethod getMethod = new getMethod (url) ؛ // قم بتعيين مهلة طلب الحصول على 5S getMethod.getParams (). . /* 3. تنفيذ http get request*/ try {int statusCode = httpclient.executemethod (getMethod) ؛ // حدد رمز الحالة للوصول إذا (statusCode! = httpstatus.sc_ok) {system.err.println ("فشل الطريقة:" + getMethod.getStatusline ()) ؛ filepath = فارغة ؛ }/* 4. Process HTTP Response Content*/byte [] ResponseBody = getMethod.getResponseBody () ؛ // read as a byte marray // قم بإنشاء اسم الملف عند حفظه وفقًا لمادة الويب url filepath = "temp //" + getFilenameByUrl (url ، getMethod.getResPonseheader ( Savetolocal (ResponseBody ، FilePath) ؛ } catch (httpexception e) {// حدث استثناء فادح ، والذي قد يكون أن البروتوكول غير صحيح أو هناك مشكلة في نظام المحتوى الذي تم إرجاعه. E.PrintStackTrace () ؛ } catch (ioException e) {// حدث استثناء على شبكة E.PrintStackTrace () ؛ } أخيرًا {// refer the connection getMethod.releaseconnection () ؛ } إرجاع filepath ؛ }5. مجموعة أدوات تحليل صفحة HTML:
مجموعة ثابتة عامة <string> ounfraclinks (url url سلسلة ، مرشح LinkFilter) {set <String> links = new hashset <string> () ؛ حاول {parser parser = new parser (url) ؛ parser.setencoding ("GB2312") ؛ // تصفية مرشح علامة <fray> لاستخراج الرابط الذي يمثله سمة SRC في إطار العلامة nodefilter framefilter = new NodeFilter () {public boolean قبول (عقدة node) {if (node.gettext (). startswith ("الإطار src =")) {return true ؛ } آخر {return false ؛ }}}} ؛ // orfilter لتعيين علامات التصفية <a> ، و <rame> العلامات orfilter linkfilter = new orfilter (nodeClassFilter (linktag.class) ، FrameFilter) ؛ // احصل على جميع العلامات المصفاة nodelist قائمة = parser.extractallnodesthatmatch (LinkFilter) ؛ لـ (int i = 0 ؛ i <list.size () ؛ i ++) {node tag = list.elementat (i) ؛ if (tag extureof linktag) // <a> tag {linktag link = (linktag) tag ؛ سلسلة linkurl = link.getLink () ؛ // url if (filter.accept (linkurl)) links.add (linkurl) ؛ } else // <rame> tag {// استخراج الرابط إلى سمة SRC في الإطار ، مثل <frame src = "test.html"/> string frame = tag.getText () ؛ int start = frame.indexof ("src =") ؛ الإطار = frame.substring (ابدأ) ؛ int end = frame.indexof ("") ؛ if (end == -1) end = frame.indexof (">") ؛ String FrameUrl = frame.substring (5 ، End - 1) ؛ if (filter.accept (frameurl)) links.add (frameurl) ؛ }}} catch (parserexception e) {E.PrintStackTrace () ؛ } روابط الإرجاع ؛ }6. يتم حفظ الصفحة غير المرغوب فيها باستخدام PriorityQueue مع قوائم الانتظار المفضلة ، بشكل أساسي لتطبيق على الخوارزميات مثل Pagerank. بعض عناوين URL أكثر ولاء. يتم تنفيذ الجدول الذي تمت زيارته باستخدام Hashset ، وإيلاء الاهتمام للعثور على ما إذا كان موجودًا بسرعة ؛
Class Public Class Linkqueue {// Collection URL تم الوصول إليه بشكل خاص مجموعة ثابتة = new hashset () ؛ // تم الوصول إلى مجموعة url التي تم الوصول إليها في قائمة انتظار ثابتة ثابتة unvisitedUrl = new PriorityQueue () ؛ // الحصول على قائمة انتظار url Queue static static getunvisitedurl () {return unvisitedurl ؛ } // أضف إلى قائمة انتظار URL التي تمت زيارتها باطلة ثابتة ثابتة addvisitedurl (url url string) {visitedurl.add (url) ؛ }. }. } // تأكد من الوصول إلى كل عنوان URL مرة واحدة فقط مرة واحدة ثابتة باطلة ثابتة عامة addunvisitedurl (سلسلة url) {if (url! = null &&! url.trim (). equals ("") &&! } // احصل على عدد عناوين URL التي تم الوصول إليها بشكل عام ثابت int getVisitedUrlnum () {return visitedurl.size () ؛ }. }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.