چگونه در زبان پایتون یک Web Crawler ساده بنویسیم؟

چگونه در زبان پایتون یک Web Crawler ساده بنویسیم؟

در این مقاله می خواهیم روش پخت ساخت یک وب کراولر در زبان برنامه نویسی پایتون را توضیح دهیم. وب کراولر (Web Crawler) به برنامه ای گفته می شود که به صورت از پیش تعیین شده، خودکار و قابل تنظیم، بر روی شبکه جهانی وب جستجو می کند و بر روی مطالب جستجو شده، اعمال خاصی را انجام می دهد. موتورهای جستجو همانند گوگل و یاهو همواره از وب کراولرهایی استفاده می کنند تا سایت های جهان را جستجو کرده و اطلاعات خود را به روز نگاه دارند. با سکان آکادمی همراه باشید تا روش ساخت یک کراولر ساده در زبان پایتون را مرور کنیم.

این وب کراولر قادر است تا تمامی اطلاعات یک سایت را برای شما، به اصطلاح «کراول» کند. طراح این کراولر، Ran Geva، دربارهٔ برنامهٔ خود می‌گوید:

می گویند که کد من «کثیف»، «نا مطئمن» و «بد» است. من می گویم که این کراولر کار می کند و هزاران صفحه را از چند صفحه، در عرض چند ساعت دانلود می کند. شما برای استفاده از این کراولر، نیاز به هیچگونه تنظیمات و یا لینک برنامه های دیگر ندارید. تنها کافیست که آدرس سایتی را به این کراولر داده و سپس با خیال راحت در صندلی خود نشسته و تماشا کنید. البته شاید بهتر باشد به سراغ کارهای دیگرتان بروید چون شاید چند ساعت و یا چند روز، بسته به میزان اطلاعاتی که می خواهید، کار این کراولر طول بکشد.

این کراولر پایتون بسیار ساده و پر سرعت است. این کراولر توانایی شناسایی و حذف لینک های یکسان (Duplicate) را نیز دارد و می تواند هم سورس و هم لینک را ذخیره کند. بدین ترتیب می توان لینک های خروجی و ورودی را محاسبه کرده و رتبه ی سایت را تخمین زد. این کراولر کاملاً رایگان بوده و کد آن نیز به شرح زیر است:

import sys, thread, Queue, re, urllib, urlparse, time, os, sys
dupcheck = set()  
q = Queue.Queue(100) 
q.put(sys.argv[1]) 
def queueURLs(html, origLink): 
    for url in re.findall('''<a[^>]+href=["'](.[^"']+)["']''', html, re.I): 
        link = url.split("#", 1)[0] if url.startswith("http") else '{uri.scheme}://{uri.netloc}'.format(uri=urlparse.urlparse(origLink)) + url.split("#", 1)[0] 
        if link in dupcheck:
            continue
        dupcheck.add(link)
        if len(dupcheck) > 99999: 
            dupcheck.clear()
        q.put(link) 
def getHTML(link): 
    try:
        html = urllib.urlopen(link).read() 
        open(str(time.time()) + ".html", "w").write("" % link  + "\n" + html) 
        queueURLs(html, link) 
    except (KeyboardInterrupt, SystemExit): 
        raise
    except Exception:
        pass
while True:
    thread.start_new_thread( getHTML, (q.get(),)) 
    time.sleep(0.5)

برای استفاده از آن، می بایست کد بالا را با نامی دلخواه مثلاً «myPythonCrawler.py» ذخیره کرده و سپس آدرس وب سایتی را به عنوان نقطه ی شروع برای آن تعیین کنید:

python myPythonCrawler.py http://sokanacademy.com

حال به سراغ کارهای دیگرتان بروید؛ این کراولر تمامی اطلاعات وب سایت سکان آکادمی را برای شما دانلود خواهد کرد. البته بهتر است به جای آدرس سکان آکادمی، از آدرس دیگری استفاده کنید چرا که هرگونه باز نشر اطلاعات سکان آکادمی برخلاف شرایط استفاده از سکان آکادمی است.

منبع