چگونه در زبان پایتون یک 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 https://sokanacademy.com

از این پس، این کراولر تمامی اطلاعات وب‌سایت سکان آکادمی را برای شما دانلود خواهد کرد (البته بهتر است به جای آدرس سکان آکادمی، از آدرس دیگری استفاده کنید چرا که هرگونه بازنشر اطلاعات سکان آکادمی برخلاف شرایط استفاده از سکان آکادمی است.)