توفر هذه الحزمة فئة للزحف إلى الروابط الموجودة على موقع ويب. تحت غطاء محرك السيارة، يتم استخدام وعود Guzzle للزحف إلى عناوين URL متعددة في وقت واحد.
نظرًا لأن الزاحف يمكنه تنفيذ JavaScript، فيمكنه الزحف إلى المواقع التي يتم عرضها بواسطة JavaScript. تحت الغطاء، يتم استخدام Chrome وPuppeteer لتشغيل هذه الميزة.
نحن نستثمر الكثير من الموارد في إنشاء أفضل الحزم مفتوحة المصدر في فئتها. يمكنك دعمنا عن طريق شراء أحد منتجاتنا المدفوعة.
نحن نقدر بشدة إرسالك لنا بطاقة بريدية من مسقط رأسك، مع ذكر الحزمة (الحزم) التي تستخدمها. ستجد عنواننا على صفحة الاتصال لدينا. ننشر جميع البطاقات البريدية المستلمة على جدار البطاقات البريدية الافتراضية لدينا.
يمكن تثبيت هذه الحزمة عبر Composer:
يتطلب الملحن مكانًا/زاحفًا
يمكن إنشاء مثيل للزاحف مثل هذا
استخدم SpatieCrawlerCrawler؛ الزاحف::إنشاء() ->setCrawlObserver(<الفئة التي تمتد SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
يجب أن تكون الوسيطة التي تم تمريرها إلى setCrawlObserver
كائنًا يمتد إلى فئة SpatieCrawlerCrawlObserversCrawlObserver
المجردة:
مساحة الاسم SpatieCrawlerCrawlObservers;استخدام GuzzleHttpExceptionRequestException;استخدام PsrHttpMessageResponseInterface;استخدام PsrHttpMessageUriInterface;فئة مجردة CrawlObserver {/* * يتم الاتصال به عندما يقوم الزاحف بالزحف إلى عنوان URL. */ الوظيفة العامة willCrawl(UriInterface $url, ?string $linkText): void{ }/* * يتم الاتصال به عندما يقوم الزاحف بالزحف إلى عنوان URL المحدد بنجاح. */ تم الزحف إلى الوظيفة العامة المجردة (UriInterface $url,ResponseInterface $response, ?UriInterface $foundOnUrl = null, ?سلسلة $linkText, ): void;/* * يتم الاتصال به عندما يواجه الزاحف مشكلة في الزحف إلى عنوان URL المحدد. */ الوظيفة العامة المجردة CrawlFailed(UriInterface $url,RequestException $requestException, ?UriInterface $foundOnUrl = null, ?string $linkText = null, ): void;/** * يتم الاتصال به عند انتهاء الزحف. */ الوظيفة العامة انتهى الزحف (): باطلة { } }
يمكنك تعيين عدة مراقبين باستخدام setCrawlObservers
:
الزاحف::إنشاء() ->setCrawlObservers([ <الفئة التي تمتد SpatieCrawlerCrawlObserversCrawlObserver>، <الفئة التي تمتد SpatieCrawlerCrawlObserversCrawlObserver>، ... ]) ->startCrawling($url);
وبدلاً من ذلك، يمكنك تعيين عدة مراقبين واحدًا تلو الآخر باستخدام addCrawlObserver
:
الزاحف::إنشاء() ->addCrawlObserver(<الفئة التي تمتد SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<الفئة التي تمتد SpatieCrawlerCrawlObserversCrawlObserver>) ->addCrawlObserver(<الفئة التي تمتد SpatieCrawlerCrawlObserversCrawlObserver>) ->startCrawling($url);
افتراضيًا، لن يقوم الزاحف بتنفيذ JavaScript. هذه هي الطريقة التي يمكنك بها تمكين تنفيذ JavaScript:
الزاحف::إنشاء() ->تنفيذ جافا سكريبت () ...
من أجل التمكن من الحصول على النص الأساسي html بعد تنفيذ جافا سكريبت، تعتمد هذه الحزمة على حزمة Browsershot الخاصة بنا. تستخدم هذه الحزمة محرك الدمى تحت الغطاء. فيما يلي بعض المؤشرات حول كيفية تثبيته على نظامك.
سيقوم Browsershot بإجراء تخمين مدروس حول مكان تثبيت تبعياته على نظامك. افتراضيًا، سيقوم الزاحف بإنشاء مثيل Browsershot جديد. قد تجد الحاجة إلى تعيين مثيل تم إنشاؤه خصيصًا باستخدام طريقة setBrowsershot(Browsershot $browsershot)
.
الزاحف::إنشاء() ->setBrowsershot($browsershot) ->تنفيذ جافا سكريبت () ...
لاحظ أن الزاحف سيظل يعمل حتى لو لم يكن لديك تبعيات النظام التي يتطلبها Browsershot. تبعيات النظام هذه مطلوبة فقط إذا كنت تتصل executeJavaScript()
.
يمكنك إخبار الزاحف بعدم زيارة عناوين URL معينة باستخدام وظيفة setCrawlProfile
. تتوقع هذه الوظيفة كائنًا يمتد SpatieCrawlerCrawlProfilesCrawlProfile
:
/* * تحديد ما إذا كان يجب الزحف إلى عنوان URL المحدد. */ الوظيفة العامة mustCrawl(UriInterface $url): bool;
تأتي هذه الحزمة مع ثلاثة CrawlProfiles
جاهزة:
CrawlAllUrls
: سيقوم ملف التعريف هذا بالزحف إلى جميع عناوين url في جميع الصفحات بما في ذلك عناوين url الخاصة بموقع خارجي.
CrawlInternalUrls
: سيزحف ملف التعريف هذا فقط إلى عناوين URL الداخلية الموجودة على صفحات المضيف.
CrawlSubdomains
: سيزحف ملف التعريف هذا فقط إلى عناوين URL الداخلية ونطاقاتها الفرعية على صفحات المضيف.
يمكنك تخصيص كيفية استخراج الروابط من الصفحة عن طريق تمرير UrlParser
مخصص إلى الزاحف.
الزاحف::إنشاء() ->setUrlParserClass(<الفئة التي تطبق SpatieCrawlerUrlParsersUrlParser>::class) ...
بشكل افتراضي، يتم استخدام LinkUrlParser
. سيقوم هذا المحلل باستخراج جميع الروابط من سمة href
a
.
يوجد أيضًا SitemapUrlParser
مدمج والذي سيستخرج جميع الروابط من خريطة الموقع ويزحف إليها. وهو يدعم ملفات فهرس خريطة الموقع.
الزاحف::إنشاء() ->setUrlParserClass(SitemapUrlParser::class) ...
افتراضيًا، سيحترم الزاحف بيانات الروبوتات. من الممكن تعطيل عمليات التحقق هذه كما يلي:
الزاحف::إنشاء() ->تجاهل الروبوتات () ...
يمكن أن تأتي بيانات الروبوتات إما من ملف robots.txt
أو العلامات الوصفية أو رؤوس الاستجابة. يمكن العثور على مزيد من المعلومات حول المواصفات هنا: http://www.robotstxt.org/.
يتم تحليل بيانات الروبوتات من خلال الحزمة الخاصة بنا spatie/robots-txt.
افتراضيًا، سيرفض الزاحف جميع الروابط التي تحتوي على السمة rel = "nofollow". من الممكن تعطيل عمليات التحقق هذه كما يلي:
الزاحف::إنشاء() ->قبول الروابط Nofollow() ...
من أجل احترام قواعد ملف robots.txt لوكيل المستخدم المخصص، يمكنك تحديد وكيل المستخدم المخصص الخاص بك.
الزاحف::إنشاء() ->setUserAgent('وكيلي')
يمكنك إضافة مجموعة قواعد الزحف المحددة الخاصة بك لـ "my-agent" في ملف robots.txt. لا يسمح هذا المثال بالزحف إلى الموقع بالكامل لبرامج الزحف التي تم تحديدها بواسطة "my-agent".
// عدم السماح بالزحف إلى وكيلي وكيل المستخدم: وكيلي عدم السماح: /
لتحسين سرعة الزحف، تقوم الحزمة بشكل متزامن بالزحف إلى 10 عناوين URL بشكل افتراضي. إذا كنت تريد تغيير هذا الرقم، يمكنك استخدام طريقة setConcurrency
.
الزاحف::إنشاء() ->setConcurrency(1) // الآن سيتم الزحف إلى جميع عناوين URL واحدًا تلو الآخر
افتراضيًا، يستمر الزاحف في المتابعة حتى يقوم بالزحف إلى كل صفحة يمكنه العثور عليها. قد يتسبب هذا السلوك في حدوث مشكلات إذا كنت تعمل في بيئة ذات قيود مثل بيئة بدون خادم.
يمكن التحكم في سلوك الزحف من خلال الخيارين التاليين:
إجمالي حد الزحف ( setTotalCrawlLimit
): يحدد هذا الحد العدد الأقصى لعناوين URL التي سيتم الزحف إليها.
حد الزحف الحالي ( setCurrentCrawlLimit
): يحدد هذا عدد عناوين URL التي تتم معالجتها أثناء الزحف الحالي.
دعونا نلقي نظرة على بعض الأمثلة لتوضيح الفرق بين هاتين الطريقتين.
يتيح لك الأسلوب setTotalCrawlLimit
تحديد العدد الإجمالي لعناوين URL المطلوب الزحف إليها، بغض النظر عن عدد مرات الاتصال بالزاحف.
$queue = <اختيارك/تنفيذ قائمة الانتظار>;// يزحف إلى 5 عناوين URL وينتهي.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(5) ->startCrawling($url);// لا يتم الزحف بشكل أكبر عند الوصول إلى الحد الإجمالي.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(5) ->startCrawling($url);
سيضع setCurrentCrawlLimit
حدًا لعدد عناوين URL التي سيتم الزحف إليها لكل عملية تنفيذ. سيعمل هذا الجزء من التعليمات البرمجية على معالجة 5 صفحات مع كل عملية تنفيذ، بدون حد إجمالي للصفحات التي سيتم الزحف إليها.
$queue = <اختيارك/تنفيذ قائمة الانتظار>;// يزحف إلى 5 عناوين URL وينتهي.Crawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(5) ->startCrawling($url);// يزحف إلى عناوين URL الخمسة التالية وينتهي.Crawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(5) ->startCrawling($url);
يمكن دمج كلا الحدين للتحكم في الزاحف:
$queue = <اختيارك/تنفيذ قائمة الانتظار>;// يزحف إلى 5 عناوين URL وينتهي.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);// يزحف إلى عناوين URL الخمسة التالية وينتهي.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);// لا يتم الزحف بشكل أكبر عند الوصول إلى الحد الإجمالي.Crawler::create() ->setCrawlQueue($queue) ->setTotalCrawlLimit(10) ->setCurrentCrawlLimit(5) ->startCrawling($url);
يمكنك استخدام setCurrentCrawlLimit
لتقسيم عمليات الزحف الطويلة. يوضح المثال التالي النهج (المبسط). ويتكون من طلب أولي وأي عدد من طلبات المتابعة التي تستمر في الزحف.
لبدء الزحف عبر طلبات مختلفة، ستحتاج إلى إنشاء قائمة انتظار جديدة لبرنامج تشغيل قائمة الانتظار المحدد. ابدأ بتمرير نسخة قائمة الانتظار إلى الزاحف. سيبدأ الزاحف في ملء قائمة الانتظار أثناء معالجة الصفحات واكتشاف عناوين URL الجديدة. قم بإجراء تسلسل وتخزين مرجع قائمة الانتظار بعد انتهاء الزاحف (باستخدام حد الزحف الحالي).
// أنشئ قائمة انتظار باستخدام برنامج تشغيل قائمة الانتظار.$queue = <اختيارك/تنفيذ قائمة الانتظار>؛// الزحف إلى المجموعة الأولى من URLsCrawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(10) ->startCrawling($url);// إجراء تسلسل لقائمة الانتظار الخاصة بك وتخزينها$serializedQueue = serialize($queue);
بالنسبة لأية طلبات تالية، ستحتاج إلى إلغاء تسلسل قائمة الانتظار الأصلية وتمريرها إلى الزاحف:
// Unserialize queue$queue = unserialize($serializedQueue);// يزحف إلى المجموعة التالية من URLsCrawler::create() ->setCrawlQueue($queue) ->setCurrentCrawlLimit(10) ->startCrawling($url);// إجراء تسلسل لقائمة الانتظار الخاصة بك وتخزينها$serialized_queue = serialize($queue);
يعتمد السلوك على المعلومات الموجودة في قائمة الانتظار. فقط إذا تم تمرير نفس مثيل قائمة الانتظار في السلوك يعمل كما هو موضح. عند تمرير قائمة انتظار جديدة تمامًا، لن يتم تطبيق حدود عمليات الزحف السابقة -حتى لنفس موقع الويب-.
يمكن العثور على مثال بمزيد من التفاصيل هنا.
افتراضيًا، يستمر الزاحف في المتابعة حتى يقوم بالزحف إلى كل صفحة من عنوان URL المقدم. إذا كنت تريد تحديد عمق الزاحف، فيمكنك استخدام طريقة setMaximumDepth
.
الزاحف::إنشاء() ->ضبط الحد الأقصى(2)
معظم صفحات HTML صغيرة جدًا. ولكن يمكن للزاحف أن يلتقط عن طريق الخطأ ملفات كبيرة مثل ملفات PDF وملفات MP3. للحفاظ على انخفاض استخدام الذاكرة في مثل هذه الحالات، سيستخدم الزاحف الاستجابات التي يقل حجمها عن 2 ميجابايت فقط. إذا أصبح حجم الاستجابة أكبر من 2 ميجابايت، عند دفق الاستجابة، فسيتوقف الزاحف عن دفق الاستجابة. سيتم افتراض نص استجابة فارغ.
يمكنك تغيير الحد الأقصى لحجم الاستجابة.
// لنستخدم 3 ميغابايت كحد أقصى.Crawler::create() ->setMaximumResponseSize(1024*1024*3)
في بعض الحالات، قد يتم تقييد المعدل عند الزحف بقوة شديدة. للتحايل على هذا، يمكنك استخدام طريقة setDelayBetweenRequests()
لإضافة توقف مؤقت بين كل طلب. يتم التعبير عن هذه القيمة بالمللي ثانية.
الزاحف::إنشاء() ->setDelayBetweenRequests(150) // بعد الزحف إلى كل صفحة، سينتظر الزاحف لمدة 150 مللي ثانية
افتراضيًا، سيتم تنزيل كل صفحة يتم العثور عليها (يصل حجمها إلى setMaximumResponseSize()
) ويتم تحليلها بحثًا عن روابط إضافية. يمكنك تحديد أنواع المحتوى التي يجب تنزيلها وتحليلها عن طريق تعيين setParseableMimeTypes()
مع مجموعة من الأنواع المسموح بها.
الزاحف::إنشاء() ->setParseableMimeTypes(['text/html', 'text/plain'])
سيؤدي هذا إلى منع تنزيل نص الصفحات التي تحتوي على أنواع مختلفة من ملفات mime، مثل الملفات الثنائية والصوت/الفيديو، ... والتي من غير المحتمل أن تحتوي على روابط مضمنة فيها. تعمل هذه الميزة في الغالب على حفظ النطاق الترددي.
عند الزحف إلى موقع ما، سيضع الزاحف عناوين URL المراد الزحف إليها في قائمة الانتظار. افتراضيًا، يتم تخزين قائمة الانتظار هذه في الذاكرة باستخدام ArrayCrawlQueue
المدمج.
عندما يكون الموقع كبيرًا جدًا، قد ترغب في تخزين قائمة الانتظار هذه في مكان آخر، ربما في قاعدة بيانات. في مثل هذه الحالات، يمكنك كتابة قائمة انتظار الزحف الخاصة بك.
قائمة انتظار الزحف الصالحة هي أي فئة تطبق واجهة SpatieCrawlerCrawlQueuesCrawlQueue
. يمكنك تمرير قائمة انتظار الزحف المخصصة الخاصة بك عبر طريقة setCrawlQueue
على الزاحف.
الزاحف::إنشاء() ->setCrawlQueue(<تنفيذ SpatieCrawlerCrawlQueuesCrawlQueue>)
هنا
ArrayCrawlQueue
RedisCrawlQueue (حزمة الطرف الثالث)
CacheCrawlQueue لـ Laravel (حزمة الطرف الثالث)
Laravel Model كقائمة انتظار (تطبيق مثال لجهة خارجية)
افتراضيًا، سيقوم الزاحف بتعيين نظام عنوان URL الأساسي على http
في حالة عدم وجوده. لديك القدرة على تغيير ذلك باستخدام setDefaultScheme
.
الزاحف::إنشاء() ->setDefaultScheme('https')
الرجاء مراجعة سجل التغيير لمزيد من المعلومات عما تغير مؤخرًا.
يرجى الاطلاع على المساهمة للحصول على التفاصيل.
أولاً، قم بتثبيت تبعية Puppeteer، وإلا ستفشل اختباراتك.
npm install puppeteer
لإجراء الاختبارات، سيتعين عليك تشغيل الخادم المعتمد على العقدة المضمنة أولاً في نافذة طرفية منفصلة.
اختبارات القرص المضغوط/الخادم تثبيت npm عقدة server.js
مع تشغيل الخادم، يمكنك البدء في الاختبار.
اختبار الملحن
إذا وجدت خطأً يتعلق بالأمان، فيرجى إرسال بريد إلكتروني إلى العنوان [email protected] بدلاً من استخدام أداة تعقب المشكلات.
أنت حر في استخدام هذه الحزمة، ولكن إذا وصلت إلى بيئة الإنتاج الخاصة بك، فإننا نقدر بشدة إرسالك لنا بطاقة بريدية من مسقط رأسك، مع ذكر الحزمة (الحزم) التي تستخدمها.
عنواننا هو: سباتي، كرويكسترات 22، 2018 أنتويرب، بلجيكا.
ننشر جميع البطاقات البريدية المستلمة على موقع شركتنا.
فريك فان دير هيرتن
جميع المساهمين
رخصة معهد ماساتشوستس للتكنولوجيا (MIT). يرجى الاطلاع على ملف الترخيص لمزيد من المعلومات.