برنامه نویسی

مطالعه موردی: خزنده وب – انجمن DEV

این مطالعه موردی برنامه‌ای را توسعه می‌دهد که با دنبال کردن لینک‌ها، وب را طی می‌کند. وب جهانی که به اختصار WWW، W3 یا وب نامیده می شود، سیستمی از اسناد فرامتن به هم پیوسته در اینترنت است. با یک مرورگر وب، می‌توانید یک سند را مشاهده کنید و برای مشاهده سایر اسناد، پیوندها را دنبال کنید. در این مطالعه موردی، ما برنامه ای را توسعه خواهیم داد که به طور خودکار اسناد موجود در وب را با دنبال کردن لینک ها طی می کند. این نوع برنامه معمولاً به عنوان a شناخته می شود خزنده وب. برای سادگی، برنامه ما برای لینکی که با آن شروع می شود دنبال می شود http://. شکل زیر نمونه ای از پیمایش وب را نشان می دهد. ما از یک صفحه وب شروع می کنیم که شامل سه URL با نام است URL1، URL2، و URL3. ذیل URL1 به صفحه ای منتهی می شود که شامل سه URL نامگذاری شده است URL11، URL12، و URL13. ذیل URL2 به صفحه ای منتهی می شود که حاوی دو URL نامگذاری شده است URL21 و URL22. ذیل URL3 به صفحه ای منتهی می شود که شامل چهار URL نامگذاری شده است URL31، URL32، و URL33، و URL34. به دنبال پیوندهای جدید به پیمایش وب ادامه دهید. همانطور که می بینید، این روند ممکن است برای همیشه ادامه یابد، اما زمانی که 100 صفحه را طی کردیم از برنامه خارج می شویم.

توضیحات تصویر

این برنامه URL ها را برای عبور از وب دنبال می کند. برای اطمینان از اینکه هر URL فقط یک بار عبور می کند، برنامه دو لیست از URL ها را حفظ می کند. یک لیست URL های معلق برای عبور را ذخیره می کند و دیگری URL هایی را که قبلاً عبور کرده اند ذخیره می کند. الگوریتم این برنامه را می توان به صورت زیر توصیف کرد:

Add the starting URL to a list named listOfPendingURLs;
while listOfPendingURLs is not empty and size of listOfTraversedURLs
<= 100 {
Remove a URL from listOfPendingURLs;
if this URL is not in listOfTraversedURLs {
Add it to listOfTraversedURLs;
Display this URL;
Read the page from this URL and for each URL contained in the page {
Add it to listOfPendingURLs if it is not in listOfTraversedURLs;
}
}
}

برنامه زیر برنامه ای را می دهد که این الگوریتم را پیاده سازی می کند.

package demo;
import java.util.Scanner;
import java.util.ArrayList;

public class WebCrawler {

    public static void main(String[] args) {
        java.util.Scanner input = new java.util.Scanner(System.in);
        System.out.print("Enter a URL: ");
        String url = input.nextLine();
        crawler(url); // Traverse the Web from a starting url
    }

    public static void crawler(String startingURL) {
        ArrayList listOfPendingURLs = new ArrayList<>();
        ArrayList listOfTraversedURLs = new ArrayList<>();

        listOfPendingURLs.add(startingURL);
        while(!listOfPendingURLs.isEmpty() && listOfTraversedURLs.size() <= 100) {
            String urlString = listOfPendingURLs.remove(0);
            if(!listOfTraversedURLs.contains(urlString)) {
                listOfTraversedURLs.add(urlString);
                System.out.println("Craw " + urlString);

                for(String s: getSubURLs(urlString)) {
                    if(!listOfTraversedURLs.contains(s))
                        listOfPendingURLs.add(s);
                }
            }
        }
    }

    public static ArrayList getSubURLs(String urlString){
        ArrayList list = new ArrayList<>();

        try {
            java.net.URI uri = new java.net.URI(urlString);
            java.net.URL url = uri.toURL();
            Scanner input = new Scanner(url.openStream());
            int current = 0;
            while(input.hasNext()) {
                String line = input.nextLine();
                current = line.indexOf("http:", current);
                while(current > 0) {
                    int endIndex = line.indexOf("\"", current);
                    if(endIndex > 0) { // Ensure that a correct URL is found
                        list.add(line.substring(current, endIndex));
                        current = line.indexOf("http:", endIndex);
                    }
                    else
                        current = -1;
                }
            }
        }
        catch(Exception ex) {
            System.out.println("Error: " + ex.getMessage());
        }

        return list;
    }

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برنامه از کاربر می خواهد که یک URL شروع را وارد کند (خطوط 9-10) و آن را فراخوانی می کند خزنده (url) روش پیمایش وب (خط 11).

را خزنده (url) متد URL شروع را به آن اضافه می کند listOfPendingURLs (خط 18) و به طور مکرر هر URL را پردازش می کند listOfPendingURLs در یک حلقه while (خطوط 19-30). اولین URL در لیست (خط 20) را حذف می کند و اگر URL پردازش نشده باشد (خطوط 21-29) آن را پردازش می کند. برای پردازش هر URL، برنامه ابتدا URL را به آن اضافه می کند listOfTraversedURLs (خط 22). این لیست تمام URL های پردازش شده را ذخیره می کند. را getSubURLs(url) متد لیستی از URL ها را در صفحه وب برای URL مشخص شده برمی گرداند (خط 25). این برنامه از یک حلقه foreach برای اضافه کردن هر URL در صفحه استفاده می کند listOfPendingURLs اگر داخل نباشد listOfTraversedURLs (خطوط 25-28).

را getSubURLs(url) متد هر خط را از صفحه وب (خط 42) می خواند و آدرس های موجود در خط (خط 43) را جستجو می کند. توجه داشته باشید که یک URL صحیح نمی تواند شامل کاراکترهای شکست خط باشد. بنابراین کافی است جستجوی URL را در یک خط از متن در یک صفحه وب محدود کنید. برای سادگی، فرض می کنیم که URL با علامت نقل قول به پایان می رسد (خط 45). این روش یک URL دریافت می کند و آن را به یک لیست اضافه می کند (خط 47). یک خط ممکن است حاوی چندین URL باشد. این روش به جستجوی URL بعدی (خط 48) ادامه می دهد. اگر هیچ URL در خط پیدا نشد، جاری تنظیم شده است -1 (خط 51). URL های موجود در صفحه در قالب یک لیست بازگردانده می شوند (خط 59).

این برنامه زمانی پایان می یابد که تعداد URL های پیمایش شده به 100 برسد (خط 19). این یک برنامه ساده برای عبور از وب است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا