مهدی مومنی
مهدی مومنی
خواندن ۱ دقیقه·۳ سال پیش

خزنده وب چیست و چگونه با php یک خزنده بسازیم .



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

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

هدف از خزیدن می تواند هرچیزی باشید ، پیدا کردن تکنولوژی های وبسایت پیدا کردن یک موضوع خاص مثل قیمت ارز ، پیداکردن آسیب پذیری یا هرچیز دیگری که فکرش را بکنید .


برای پرسیدن سوال های php خود و حل مشکلاتتان به گروه انجمن php ایران بپیوندید .

https://t.me/IR_PHP_Developers_Community

کانال انجمن :

https://t.me/IR_PHP_Dev_Community_channel

مزایای استفاده از web crawler چیست ؟

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

  • این پروسه در پشت زمینه اتفاق می افتد، و بیشتر اوقات بر روی عملکرد وبسایت تاثیر ندارد.
  • بازرسی و ویرایش امکان پذیر است.
  • جست و جوی سریع در صفحات .


چگونه یک خزنده وب با php بسازیم ؟




ابتدا باید یک فرم برای وارد کردن url بسازیم .

<form method=&quotPOST&quot> <input type=&quottext&quot name=&quoturl&quot value=&quothttp://&quot> <input type=&quotsubmit&quot name=&quotsubmit&quot> </form>


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

<?php /* |||==> 1) Send Request To Target. |||==> 2) Get the result. And Save Tt In To (crwal-result.html) File. |||==> 3) Stored Data In a File. |||==> 4) Reading File Values. |||==> 5) Searching In Result For Our Words. */ class CRAWL { public function Crawling($url) { // Send Request To target ------------------------------ $data = file_get_contents($url); // Get the result -------------------------------------- $data = strip_tags($data, &quot<a>&quot); $d = preg_split(&quot/<\/a>/&quot, $data); $links = []; // All Links will be Append To This List. foreach ($d as $k => $u) { if (strpos($u, &quot<a href=&quot) !== FALSE) { $u = preg_replace(&quot/.*<a\s+href=\&quot/sm&quot, &quot&quot, $u); $u = preg_replace(&quot/\&quot.*/&quot, &quot&quot, $u); array_push($links, $u); }} // Stored Data In a File ------------------------------- $file_allpage = fopen(&quotwebsite.html&quot, 'a'); // All data is stored in this file. $homepage = file_get_contents($url); $homepage_replace = str_replace(&quotgoogle&quot, '', $homepage); fwrite($file_allpage, $homepage_replace); foreach ($links as $link) { if (strstr($link, '*.php') or strstr($link, '*.asp') or strstr($link, '*.js') or strstr($link, '*.go') or strstr($link, '*.py') or strstr($link, '*.jquery')) { $data = file_get_contents($url . $link); $data_replace = str_replace(&quotgoogle&quot, '', $data); fwrite($file_allpage, $data_replace); } else { continue; }} // Reading File Values ---------------------------------- $file_read = fopen(&quotwebsite.html&quot, &quotr&quot); $value = fread($file_read, filesize(&quotwebsite.html&quot)); return $value;} public function Search($string, $word) { if (strpos($string, $word) != false) { $result = &quottrue" } else { $result = &quotfalse" } return $result; }}


تا اینجا ما فقط یک کلاس ساختیم و داخلش دو متد قرار دادیم .


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

تابع Crawling یک آرگومان دریافت می کند که آن همان لینک یا url سایت است ، در مرحله اول با متغیر data یک رکوعست به سمت وبسایت ارسال میکنیم .

$data = file_get_contents($url);

تابع بالا میاد اول یک رکوعست میفرسته به اون صفحه و بعد تمام کدهای html,css ,js اون صفحه وب را داخل متغیر data$ ذخیره می کنه .

حالا با کد های پایین میایم و تگ های a داخل صفحه را پیدا میکنیم و دیتای داخلشونو میخونم البته این کارو با جاوااسکریپت هم می شد انجام داد اما با php انجام دادیم .

$data = strip_tags($data, &quot<a>&quot); $d = preg_split(&quot/<\/a>/&quot, $data);

بعد از اون یک متغیربه اسم link$ می سازیم و مقداری براش قرار نمیدیم ، تا بعدا ازش استفاده کنیم .

$links = []; // All Links will be Append To This List.


حالا با یک حلقه میایم تمام لینک هایی که داخل صفحه پیدا کردیمو به اون آرایه اضافه میکنیم .

foreach ($d as $k => $u) { if (strpos($u, &quot<a href=&quot) !== FALSE) { $u = preg_replace(&quot/.*<a\s+href=\&quot/sm&quot, &quot&quot, $u); $u = preg_replace(&quot/\&quot.*/&quot, &quot&quot, $u); array_push($links, $u); } }

بعد از اینکار باید یک فایل بسازیم که بیاد تمام صفحاتی که ما میخوایم به سمتشون درخواست ارسال کنیم رو دیتا هاشون رو داخلش ذخیره کنیم .

$file_allpage = fopen("website.html", 'a');

حالا یک بار دیگه به همون صفحه اولمون رکوعست ارسال میکنیم که اونو اول داخل فایل ذخیره کنیم .

$homepage = file_get_contents($url); $homepage_replace = str_replace(&quotgoogle&quot, '', $homepage); fwrite($file_allpage, $homepage_replace);


حالا میایم به تک تک اون لینک هایی که داخل آرایه ذخیره کردیم یک رکوعست میفرستیم و دیتاشونو داخل اون فایل ذخیره میکنیم تا بتونیم یک عملیات خزیدن خوب داشته باشیم .

foreach ($links as $link) { if (strstr($link, '*.php') or strstr($link, '*.asp') or strstr($link, '*.js') or strstr($link, '*.go') or strstr($link, '*.py') or strstr($link, '*.jquery')) { $data = file_get_contents($url . $link); $data_replace = str_replace(&quotgoogle&quot, '', $data); fwrite($file_allpage, $data_replace); } else { continue; }}


حالا باید بیایم دیتاهای داخل اون فایل رو بخونیم و بعد برگردونیمش تا بعدا هر بلایی خواستیم سرش بیاریم .

$file_read = fopen(&quotwebsite.html&quot, &quotr&quot); $value = fread($file_read, filesize(&quotwebsite.html&quot)); return $value;


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


include(&quotController.php&quot); $CRAWL = new CRAWL; if (isset($_POST['submit'])) { $CMS = ['.py', '.go', '.js', '.Css', '.asp', 'jquery', '.php', 'Bootstrap', 'script']; $url = $_POST['url']; $khazesh = $CRAWL->Crawling($url); echo &quotCMS Of This Website: $url &quot echo &quot<br>&quot echo &quot<br>&quot $number = 1; foreach ($CMS as $c) { $search = $CRAWL->search($khazesh, $c); if ($search != 'false') { echo $number . ') ' . $c . &quot<hr>&quot $number++; } }; unlink('website.html');}

موفق و پیروز باشید .

برای پرسیدن سوال های php خود و حل مشکلاتتان به گروه انجمن php ایران بپیوندید .

https://t.me/IR_PHP_Developers_Community

کانال انجمن :

https://t.me/IR_PHP_Dev_Community_channel

phpخزندهخزیدنبرنامه نویسیprogramming
مهدی مومنی هستم علاقه مند به برنامه نویسی وب ، بیشتر از دو سال که python و django کار می کنم و دوست دارم چیز هایی که یاد میگیرم را با بقیه به اشتراک بزارم .... وبسایت شخصی من https://mahdimomeni.ir
شاید از این پست‌ها خوشتان بیاید