فهم ترقيم الصفحات المستند إلى JavaScript وتحديات واجهة برمجة التطبيقات
يمكن لمواقع الويب التي تحتوي على ترقيم صفحات يستند إلى JavaScript أن تجعل من الصعب على الزائرين التنقل عبر المواد، خاصة إذا كانت عناصر التحكم في ترقيم الصفحات لا تكشف عن أي معلمات لعنوان URL. وهذا يجعل من المستحيل تعديل التنقل بين الصفحات أو تشغيله تلقائيًا باستخدام الطرق التقليدية مثل تغيير استعلامات URL. من الممكن التعامل مع أجهزة الاستدعاء هذه عبر طرق مختلفة.
تحدث إحدى هذه المشكلات عند محاولة استرداد الروابط أو البيانات من هذه الأنواع من مواقع الويب. إذا لم تتمكن من التنقل يدويًا بين مئات الصفحات، فالأسلوب الأفضل هو محاكاة أحداث النقر على جهاز النداء JavaScript. تعمل هذه التقنية على أتمتة إجراءات التنقل، مما يبسط بشكل كبير واجبات جمع البيانات.
في بعض الحالات، قد تعرض علامة التبويب "الشبكة" في أدوات المطور بالمتصفح نقاط نهاية واجهة برمجة التطبيقات التي توفر معلومات مفيدة. ومع ذلك، قد يؤدي التعامل مباشرة مع نقاط النهاية هذه إلى حدوث مشكلات في بعض الأحيان لأنها قد لا تسمح بطرق HTTP معينة، مثل طلبات GET، والتي تُستخدم بشكل شائع لاسترداد البيانات.
تشرح هذه المقالة كيفية محاكاة أحداث النقر على جهاز استدعاء جافا سكريبت الخاص بموقع الويب وكيفية التعامل مع قيود واجهة برمجة التطبيقات (API) التي تقيد الوصول المباشر إلى البيانات التي تحتاجها. سننظر أيضًا في طرق للتغلب على القيود المفروضة على طرق واجهة برمجة التطبيقات (API) المحددة لضمان قيامك بجمع كافة المعلومات المهمة بشكل فعال.
يأمر | مثال للاستخدام |
---|---|
document.querySelector() | تُستخدم هذه الطريقة لتحديد العنصر الأول الذي يطابق محدد CSS محددًا. يستخدمه البرنامج النصي لاختيار حاوية ترقيم الصفحات (const pagerContainer = document.querySelector('.pagination')) والتحكم في أزرار النداء. |
Array.from() | يحول كائنًا يشبه المصفوفة أو كائنًا قابلاً للتكرار إلى مصفوفة مناسبة. يقوم البرنامج النصي بتحويل NodeList من روابط الإعلانات إلى مصفوفة لتسهيل المعالجة ورسم الخرائط (Array.from(document.querySelectorAll('.ad-link-selector')). |
puppeteer.launch() | عند استخدامه مع محرك الدمى، يقوم هذا الأمر بتشغيل مثيل جديد للمتصفح بدون رأس. وهو يدعم إجراءات المتصفح الآلية مثل التنقل بين الصفحات ومحاكاة تفاعلات المستخدم (متصفح const = انتظار puppeteer.launch()). |
page.evaluate() | In Puppeteer, this method allows you to run JavaScript code in the context of the web page you are controlling. It is used here to extract ad links from the DOM (await page.evaluate(() =>في Puppeteer، تسمح لك هذه الطريقة بتشغيل كود JavaScript في سياق صفحة الويب التي تتحكم فيها. يتم استخدامه هنا لاستخراج روابط الإعلانات من DOM (في انتظار الصفحة. تقييم (() => {...})). |
page.waitForSelector() | ينتظر ظهور محدد محدد على الصفحة قبل المتابعة، مما يضمن تحميل جميع العناصر الديناميكية. وهذا مهم بشكل خاص عند تصفح المحتوى المرقّم، حيث تظهر إعلانات جديدة مع كل تغيير في الصفحة (await page.waitForSelector('.ad-link-selector'). |
axios.post() | يرسل طلب HTTP POST إلى عنوان URL المقدم. يحاول النموذج تجنب المشكلة 405 عن طريق الحصول على البيانات عبر POST بدلاً من GET (استجابة const = انتظار axios.post()). |
console.error() | يستخدم لكتابة رسائل الخطأ إلى وحدة التحكم. يساعد في تصحيح الأخطاء عن طريق عرض معلومات الخطأ عند فشل عناصر معينة أو طلبات واجهة برمجة التطبيقات (console.error('لم يتم العثور على زر الصفحة!'). |
$() | اختصار لاختيار العناصر في Puppeteer، يشبه document.querySelector(). يستخدم هذا البرنامج النصي زر "الصفحة التالية" لإنشاء حدث النقر على ترقيم الصفحات (const nextButton = انتظار الصفحة.$('.pagination-next'). |
click() | يقوم هذا الأسلوب بتكرار النقر على عنصر HTML. في البرامج النصية، يتم استخدامه للتنقل في جهاز النداء برمجيًا عن طريق النقر على زر الصفحة المناسب. |
إتقان ترقيم الصفحات المستند إلى JavaScript والتنقل عبر واجهة برمجة التطبيقات (API).
يستخدم البرنامج النصي الأول الذي تم تقديمه JavaScript خالصًا لاستكشاف الصفحة ديناميكيًا باستخدام ترقيم الصفحات المستند إلى JavaScript. الفكرة الأساسية وراء هذه الطريقة هي تقليد المستخدم الذي يضغط على أزرار النداء عن طريق اختيار وتنشيط أحداث النقر على عناصر HTML المناسبة. من خلال تحديد حاوية ترقيم الصفحات باستخدام الأمر، يمكننا الوصول إلى أزرار الصفحة المختلفة وأتمتة التنقل. يعد هذا الأسلوب مثاليًا للحالات التي لا يكون فيها تغيير عنوان URL يدويًا خيارًا وتحتاج إلى واجهة أمامية سريعة للتعامل مع آلية ترقيم الصفحات.
في النص الثاني، استخدمنا Puppeteer، وهي حزمة Node.js للتحكم في متصفح بدون رأس. لا يحاكي هذا البرنامج النصي ضغطات زر النداء فحسب، بل يعمل أيضًا على أتمتة عملية التنقل بأكملها عبر العديد من الصفحات، وجمع كل روابط الإعلانات مع كل تكرار. يتيح لك Puppeteer استخراج المحتوى الذي تم تحميله ديناميكيًا من خلال التفاعل مباشرة مع عناصر DOM، تمامًا كما يفعل المستخدم الحقيقي. أحد المكونات الرئيسية هنا هو ، والذي يسمح بتنفيذ كود JavaScript داخل سياق الصفحة. يعد هذا مثاليًا لجمع البيانات مثل روابط الإعلانات عبر الصفحات المقسمة إلى صفحات.
يتطلب كلا البرنامجين معالجة الأخطاء للتأكد من أن العملية الآلية تعمل بشكل جيد حتى في حالة فقدان أجزاء معينة أو تصرف واجهة برمجة التطبيقات (API) بشكل غير متوقع. على سبيل المثال، يسجل أي أخطاء تمت مواجهتها أثناء التنفيذ، مثل عدم العثور على زر مستهدف في الصفحة. بالإضافة إلى ذلك، محرك الدمى يضمن الأمر تحميل المكونات الديناميكية، مثل روابط الإعلانات، بالكامل قبل أن يحاول البرنامج النصي التفاعل. وهذا يجعله مفيدًا للغاية عند العمل مع مواقع الويب التي تعتمد بشكل كبير على JavaScript لعرض المحتوى، حيث إنه يتجنب المشكلات الناجمة عن عمليات تحميل الصفحات المفقودة أو غير الكاملة.
يستخدم النص البرمجي النهائي Axios، وهو عميل Node.js HTTP يعتمد على الوعود، على الواجهة الخلفية. نحاول هنا جلب البيانات مباشرةً من نقطة نهاية API، والتي وفقًا لخطأ HTTP 405، لا تقبل الاستعلامات. لتجنب ذلك، يرسل البرنامج النصي ملف الطلب، والذي قد تتم الموافقة عليه من قبل الخادم. تعد هذه الطريقة أكثر ملاءمة للمستخدمين الذين يرغبون في استخراج البيانات دون الحاجة إلى التنقل في الواجهة الأمامية، ولكنها تتضمن فهم بنية وسلوك واجهة برمجة التطبيقات (API) الخاصة بالخادم. تضمن معالجة الأخطاء الإبلاغ عن أي فشل في طلب واجهة برمجة التطبيقات (API)، مما يسهل استكشاف أخطاء استرداد البيانات من جانب الخادم وإصلاحها.
الحل 1: محاكاة النقرات على جهاز استدعاء جافا سكريبت باستخدام Vanilla JavaScript
يستخدم هذا الأسلوب JavaScript الفانيليا لتشغيل حدث النقر على أزرار النداء برمجيًا عن طريق تحديد عناصر DOM المناسبة. يمكن تطبيق ذلك على أي سيناريو أمامي ديناميكي يتم فيه عرض العناصر باستخدام JavaScript.
// Select the pagination container
const pagerContainer = document.querySelector('.pagination');
// Function to trigger a click event on a pager button
function clickPageButton(pageNumber) {
const buttons = pagerContainer.querySelectorAll('button');
const targetButton = [...buttons].find(btn => btn.textContent === String(pageNumber));
if (targetButton) {
targetButton.click();
} else {
console.error('Page button not found!');
}
}
// Example usage: clicking the 2nd page button
clickPageButton(2);
الحل 2: استخدام محرك الدمى لأتمتة التنقل عبر جهاز النداء وتجريد الإعلانات.
يتم استخدام Puppeteer، وهي أداة Node.js التي توفر واجهة برمجة تطبيقات عالية المستوى لتشغيل متصفح بدون رأس، بهذه الطريقة للتنقل في جهاز النداء JavaScript وجمع الروابط من جميع الإعلانات. إنه حل خلفي يتم استخدامه بشكل متكرر لمهام الكشط الآلية.
const puppeteer = require('puppeteer');
// Function to scrape all ad links from a paginated website
async function scrapeAds() {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.supralift.com/uk/itemsearch/results');
let ads = [];
let hasNextPage = true;
while (hasNextPage) {
// Scrape the ad links from the current page
const links = await page.evaluate(() => {
return Array.from(document.querySelectorAll('.ad-link-selector')).map(a => a.href);
});
ads.push(...links);
// Try to click the next page button
const nextButton = await page.$('.pagination-next');
if (nextButton) {
await nextButton.click();
await page.waitForSelector('.ad-link-selector');
} else {
hasNextPage = false;
}
}
await browser.close();
return ads;
}
// Call the scraping function and log results
scrapeAds().then(ads => console.log(ads));
الحل 3: جلب البيانات من واجهة برمجة التطبيقات (API) باستخدام Axios في Node.js
تركز هذه الطريقة على استخدام Axios في Node.js لاسترداد البيانات مباشرة من واجهة برمجة التطبيقات. يشير الخطأ 405 إلى أن طريقة GET غير مسموح بها، وبالتالي تستخدم هذه الإستراتيجية POST أو رؤوس أخرى للتحايل على التقييد. يعد هذا مناسبًا لسيناريو الواجهة الخلفية الذي تتطلب فيه تفاعلات واجهة برمجة التطبيقات (API).
const axios = require('axios');
// Function to fetch data from the API using POST instead of GET
async function fetchData() {
try {
const response = await axios.post('https://www.supralift.com/api/search/item/summary', {
headers: {
'Content-Type': 'application/json'
},
data: { /* Add necessary POST body if applicable */ }
});
console.log(response.data);
} catch (error) {
console.error('Error fetching data:', error.response ? error.response.data : error.message);
}
}
// Invoke the fetchData function
fetchData();
تحسين ترقيم الصفحات في جافا سكريبت لتخريب الويب وجمع البيانات
عند استكشاف مواقع الويب باستخدام نظام ترقيم الصفحات المستند إلى JavaScript، من المهم التحقق من عدة طرق لاستخراج البيانات بسرعة. أحد الخيارات التي يتم تجاهلها أحيانًا هو اعتراض طلبات الشبكة الصادرة عن آلية ترقيم الصفحات. من خلال مراجعة الاستعلامات التي يتم إجراؤها بعناية في أدوات المطور بالمتصفح، ولا سيما علامة التبويب "الشبكة"، يمكنك تحديد نقاط النهاية المستخدمة لجلب البيانات لكل صفحة. يمكن استخدام الأنظمة المستندة إلى JavaScript أو طلبات تحميل البيانات ديناميكيًا دون تغيير عنوان URL، على عكس ترقيم الصفحات التقليدي الذي يتطلب تغيير معلمات عنوان URL.
ولاستخراج الروابط أو البيانات من هذه المواقع، قم باعتراض الطلبات واسترجاع البيانات التي تعود بها. يتيح لك محرك الدمى والأدوات الأخرى مراقبة حركة مرور الشبكة وجمع البيانات المفيدة. عندما لا تكون هذه الإستراتيجية قابلة للتنفيذ بسبب القيود من جانب الخادم، يصبح فهم سلوك واجهة برمجة التطبيقات أمرًا بالغ الأهمية. بعض واجهات برمجة التطبيقات، مثل ، قد يحظر طرقًا معينة مثل والسماح فقط الاستعلامات. يعد تكييف استعلاماتك لتتوافق مع الطريقة المقصودة لواجهة برمجة التطبيقات (API) حلاً فعالاً لهذه القيود.
أخيرًا، أثناء استخراج البيانات المرقّمة، من المهم السماح بفترات توقف مناسبة بين الطلبات. تستخدم العديد من مواقع الويب خوارزميات تحديد المعدل لمنع إساءة الاستخدام، وقد يؤدي إرسال عدد كبير جدًا من الطلبات في تتابع سريع إلى إدراج عنوان IP الخاص بك في القائمة السوداء مؤقتًا. لتجنب الكشف وضمان استخراج البيانات بنجاح، قم بتضمين تأخير عشوائي بين الاستعلامات أو تحديد عدد الطلبات المتزامنة. باستخدام أدوات مثل في Node.js والتعامل مع المعدل المناسب هو أسلوب رائع لتحقيق ذلك.
- ما هو ترقيم الصفحات المستند إلى جافا سكريبت؟
- يعد ترقيم الصفحات المستند إلى JavaScript طريقة تستخدم فيها أزرار ترقيم الصفحات JavaScript لتحميل المواد الجديدة ديناميكيًا، دون تغيير عنوان URL في كثير من الأحيان.
- كيف يمكنني استخراج البيانات من موقع ويب مرقّم بصفحات جافا سكريبت؟
- يمكنك استخدام أدوات مثل أو لأتمتة النقرات على زر ترقيم الصفحات أو التقاط طلبات الشبكة أثناء ترقيم الصفحات.
- لماذا تعرض واجهة برمجة التطبيقات (API) خطأ 405 "طريقة غير مسموح بها"؟
- يحدث هذا لأن واجهة برمجة التطبيقات (API) تدعم طرق HTTP معينة فقط. على سبيل المثال، قد يمنع طلبات في حين السماح طلبات.
- هل يمكنني تعديل عنوان URL للتنقل بين الصفحات؟
- في الصفحات المستندة إلى JavaScript، لا يمكنك في كثير من الأحيان تغيير عنوان URL مباشرةً. للتنقل، ستحتاج إلى تشغيل أحداث JavaScript أو استخدام نقاط نهاية API.
- ما الأدوات التي يمكنني استخدامها لاستخراج البيانات المرقّمة؟
- وتشمل برامج القشط الشعبية لأتمتة المتصفح و لطلبات HTTP. كلاهما يتعامل مع المحتوى المرقّم بكفاءة.
يتطلب العمل مع ترقيم الصفحات المستند إلى JavaScript مجموعة من حلول الواجهة الأمامية والخلفية. سواء كنت تستخدم Puppeteer لأتمتة أنشطة المتصفح أو Axios للتفاعل مباشرة مع نقاط نهاية API، فإن عملية الاستخلاص الفعالة تتطلب تصميمًا وتنفيذًا دقيقًا.
يتيح لك فهم كيفية تحميل موقع الويب للبيانات ومعالجتها كتابة نصوص برمجية فعالة لاستخراج المعلومات الضرورية. لتجنب المخاطر المتكررة مثل الخطأ 405، احرص على مراقبة حركة مرور الشبكة وإدارة حدود المعدل واستخدام أساليب HTTP المناسبة.
- تمت الإشارة إلى معلومات تفصيلية حول استخدام محرك الدمى لتجريد الويب من الوثائق الرسمية لمحرك الدمى. توثيق الدمى
- تم اشتقاق شرح أساليب HTTP ومعالجة طلب واجهة برمجة التطبيقات (API)، وتحديدًا حول الخطأ 405 "الطريقة غير مسموح بها"، من مستندات ويب MDN .
- تم الحصول على رؤى حول Axios لتقديم طلبات HTTP في Node.js من المسؤول توثيق اكسيوس .
- بالنسبة لمعالجة JavaScript DOM وأحداث مثل click()، تمت الإشارة إلى المحتوى من ملف مستندات ويب MDN .