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

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

Ebhose.io نام شرکتی است که اطلاعات زنده ی هزاران سایت، فروم، اخبار و وبلاگ را به طور مستقیم در اختیار کاربران می گذارد. چندی پیش، این سایت مقاله ای را منتشر کرد که در آن، نحوه ی ساخت یک وب کراولر کوچک و چندکاره در زبان برنامه نویسی پایتون را شرح داده است. این وب کراولر قادر است تا تمامی اطلاعات یک سایت را برای شما، به اصطلاح «کراول» کند. طراح این کراولر، 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

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

How to Build a Basic Web Crawler in Python

0







  • شیوا در تاریخ: 1394/11/23

    سلام . من این کد رو نوشتم اما ایراد میگیره. از نسخه ایی که دارم. نسخه من 2.7.11 است. متشکر میشم اگر راهنمایی ام کنید.

  • مینا در تاریخ: 1395/02/14

    سلام متشکرم عالی بود ممنون از سایت خوبتون
    من اتفاقی وارد این سایت شدم. من عبارت زیر رو جستجو کردم که به سایت شما برخورد کردم
    " آموزش کسب و کار اینترنتی "
    اگه اجازه بدین میخوام لینک سایتتون رو در وبلاگم ثبت کنم
    http://evm2024.blogfa.com

    موفق باشید

    ادمین سایت در تاریخ: 1395/02/14

    با سلام خدمت شما کاربر گرامی
    بلامانع است

    با تشکر
    ارادتمند
    تیم سکان آکادمی

  • javid در تاریخ: 1395/06/09

    سلام

    من نتونستم اینو اجرا کنم و با خطای زیر مواجه شدم

    import sys, thread, Queue, re, urllib, urlparse, time, os, sys
    ImportError: No module named 'thread'

    امکانش هست کمک کنید؟

    javid در تاریخ: 1395/06/09

    البته اینو هم بگم با نسخه 3.5.2 چند جا خطا داشت که اونارو حل کردم ولی باز اجرا نشد و خطای IndexError: list index out of range داد
    بعد همین کد رو اومدم با نسخه 2.7 اجراش کردم و همین خطای IndexError: list index out of range
    رو نشون داد

از طریق این فرم، می توانید بدون ثبت نام نظر دهید و یا اگر قبلا ثبت نام کرده اید، با ورود ناحیه ی کاربری می توانید علاوه بر ثبت نظر، به مدیریت نظرات خود نیز بپردازید.
(فیلد اجباری)
(فیلد اجباری)
(فیلد اجباری)
(فیلد اجباری)