PHP لجمع البيانات بالتعاون مع موقع بروكسي موثوق

image

محتويات المقال:

القطعة التي تقرأها تُنهي رحلتنا الطويلة عبر مجال جمع البيانات من الويب الصعب. لقد استكشفت موقع Dexodata البروكسي الموثوق به مع إعدادات متقدمة ومرنة إمكانيات Python وJavaScript وJava. نحن الآن ندعو القراء للتركيز على اتجاه آخر محبوب لجمع المعلومات. نعني المساعد القديم الجيد PHP.

لماذا يجب على المستخدمين تجربته إذا كانوا يعتزمون الحصول على محتوى من وجود على الويب وسيلجأون إلى بروكسياتنا المستهدفة جغرافياً لهذا الغرض؟ إليك الجواب. بشكل أساسي، يمكن وصف PHP كلغة برمجة نصية على جانب الخادم متعددة الأغراض ولدت في عام 1995. وكما هو الحال، فهي بطبيعتها مخصصة لتطوير الويب (أحدث إصدار من PHP هو 8.4). الحصة التي حصلت عليها PHP وما زالت تحتفظ بها لا تزال هائلة.  

  1. أي شخص يعرف على الأقل شيئاً عن الجوانب التقنية للإنترنت يعرف ما هو WordPress. بناءً على PHP، فإن هذا النظام يدير ويحتفظ بحوالي 40% من جميع المواقع الموجودة. ليس كلهم مشهورين، 40% من المواقع لا تعني بالضرورة 40% من حركة المرور أو 40% من البيانات. لكن هذه الحقيقة تتحدث عن نفسها.
  2. بجانب جميع الأشياء المتعلقة بإدارة المحتوى، حوالي 80% من المواقع تعتمد على PHP (عندما يمكن تحديد خاصيتها على جانب الخادم).
  3. أخيراً، يمكن هندسة منتجات متقدمة حقاً ذات طلب كبير باستخدام PHP. على سبيل المثال، يجب على أولئك الذين يطلبون تجربة مجانية للبروكسي المدفوع لدينا كمستخدمين جدد لتطبيق العناوين كبروكسيات لوسائل التواصل الاجتماعي أن يعرفوا أن Slack يعتمد على كود PHP. نعم، إنها ليست وسيلة تواصل اجتماعي في أنقى صورها، ولكن لا يزال.

كلغة “مهيأة” للويب، تعتبر PHP خياراً جيداً للسيناريوهات ذات التعقيد المنخفض إلى المتوسط. من خلالها يمكن للمبرمجين:

  • بدء الطلبات التي سيتم نقلها إلى صفحة معينة;  
  • استرجاع المعلومات;
  • حفظ المعلومات بشكل منظم، مثل تنسيقات CSV أو JSON أو XML.

لتلخيص: PHP بالتأكيد مورد يمكن استخدامه في مهام جمع البيانات، حيث إنها قادرة على التفاعل مع المواقع وفهم ومعالجة HTML، بالإضافة إلى جمع المعلومات من الوجودات عبر مجموعة من الوظائف والمكتبات المناسبة. في هذه السعة، ليست PHP متقدمة ومرنة جداً ويجب عدم اختيارها للمحتوى الديناميكي، ومع ذلك، فهي خيار قابل للتطبيق وقابل للعمل (إلى حد ما). نقول ذلك كموقع بروكسي موثوق به مع عناوين لجمع البيانات من الويب يعرف هذا التجارة لجمع البيانات جيداً.

جمع البيانات من الويب باستخدام PHP: الأساسيات والمتطلبات المسبقة

قبل المضي قدماً، تحقق مما إذا كنت على دراية جيدة بالأشياء أدناه.

  1. طلبات HTTP. هنا نعني البروتوكول الذي تستخدمه الخوادم لإرسال واستقبال المعلومات. للحصول على بعض البيانات من وجود ما، يجب على المستخدم توجيه استعلام HTTP إلى الخادم المسؤول عن استضافة الصفحة. تحتوي PHP على وظائف مدمجة مثل cURL وfile_get_contents()، بالإضافة إلى fopen() التي تمكن المرء من توجيه استعلامات HTTP والحصول على المعلومات من الصفحات.
  2. تحليل HTML. كلغة مصممة لـ “بناء” صفحات الويب، توفر PHP مثل هذه الأشياء المدمجة مثل DOMDocument مع SimpleXMLElement التي تمكن المستخدمين من تحليل HTML لجمع المعلومات.
  3. التعبيرات العادية تعمل كأداة فعالة وقوية لمطابقة الأنماط والتلاعب بالنصوص. مرة أخرى، تقدم PHP وظائف مدمجة، مثل preg_match() مع preg_replace() التي تمكن المرء من استخدام التعبيرات العادية لجمع المعلومات المستمدة من المواقع.

حتى هذه المفاهيم الأساسية ستكون كافية في حال كان المستخدمون يعتزمون إنشاء برنامج PHP بسيط قادر على نقل استعلامات HTTP إلى وجود، و“إنقاذ” HTML، وفي النهاية تحليل الكود وجمع المعلومات المطلوبة باستخدام نظام Dexodata من البروكسيات المستهدفة جغرافياً (مع تجربة مجانية للبروكسي المدفوع، بما في ذلك البروكسيات لوسائل التواصل الاجتماعي).

 

جمع بيانات الويب باستخدام PHP: سيناريو عينة

 

افترض أنه من الضروري جمع المعلومات الموجودة في وجود ما كقائمة من العناصر المعروضة للبيع (ما سنعرضه هو حالة بسيطة جداً، ستكون هناك حالات أكثر تقدماً في الأقسام التالية). من الضروري جمع الاسم والسعر والصورة لكل عنصر وحفظ تلك المعلومات كملف CSV. إليك أبسط طريقة للقيام بذلك، أي عندما لا توجد سيناريوهات معقدة وعوائق. فقط اتبع خطوات نظام Dexodata من البروكسيات المستهدفة جغرافياً.

<?php

$url = 'https://sample.com/items';

$html = file_get_contents($url);

$dom = new DOMDocument();

$dom->loadHTML($html);

$products = $dom->getElementsByTagName('article');

$data = [];

foreach ($items as $items) {

    $name = $item->getElementsByTagName('h2')[0]->textContent;

    $price = $item->getElementsByTagName('span')[0]->textContent;

    $image = $item->getElementsByTagName('img')[0]->getAttribute('src');

    $data[] = [$name, $price, $image];

}

$fp = fopen('items.csv', 'w');

foreach ($data as $fields) {

    fputcsv($fp, $fields);

}

fclose($fp);

?>

لم يكن هناك شيء أسهل من ذلك!

ما يراه القراء هنا هو أننا أولاً نقوم بنقل استعلام HTTP إلى الوجود بواسطة file_get_contents(). بعد ذلك، ننتقل إلى تحليل محتوى HTML عبر فئة DOMDocument ونجمع بعض المعلومات ذات الصلة عبر تقنية getElementsByTagName(). ثم نكون أحراراً في حفظ المعلومات التي تم جمعها في مصفوفة متعددة الأبعاد، والتي تُكتب لاحقاً إلى ملف CSV عبر fputcsv().

إذا كنت تشعر أن كل شيء واضح، دعنا نتحرك للأمام. سيظهر لك موقع Dexodata البروكسي الموثوق به مع خيارات التجربة المجانية للبروكسي الطريق لجمع البيانات.

 

التطور. المكتبات والأدوات

 

منذ نشأته، تطورت PHP بشكل كبير. ربما، لا تبدو مكتباتها “عصرية” و“فاخرة” (ليست Python)، ومع ذلك، تتمتع هذه اللغة بمجتمع ضخم من المشاركين الذين يدعمون المكتبات القابلة للعمل. دعونا نفحصها في سياق جمع البيانات من الويب. نحن، كموقع بروكسي موثوق يدير نظاماً من البروكسيات المستهدفة جغرافياً (بما في ذلك البروكسيات لوسائل التواصل الاجتماعي، مثل Instagram) نقدم السلم التالي، في رأينا، من الخيارات الأبسط إلى الأكثر تقدماً.

 

1. Goutte

 

Goutte هو مكتبة كاملة الميزات يمكن تطبيقها مع إطار عمل PHP. يمكن إتقانها حتى من قبل المبتدئين لجمع البيانات المستمدة من HTML. منحنى التعلم في هذه الحالة ليس صعباً، بفضل تصميمها القابل للفهم القائم على الكائنات. أما بالنسبة للمزايا الأخرى، فهي تشمل مجتمعاً مرئياً، وحجماً كبيراً من الوثائق المفيدة، وأخيراً، السرعة. نظراً لأنها تعتمد على اتصالات HTTP 1.1 المستمرة، فهذا يعني أن المتصفح يحتاج إلى اتصال واحد فقط بالخادم. بعد ذلك، سيتم استخدام نفس الاتصال لجميع الطلبات بعد الطلب الأول.

هناك بعض العيوب أيضاً. في بعض المشاريع، قد تواجه قيوداً لا يمكن تجاوزها بشأن المحتوى الديناميكي. دعونا نجرب Goutte وPHP في العمل وننقر على الصفحة المعنية (كما هو الحال دائماً، عند جمع أي شيء على الويب، لا تنسَ بروكسيات Dexodata السكنية، ومراكز البيانات، والشبكة المحمولة المستهدفة جغرافياً المتاحة بأسعار مناسبة).

للشروع، يجب على المرء تثبيت Composer. يستخدم هذا لإدارة التبعيات عندما يتعلق الأمر بـ PHP. يمكّن المرء من إعلان المكتبات المهمة لمشروع ما.

كل ما هو مطلوب هو تنفيذ هذا النوع من الأوامر في الطرفية:

composer require fabpot/goutte

ثم أنشئ سكربت PHP للمبادرة. أعطه أي اسم تريده. ثم افتح سكربتك الجديدة وأضف هذه الأسطر من الكود لتشغيل Goutte:

require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

رائع، Goutte في حالة نشاط كامل وتم تهيئته! بعد ذلك، قدم هذه السطور أدناه إلى نهاية الملف لاسترجاع عنوان URL بواسطة client->request().

$url = "http://instance.com/";

$crawler = $client->request('GET', $url);

// انقر على رابط "المزيد من المعلومات..."

$link = $crawler->selectLink('المزيد من المعلومات…')->link();

$crawler = $client->click($link);

لقد استغرقنا بضع سطور من الكود لنصل إلى الوضع الصحيح للتنقل إلى وجود ما وإنجاز النقرات. الآن حان الوقت للجولة الثانية مع موقع Dexodata البروكسي الموثوق.

 

2. Simple HTML DOM

 

كونها محلل، تم تصميم هذا البرنامج للعمل مع أي مستند HTML، بما في ذلك تلك المستندات التي تُعرف بأنها غير صالحة وفقاً لمواصفات HTML المعنية. ميزة كبيرة لها هي أنها سهلة الإتقان، ولا تحتوي على أي محتوى JS خارجي لتحميله بشكل منفصل قبل البدء في العمل. تشمل المزايا الأخرى السرعة (لا يحتاج المستخدمون إلى تحميل صفحة كاملة في الذاكرة، لذا يمكنك معالجة مجموعة من صفحات HTML بشكل متزامن دون التأثير على أدائك) وحقيقة أنها خفيفة الوزن (أي أنه لا حاجة لتثبيت أي برامج أو مكتبات إضافية، PHP وحده سيكون كافياً).

لا شك أن هناك قيوداً. سيكون وصولك إلى مكونات الصفحة محدوداً: يمكن للمرء تنفيذ التلاعبات مع هيكل الصفحة، لكن محتواها سيكون بعيد المنال. من الجدير بالذكر أن Simple HTML DOM صارمة جداً، لذا ما لم تكن إله HTML، ستكون الإمكانيات محدودة.

لقد كان ذلك كافياً من النظرية، دعنا نتوجه إلى الممارسة.

للشروع، احصل على أحدث إصدار من خلال زيارة هذا مساحة توثيق Simple HTML DOM. سيعطيك كل ما تحتاجه.

أولاً، انسخ ملف simple_html_dom.php. بعد ذلك، ببساطة ألصق الأخير في مشروعك النشط.

أنشئ ملف PHP الخاص بك (الأسماء لا تهم). على سبيل المثال، webscrapingstuff.php.

الآن، افتح الملف و“جهز” مشروعك بمكتبة Simple HTML DOM بإضافتها. استخدم الكود المقترح من موقع Dexodata البروكسي الموثوق أدناه:

include('simple_html_dom.php');

أدخل هذا السطر من الكود. إنه مهم، لأنه سيوجهك إلى الصفحة نفسها:

$html = file_get_html('http://instance.com/')

تستطيع file_get_html، كونها جزءاً من Simple HTM DOM، استرجاع HTML المرتبط بعنوان URL الذي تحدده. لاحقاً، تسلم كائن DOM الذي يخزن متغير $html لدينا.

لنقل أنك بحاجة إلى العنوان الرئيسي. للحصول على ذلك العنوان H1 الأول، استخدم هذا الكود:

echo $html->find('h1', 0)->plaintext;

إذا فتحت هذا الملف الناتج على خادم الويب الخاص بك، ستجد ما تحتاجه هناك.

 

3. PHP Scraper

 

كنظام من عناوين IP الموثوقة والمستهدفة جغرافياً والمركزة على جمع البيانات، لا يمكننا تجاهل PHP Scraper. الأخير يعمل كأداة تمكّن المجمعين من جمع المعلومات عبر سكربتات PHP. هذه الطريقة تعني عدم الحاجة لكتابة الكثير من الكود بنفسك. كل ما هو مطلوب هو استخدام أوامر بسيطة مثل find_element_by_class أو find_element_by_id. ستكون كافية لمكونات محددة على أي وجود معين من خلال كتابة رقم فئتها أو معرفها.

هل هناك أي مشاكل؟ بالطبع، هناك بعض. قد لا يتناسب PHP Scraper مع كل حالة استخدام ممكنة، طالما أنه، بطبيعة الحال، يعتمد على PHP. وبالتالي، فهو متوافق مع الخوادم المرتبطة بـ Apache أو Nginx والمكونة عبر mod_rewrite المفعلة بشكل افتراضي. PHP Scraper ليس وجهتك إذا كنت تعتزم جمع المعلومات من API أو التحليل عبر وجودات HTML معقدة.

على أي حال، دعونا نشغل سيناريو أساسياً.

يجب على قرائنا تثبيت Composer، كما فعلنا في قسم Goutte. بعد ذلك، أضف مكتبة الموضوع قيد المناقشة إلى مشروعك، باستخدام هذا الكود عبر Composer:

composer require spekulatius/phpscraper

بمجرد أن يتم تجاوز مرحلة التثبيت، يتولى محمل تلقائي Composer الحزمة. في حال كان المرء يعمل مع مكتبة VanillaPHP، يجب عليهم دمج المحمل التلقائي في سكربتهم، كما هو موضح أدناه:

require 'vendor/autoload.php'

كتمرين، أنشئ سكربتاً يصل إلى وجود ما ويعد عدد الروابط المنشورة هناك. ابدأ البرنامج وامنحه متغيراً، كما هو موضح هنا:

$web = new \spekulatius\phpscraper();

أعط البرنامج أمراً لزيارة عنوان URL:  

$web->go(' [http://instance.com/](http://instance.com/) ');

أضف هذا الجزء من الكود المخصص لأخذ كل رابط موجود في الوجود وطباعة عددها.

// طباعة عدد الروابط.

echo "تحتوي هذه الصفحة على " . count($web->links) . " روابط. ";

// حلقة عبر الروابط

foreach ($web->links as $link) {

echo " - " . $link . " ";

}

/**

* سيقوم هذا الكود بطباعة:

*

* تحتوي هذه الصفحة على 1 رابط.

*

* - https://www.iana.org/domains/instance

*/

تذكر فقط: نحن نستخدم عنواناً غير حقيقي.

 

4. PHP cURL لعمليات جمع البيانات

 

بعد مراجعة مجموعة من الخيارات المتاحة لأنشطة الجمع بواسطة PHP، يقدم لك موقع Dexodata البروكسي الموثوق خياراً إضافياً مريحاً وشائعاً. نحن بالطبع نعني cURL، مكتبة وأداة سطر أوامر (عادةً ما تكون متاحة مع اللغة بشكل افتراضي) تمكّن المستخدمين من إرسال واستلام الملفات عبر HTTP وFTP. أثناء العمل بها، يمكن للمرء استخدام بروكسيات مستهدفة جغرافياً (بما في ذلك تلك المقدمة مع تجربتنا المجانية للبروكسي المدفوع)، نقل البيانات عبر اتصالات SSL، تحديد الكوكيز، والمزيد. دعونا نجرب ذلك في الممارسة.

أنشئ سكربت PHP جديداً وأضف هذا الكود:

// تهيئة curl

$ch = curl_init();

// عنوان URL لجمع البيانات

curl_setopt($ch, CURLOPT_URL,

'https://dexodata.com/en/blog');

// إعادة نقل البيانات إلى True

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$output = curl_exec($ch);

// إغلاق cURL

curl_close($ch);

تحديد CURLOPT_RETURNTRANSFER كـ TRUE يقدم الصفحة في شكل سلسلة بدلاً من إخراجها مباشرة. وبالتالي، يأخذ كودنا المعلومات التي نحتاجها لجمعها من الموقع.

يمكن للمرء إلقاء نظرة على هذه البيانات عبر echo مع المتغير لتخزين البيانات:

echo $output

خطوتنا التالية هي وضع هذه المعلومات في مستند DOM، مما سيمكننا من الوصول إليها لأغراض جمع البيانات.

$dom = new DOMDocument;

$dom->loadHTML($output);

حالياً، لدينا معلوماتنا كهيكل HTML داخل متغير. أنشئ بعض الأكواد الإضافية لطباعة كل رابط متاح من صفحة HTML:

$tags = $dom->getElementsByTagName('a');

for($I=0; $I < $tags->length; $I++){

$link = $tags->item($i);

echo " - " . $link . " ";

}

بالمناسبة، كمصدر للبروكسيات المستهدفة جغرافياً مع فرص التجربة المجانية للبروكسي، نحث المستخدمين على عدم نسيان حماية مبادرات جمع البيانات الخاصة بهم بالعناوين التي نقدمها (على سبيل المثال، IP السكنية عالية الجودة من مزودي الخدمة أو، بدلاً من ذلك، بروكسياتنا المحمولة عالية الجودة). ستظهر لك نظام Dexodata الطريق لتحقيق ذلك عبر cURL. كل ما يحتاجون إليه هو اتباع الصيغة.

curl --proxy <proxy-ip>:<proxy-port> <url>

أولاً، يجب إدخال قسم <proxy-ip> IP، بينما القسم الثاني <proxy-port> مخصص، كما هو متوقع، لرقم المنفذ. في النهاية، سيبدو هكذا:

curl --proxy 193.191.56.12:7070 -k https://dexodata.com/en/blog

طالما أن العنوان وظيفي، وأن الاستعلام ناجح، سيظهر سكربتنا محتوى الوجود ليخرج بعد ذلك. 

 

إنشاء برنامج جمع البيانات: سيناريو عينة

 

دعونا نتخيل وجوداً للتجارة الإلكترونية مع قائمة من العناصر المعروضة للبيع نريد جمعها عبر PHP. ماذا يجب أن نفعل؟ ما البدائل التي يجب أن نستخدمها؟ اتبع موقعنا البروكسي الموثوق وراجع هذا السيناريو العينة.

ابدأ بتنزيل كامل HTML للوجود التجاري عبر إمكانيات PHP وcURL القديم الجيد، كالتالي:

// تهيئة طلب cURL 

$curl = curl_init(); 

// تعيين عنوان URL للوصول إليه عبر طلب HTTP GET 

curl_setopt($curl, CURLOPT_URL, "https://scrapeme.live/shop/"); 

// الحصول على البيانات التي تم إرجاعها بواسطة طلب cURL كسلسلة 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

// جعل طلب cURL يتبع عمليات إعادة التوجيه المحتملة، 

// والوصول إلى الصفحة النهائية المعنية 

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

// تنفيذ طلب cURL و 

// الحصول على HTML الصفحة كسلسلة 

$html = curl_exec($curl); 

// تحرير موارد cURL 

curl_close($curl);

الأشياء المتعلقة بـ HTML في تصرفنا الكامل، بفضل Dexodata. تدبيرك التالي هو تحميل $html في مثيل HtmlDomParser الذي يتضمن وظيفة str_get_html(). انظر كيف يمكن القيام بذلك أدناه:

require_once __DIR__ . "../../vendor/autoload.php";

use voku\helper\HtmlDomParser; 

$curl = curl_init(); 

curl_setopt($curl, CURLOPT_URL, "https://scrapeme.live/shop/"); 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

$html = curl_exec($curl); 

curl_close($curl); 

// تهيئة HtmlDomParser 

$htmlDomParser = HtmlDomParser::str_get_html($html);

أنت وموقعنا البروكسي الموثوق الآن في الوضع الصحيح لتطبيق HtmlDomParser لغرض تصفح DOM لوجود HTML وبدء عملية جمع البيانات بشكل فعال.

هذا ما تسعى Dexodata لتحقيقه. لجعل ذلك يحدث، “أنقذ” القائمة الكاملة لجميع الروابط المتعلقة بالصفحات في سيناريوهاتنا. في حالتنا، سيتيح لنا ذلك الزحف عبر قسم الويب الكامل. انقر بزر الماوس الأيمن على مكون HTML المتعلق برقم الصفحات واختر "فحص". بعد ذلك، ستظهر أدوات المطور لدينا عنصر DOM.

كيفية جمع البيانات باستخدام PHP مع موقع بروكسي موثوق

دعونا نتحرك للأمام مع نظام Dexodata من البروكسيات المستهدفة جغرافياً. يمكن للمرء أن يتوقع أن .page-numbers، بصفة فئة CSS، ستحدد مكونات HTML المتعلقة بالصفحات. ومع ذلك، تود فريق موقعنا البروكسي الموثوق أن تذكرنا جميعاً أن فئة CSS قد لا تحدد بالضرورة مكون HTML بشكل فريد. قد تكون هناك عدة عقد مرتبطة بنفس الفئة الواحدة.

لذلك، إذا كانت نيتك هي استخدام محدد CSS لجمع المكونات في DOM، يجب عليك حتماً استخدام فئة CSS مع محددات أخرى. على وجه التحديد، يمكن للمستخدمين استخدام مساعد HtmlDomParser، مع .page-numbers كمحدد CSS، لاختيار جميع مكونات HTML المتعلقة بالصفحات. ثم سيقترح نظامنا من البروكسيات المستهدفة جغرافياً عليك التكرار عبرها لجمع كل الروابط المطلوبة مباشرة من خاصية href.

تحقق من هذا:

// استرجاع عناصر HTML المتعلقة بالصفحات مع 

// محدد CSS ".page-numbers a" 

$paginationElements = $htmlDomParser->find(".page-numbers a"); 

$paginationLinks = []; 

foreach ($paginationElements as $paginationElement) { 

// ملء مجموعة paginationLinks بالرابط 

// المستخرج من خاصية href لعنصر HTML المتعلق بالصفحات 

$paginationLink = $paginationElement->getAttribute("href"); 

// تجنب التكرارات في قائمة الروابط 

if (!in_array($paginationLink, $paginationLinks)) { 

$paginationLinks[] = $paginationLink; 

}  

}

// طباعة مصفوفة paginationLinks 

print_r($paginationLinks);

انتبه إلى أن find() يمكّن المستخدمين من جمع مكونات DOM بناءً على محدد CSS. علاوة على ذلك، في سيناريو Dexodata الافتراضي، يتم عرض المكونات المتعلقة بالصفحات مرتين على كل صفحة من وجود التجارة الإلكترونية. يحتاج المرء إلى تقديم حيلة فريدة ومعدلة للتعامل مع قضية المكونات المكررة عندما تكون مصفوفة $paginationLinks في خطر.

إليك ما سنراه إذا حاولنا تشغيل سكربتنا للسيناريو:

Array ( 

[0] => https://scrapeme.live/shop/page/2/ 

[1] => https://scrapeme.live/shop/page/3/ 

[2] => https://scrapeme.live/shop/page/4/ 

[3] => https://scrapeme.live/shop/page/46/ 

[4] => https://scrapeme.live/shop/page/47/ 

[5] => https://scrapeme.live/shop/page/50/ 

)

لاحظ أن جميع العناوين تمتلك هيكلاً متماثلاً. أي أنها جميعاً مُعلمة برقم نهائي مسؤول عن الصفحات. إذا كان القراء يعتزمون التكرار عبر كل منها، فإن الشيء الوحيد الذي يحتاجونه هو الرقم التعريفي المرتبط بالصفحة النهائية.

يمكن استرجاعه كما هو موضح أدناه:

// إزالة جميع الأحرف غير الرقمية في العنصر الأخير من 

// مصفوفة $paginationLinks لاسترجاع أعلى رقم للصفحات 

$highestPaginationNumber = preg_replace("/\D/", "", end($paginationLinks));

لنقل أن $highestPaginationNumber لدينا سيكون "50".

لذا، حان الوقت لجمع المعلومات التي تصف منتجاً فردياً مع فريق Dexodata. نحتاج إلى النقر بزر الماوس الأيمن على عنصر وتفعيل نافذة أدوات المطور، متبوعة بـ "فحص". يمكن للمرء أن يتوقع أن العنصر سيكون “مكوناً من” عنصر HTML li.product يحتوي على رابط، وصورة، وعنوان، وسعر. مثل هذه المعلومات تأتي من مكونات HTML a، ثم mg، ثم h2، ثم span، على التوالي.

يقترح موقع Dexodata البروكسي الموثوق هذه الطريقة لجمع هذه المعلومات عبر HtmlDomParser:

$productDataLit = array(); 

// استرجاع قائمة المنتجات على الصفحة 

$productElements = $htmlDomParser->find("li.product"); 

foreach ($productElements as $productElement) { 

// استخراج بيانات المنتج 

$url = $productElement->findOne("a")->getAttribute("href"); 

$image = $productElement->findOne("img")->getAttribute("src"); 

$name = $productElement->findOne("h2")->text; 

$price = $productElement->findOne(".price span")->text; 

// تحويل بيانات المنتج إلى مصفوفة مرتبطة 

$productData = array( 

"url" => $url, 

"image" => $image, 

"name" => $name, 

"price" => $price 

); 

$productDataList[] = $productData; 

}

بمجرد أن ينجح منطقنا في جمع جميع أجزاء معلومات العنصر من صفحة واحدة، ويحفظها لاحقاً كمصفوفة $productDataList. طبق هذا المنطق على كل صفحة.

// التكرار عبر جميع صفحات "/shop/page/X" واسترجاع جميع بيانات المنتجات 

for ($paginationNumber = 1; $paginationNumber <= $highestPaginationNumber; $paginationNumber++) { 

$curl = curl_init(); 

curl_setopt($curl, CURLOPT_URL, "https://scrapeme.live/shop/page/$paginationNumber/"); 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 

$pageHtml = curl_exec($curl); 

curl_close($curl); 

$paginationHtmlDomParser = HtmlDomParser::str_get_html($pageHtml); 

// منطق جمع البيانات... 

}

رائع! لقد وصلنا إلى الوضع الذي يمكننا فيه استخراج البيانات كما هو مخطط.

 

ملاحظات نهائية 

 

تشغيل نظام من البروكسيات المستهدفة جغرافياً، نود إنهاء هذا الدليل ببعض الملاحظات. حاول تجنب أن يتم اكتشافك وتقييدك كجامع بيانات. لذلك، نذكرك بالبروكسيات التي ذكرناها بالفعل.

إليك تذكير آخر حول كيفية إضافة معرفات البروكسي الخاصة بك:

curl_setopt($curl, CURLOPT_PROXY, "<PROXY_URL>"); 

curl_setopt($curl, CURLOPT_PROXYPORT, "<PROXY_PORT>"); 

curl_setopt($curl, CURLOPT_PROXYTYPE, "<PROXY_TYPE>");

1. يمكن أن تشكل طبقة إضافية من الحماية بواسطة رأس HTTP user-agent. حسب التعريف، cURL سيقوم دائماً بتعيين شيء مثل curl/XX.YY.ZZ. لن يكون من الصعب القبض على مستخدم بمثل هذا الرأس. بدلاً من ذلك، حاول “اللعب” مع الرأس هنا.

curl_setopt($curl, CURLOPT_USERAGENT, "<USER_AGENT_STRING>");

نتيجة لذلك، ستضع شيئاً مثل هذا، مثال تم العثور عليه على الإنترنت:

curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")

2. ملاحظة أخرى من Dexodata تركز على المحتوى الديناميكي. لقد أكدنا أن استعلام GET cURL المعتاد لن يساعدك في ذلك، ستتطلب تقنيات أكثر تقدماً. عد إلى الدليل المخصص لـ JS وتعلم المزيد عن المتصفحات بدون واجهة المستخدم، أي حزم برامج تصفح بدون واجهة مستخدم. سيساعدك ذلك في بناء جامع بيانات يتفاعل مع وجود ما مثل مستخدم حقيقي ويستخرج المحتوى الديناميكي في الوقت نفسه.

3. ملاحظتنا الثالثة مخصصة لجمع البيانات المتوازي. يعد تعدد الخيوط في PHP تحدياً ولكنه أحياناً لا مفر منه. إليك كيفية التعامل مع هذا التحدي مع موقع Dexodata البروكسي الموثوق. مفهومنا هو تمكين سكربت جمع البيانات الخاص بك من التنفيذ على عدة مثيلات من خلال تطبيق HTTP GET المعلمات.

قم بتعديل السكربت بحيث لا يتكرر عبر جميع الصفحات وركز بدلاً من ذلك على قطع أصغر متوازية. إليك كيفية تعديل السكربت وتعيين حدود “القطعة”. ببساطة قم بتعيين بعض معلمات GET، تماماً كما هو موضح أدناه:

$from = null; 

$to = null; 

 

if (isset($_GET["from"]) && is_numeric($_GET["from"])) { 

$from = $_GET["from"]; 

if (isset($_GET["to"]) && is_numeric($_GET["to"])) { 

$to = $_GET["to"]; 

if (is_null($from) || is_null($to) || $from > $to) { 

die("معلمات من وإلى غير صالحة!"); 

// جمع فقط الصفحات المتعلقة بالصفحات التي رقمها 

// من "$from" إلى "$to" 

for ($paginationNumber = $from; $paginationNumber <= $to; $paginationNumber++) { 

// منطق جمع البيانات... 

}

// كتابة البيانات المجمعة إلى قاعدة بيانات/ملف

هذا سيجعلك جاهزاً لبدء عدة مثيلات عن طريق تفعيل عدة روابط في المتصفح:

https://instance.com/scripts/scrapeme.live/scrape-products.php?from=1&to=5 

وما شابه.

سيتم تنفيذها بالتوازي وجمع المحتوى في وقت واحد. هذا كل شيء. شكراً لك على البقاء مع Dexodata، نظامك الأخلاقي من البروكسيات السكنية، ومراكز البيانات، والمحمولة مع تطبيق جميع معايير KYC وAML.

Back

نحن نسهل ملفات تعريف الارتباط، قراءة المزيد حولسياسة ملفات تعريف الارتباط