۱۳۸۹/۰۴/۰۶

خزنده وب (Web Crawler)

سلام :)

مطلب امروز ضمن آشنا کردن شما با Web crawler و معماری آن، سورس خزنده وب ساده ای به زبان جاوا را ارائه می دهد.

خزنده وب (Web Crawler) چیست؟



خزنده وب که بیشتر ما آن را با عنوان Web crawler می شناسیم به برنامه کامپیوتری اطلاق می شود که World Wide Web (وب جهان گستر) را به صورت مرتب و سلسله مراتبی بازدید کرده و اطلاعات آن را مورد پردازش قرار می دهد. از Web crawler ها با عناوین دیگری مانند ants, automatic indexers, bots, Web spiders و Web robots نیز یاد می شود.

کاربرد ها



۱- موتورهای جستجو

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

۲- مدیریت فنی وب سایت

مدیریت فنی وب سایت بخشی از کار این خزنده هاست که شامل یافتن لینک های شکسته (Broken Link) ، اعتبار سنجی (Validation) کدهای HTML، فایل های CSS و ... می باشد.

۳- جمع آوری اطلاعات خاص

کاربرد دیگر خزنده های  وب جمع آوری اطلاعات خاصی مانند آدرس های ایمیل است. معمولا هدف از اینکار ارسال هرزنامه (spam) می باشد. برای جلوگیری از ثبت آدرس ایمیل توسط این خزنده ها، می توانید آدرس ایمیل خود را به صورت saeidREMOVEME AT جیمیل و یا موارد مشابه دیگر بنویسید.

نحوه کار



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

معماری خزنده وب



خزنده وب بخش اصلی و مرکزی هر موتور جستجویی را تشکیل می دهد. به همین جهت الگوریتم و معماری آن ها به شدت مخفی نگه داشته می شود. با این وجود معماری سطح بالای (High-level architecture) آن به شکل زیر می باشد:



عادی کردن آدرس (URL normalization)



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

مراحل فرایند عادی کردن آدرس



• تبدیل آدرس به حروف کوچک
HTTP://www.Example.com/ → http://www.example.com/

• افزودن / به آدرس در صورت نیاز
http://www.example.com → http://www.example.com/

• حذف آدرس ایندکس دایرکتوری
http://www.example.com/default.asp → http://www.example.com/
http://www.example.com/a/index.html → http://www.example.com/a/

• بزرگ کردن حروف encode شده یا همان حروف بعد از علامت ٪
http://www.example.com/a%c2%b1b → http://www.example.com/a%C2%B1b

• حذف بخش زاید
http://www.example.com/bar.html#section1 → http://www.example.com/bar.html

• حذف و تبدیل آی پی به دامنه
http://208.77.188.166/ → http://www.example.com/

• اعمال محدودیت بر روی پروتکل ها مانند تبدیل https به http
https://www.example.com/ → http://www.example.com/

• حذف پورت پیش فرض (پورت ۸۰ به صورت پیش فرض برای http می باشد)
http://www.example.com:80/bar.html → http://www.example.com/bar.html

• حذف / های تکراری
http://www.example.com:80/bar.html → http://www.example.com/bar.html

• حذف . ها (dot-segments)
http://www.example.com/../a/b/../c/./d.html → http://www.example.com/a/c/d.html

• حذف www از اول دامنه
http://www.example.com/ → http://example.com/

• مرتب کردن متغییرهای صفحه فعال
http://www.example.com/display?lang=en&article=fred
 → http://www.example.com/display?article=fred〈=en

• حذف متغییرهای اختیاری از query-string
http://www.example.com/display?id=123&fakefoo=fakebar
 → http://www.example.com/display?id=123

• حذف متغییرهای پیش فرض از query-string
http://www.example.com/display?id=&sort=ascending
 → http://www.example.com/display

• حذف علامت ? هنگامی که query-string خالی باشد
http://www.example.com/display? → http://www.example.com/display

• استانداردکردن encoding کاراکترها
http://www.example.com/display?category=foo/bar+baz
 → http://www.example.com/display?category=foo%2Fbar%20baz

شناسایی خزنده وب



خزنده های وب معمولا با استفاده از فیلد User-agent داده HTTP request خود را معرفی می کنند. شما با استفاده از لاگ وب سرور خود می توانید لیست این Web crawler های را مشاهده کنید. فیلد User agent ممکن است شامل URL ای باشد که به سایت سازنده خزنده اشاره می کند.

Spambot ها و سایر خزنده های مخرب معمولا فیلد User agent را به صورت غیر واقعی با اطلاعاتی مانند نام یک مرورگر پر می کنند.

فایل robots.txt



این فایل برای دادن اطلاعات اولیه در زمینه وب سایت مورد پردازش به خزنده های وب استفاده می گردد. به عنوان مثال با این فایل می توانید دسترسی خزنده های وب به بعضی زیر شاخه ها محدود کنید. دستورات زیر در فایل robots.txt از دسترسی خزنده ها به دایرکتوری /tmp/ جلوگیری می کند:
User-agent: *
Disallow: /tmp/

* فایل robots.txt یک استاندارد می باشد. به همین جهت خزنده وب (معمولا خزنده مخرب) می تواند آن را نادیده بگیرد.

معروف ترین خزنده های وب غیر آزاد



در زیر لیست معروف ترین خزنده های وب را مشاهده می کنید:

معروف ترین خزنده های متن باز



سورس خزنده وب به زبان جاوا



سایت sun در سال ۱۹۹۸ مقاله ای آموزشی با عنوان "Writing a Web Crawler in the Java Programming Language" را ارائه داد. در آن مقاله ضمن توضیح دادن Web crawler سورس برنامه آن نیز در اختیار عموم قرار گرفت. البته این برنامه خیلی ساده و در مرحله ابتدایی می باشد. شما باید با توجه به نیازهای خود آن را تغییر داده و مورد استفاده قرار دهید.

• دانلود سورس خزنده وب به زبان جاوا (لینک کمکی)

کاربرد خزنده وب برای من



برای سایت هایی که از نرم افزار های آماده مثل وردپرس استفاده نشده است و نیاز به موتور جستجو احساس می شد، با استفاده از خزنده ای که نوشتم، اطلاعات کل وب سایت مورد نظر را در داخل یک جدول در پایگاه داده ذخیره کردم. سپس توابعی برای جستجو بهینه بر روی داده ها در MySQL نوشتم و با استفاده از آن ها بخش جستجوی وب سایت مورد نظر را راه اندازی کردم. نمونه این جستجو ها در سایت های زیر فعال می باشد:

• داتک تله کام

• ارتباطات فرادانش سامان

منابع



موفق باشید ;)

۳۱ نظر:

  1. بابت مقاله مفیدتون تشکر می کنم اما چند جایش برای من سوال پیش آمد و همینطور یک بخشیش برایم گنگ است خواهش می کنم اگر سیستم شما توانایی باخبر سازی نویسنده نظر را دارد پاسخ را در قالب یک مطلب منتشر سازید.

    لطفا بیشتر در باره این بخش "برای جلوگیری از ثبت آدرس ایمیل توسط این خزنده ها، می توانید آدرس ایمیل خود را به صورت saeidREMOVEME AT جیمیل و یا موارد مشابه دیگر بنویسید." توضیح دهید

    --

    در کدام وبسایت معتبر از "بزرگ کردن حروف encode شده یا همان حروف بعد از علامت ٪" صحبت شده است؟ و اگر خودتان پاسخی در این باره می دهید لطفا چرایش را نیز ذکر کنید

    --

    از نظر بهینه سازی همانطور که گوگل در بخش ابزار وبمستر خودش توضیح داده، آدرس وبسایت به چند نوع مختلف نوشته می شود که بهینه ترین آن با www در اول آدرس می باشد. پس چرا شما می گویید "حذف www از اول دامنه" ؟


    سپاس گذارم،
    ع. اسکندرپور

    پاسخحذف
  2. دم شما گرم. استفاده کردم. اما کاش اسکریپت php (یا زبانی دیگر) که بروز باشه هم برای این کار می‌گذاشتید :)

    پاسخحذف
  3. اسکریپتی که گذاشتم با اینکه قدیمیه ولی برای شروع خیلی خوبه. استاندارد هایی رو که یک خزنده باید داشته باشه، داره.

    پاسخحذف
  4. بسیار استفاده
    خیلی ممنونم
    موفق باشین

    پاسخحذف
  5. سلام

    در مورد نحو نوشتن آدرس ایمیل ها باید بگم که وقتی شما اون رو خیلی ساده به صورت mail@example.com می نویسید، خوانایی اون برای روبات ها و خزنده هایی که آدرس های ایمیل رو برای ارسال اسپم جمع آوری می کنند خیلی راحته.
    برای جلوگیری از ثبت آدرس ایمیلتون باید اون رو طوری بنویسید که برای انسان ها که هوشمند هستند خوانایی داشته باشه ولی برای خزنده نه. مثلا اون رو به صورت عکس در بیارید (البته خزنده هایی هستند که از عکس ها هم آدرس های ایمیل رو حمع آوری می کنند) و یا همونطور که بالا گفتم به صورت saeidREMOVEME AT جیمیل بنویسید. وقتی کسی بخواد به این آدرس ایمیل ارسال کنه بخش REMOVEME رو از آدرس حذف می کنه، AT رو به صورت @ می نویسه و جیمیل رو به صورت gmail.com می نویسه. در نهایت آدرس به صورت saeid@gmail.com در میاد.


    به آدرس http://en.wikipedia.org/wiki/URL_normalization مراجعه کنید. در بخش References منابع و استانداردهای مربوط به normalization رو نوشته. مهمترین استاندارد هم RFC شماره ۳۹۸۶ به آدرس http://tools.ietf.org/html/rfc3986 هست. در این RFC تمامی موارد normalization و دلایل اون ها بیان شدن.


    من با ابزار webmaster گوگل آشنایی دارم. اونجا حرفی در مورد اینکه اگه www در اول آدرس باشه بهتره. فقط گفته که یا همه لینک هاتون به آدرس بدون www باشه و یا همه لینک هاتون رو به آدرس با www بدید.
    اطلاعات بیشتر -> http://www.google.com/support/webmasters/bin/answer.py?answer=44231

    با احترام

    پاسخحذف
  6. سلام
    ببخشید میدونم که این سوالم اصلا ربطی به این مطلب نداره.من تو وردپرس تازه کارم.
    چطور میتونم مثل شما این rss رو تو یک فولدر به اسم feed بذارم...؟
    من از وردپرس ۲.۹.۲ استفاده میکنم.
    ممنونم

    پاسخحذف
  7. سلام

    بابت وردپرسی شدن بهتون خوش آمد می گم.
    من rss رو داخل فولدر ننداختم بلکه فقط permalink رو عوض کردم. لینک های زیر می تونن راهنماییتون بکنن:

    http://weblog.corelist.net/archives/1383/10/03/permalink-structure
    http://codex.wordpress.org/Using_Permalinks

    امیدوارم مشکلتون حل بشه.
    موفق باشید

    پاسخحذف
  8. سلام آقای زبر دست، مطلب بسیار پر باری بود دست شما درد نکنه ولی من یک سوای برام پیش اومده جرا اکثر این وب بوت ها به زبان جاوا نوشته می شه؟ با سپاس

    پاسخحذف
  9. با سلام

    من دلیلش رو نمیدونم ولی شاید به خاطر قدرت جاوا پر پروسس های خیلی زیاد باشه.

    پاسخحذف
  10. درود سعید جان به بخش لینکه اضافه شدی ا شما هم در صورت تمایل میتونی منو با نام Freenet اضافه کنی !

    اینترنت ازاد یه پروژه شخصی برای کمک به ایجاد جریان ازاد اطلاعات تو همه سیستم عاملهاست هدف ازادیه مثل فلسفه گنو

    پاسخحذف
  11. با سلام .اولا خیلی بابت مقاله تشکر می کنم.من یه پروژه در مورد web crawler دارم اگه ممکنه یه کتاب یا یه مقاله ای کامل در این مورد به من معرفی کنید .خیلی ممنون میشم.

    پاسخحذف
  12. مطلب خیلی عالی بود. ممنون و موفق باشید

    پاسخحذف
  13. سلام
    یک سایت هست که اطلاعات رو از دیتابیس میخونه به زبان ASP میخونه و نشون میده. من الان دارم صفحه به صفحه اطلاعات رو کپی پیست میکنم.
    اگر بخوام به روشی اتوماتیک این کار رو بکنم چیکار باید انجام بدم.

    ممنون

    پاسخحذف
  14. سلام،

    این مطلب رو ببینید:
    http://zebardast.ir/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D8%AA%D9%85%D8%A7%D9%85-%D9%88-%DA%A9%D9%85%D8%A7%D9%84-%DB%8C%DA%A9-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A8%D8%A7-%DB%8C%DA%A9-%D8%AE%D8%B7-%D8%AF%D8%B3%D8%AA%D9%88/

    پاسخحذف
  15. [...] ۶:۵۵ ب.ظسلام،— Apache Luceneحدود یک سال و نیم قبل در مطلبی به معرفی خزنده‌های وب (Web crawlers) و آموزش راه اندازی یک خزنده وب ساده به زبان جاوا [...]

    پاسخحذف
  16. سلام

    میشه یه الگوریتمی از طراحی خزنده به من بدین؟ می خوام با سی شارپ بنویسم میشه کمکم کنید؟
    ممنون

    پاسخحذف
  17. سلام،

    من الگوریتم آماده‌ای برای این کار ندارم. پیشنهاد می‌کنم توو گوگل جستجو کنید. من جستجو کردم، تعداد زیادی الگوریتم برای وب کراولر وجود داشت:
    http://www.google.com/search?q=web+crawler+algorithm

    پاسخحذف
  18. شما در مورد رتبه بندی آنلاین اطلاعاتی دارد ؟ ممنون می شم بفرستید

    پاسخحذف
  19. سلام
    خیلی ممنون از مطلب مفیدتون. بسیار استفاده کردم.
    ممنـــــــون :)

    پاسخحذف
  20. سلام من می خواستم نرم افزارهای کامل موتورجستجو رو پیدا کنم کسی هست که بتونه کمکم کنه این نرم افزار crawler که توسایتتون گذاشتید همون نرام افزار اصلی که تو موتورهای جستجو استفاده می شه؟ با تشکر

    پاسخحذف
  21. سلام،
    این مطلب فقط برای شروع در زمینه خزنده ها وب هست. نرم افزاری که در این مطلب معرفی شده، فقط برای شروع بوده و برای انجام پروژه های تجاری توصیه نمی‌شود.

    پاسخحذف
  22. سلام خیلی ممنون از مطالب مفیدتون واقعا استفاده شد.منبعی که الگوریتم های کراول رو معرفی کنه نمی شناسید؟؟ممنون میشم راهنمایی کنید.

    پاسخحذف
  23. سلام،
    متاسفانه من فهرستی از الگوریتم‌های Crawling رو پیدا نکردم. البته به صورت متفرقه مواردی بود ولی نیاز به دسته‌بندی شده و مرتب‌سازی دارن.

    پاسخحذف
  24. با سلام
    مطلب بسیار خوبی رو منتشر کردید یک سئوال ا ز خدمتتون داشتم ممنون میشم راهنماییم کنید
    سئوال من اینه با استفاده از خزنده ها میشه مطالب یک سایتی مثل یک نشریه رو ایندکس روی سرور خودمون کرد ؟ کاری که گوگل میکنه.
    اگر امکانش هست باید از ابتدا این خزنده نوشته بشه یا با خزندهای متن باز این کار شدنیه ؟
    البته من برنامه نویسی بلد نیستم و دلیل سئوالم اینکه اگر شدنی بود و قصد داشتم کار را به کسی محول کنم اطلاعاتی راجع بهش داشته باشم
    با تشکر

    پاسخحذف
  25. سلام،
    بله، امکانش وجود داره. به عنوان نمونه میتونین از Apache Lucene استفاده کنید:
    http://zebardast.ir/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%88-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87%E2%80%8C%D8%B3%D8%A7%D8%B2%DB%8C-apache-lucene/

    پاسخحذف