cheerio استغرق 2.9 ثانية على صفحة بحجم 10 ميغابايت في Node

آخر تحديث في August 19, 2026
cheerio استغرق 2.9 ثانية على صفحة بحجم 10 ميغابايت في Node
ملخص الذكاء الاصطناعي
على جهاز واحد، قام cheerio في Node بتحليل مستند HTML اصطناعي بحجم 10 ميغابايت واستخراج العناوين وروابط href خلال 2,927.89 مللي ثانية. أما selectolax، الذي يعمل عبر CPython مع محلّل مدعوم بـ C، فأكمل استخراج الحقول نفسها خلال 158 مللي ثانية. وتطابقت نتائج ترتيب نص العناوين وبصمات href. هذا اختبار مقارنة شامل بين الأطر التنفيذية من البداية للنهاية، وليس حكماً معزولاً على خوارزمية التحليل نفسها. على صفحة بحجم 10 كيلوبايت، الفارق هو 2×، ولن يلحظه أحد. السؤال الحقيقي هو: أين تقع صفحاتك على هذا المنحنى؟ استخدم cheerio إذا كنت تعمل في Node، وكانت واجهة الاستخدام على نمط jQuery مهمة لك، وكانت صفحاتك النموذجية شبيهة بالأحجام المختبرة حتى 1 MB.

على جهاز واحد، قام cheerio في Node بتحليل مستند HTML اصطناعي بحجم 10 ميغابايت واستخراج العناوين وروابط href منه في 2,927.89 ms. أما selectolax، الذي يعمل عبر CPython مع محلّل مدعوم بـ C، فأكمل استخراج الحقول نفسها في 158 ms. وقد تطابقت قيم العناوين المرتبة وهاشات href. هذا اختبار مقارنة شامل عبر طبقات التشغيل، وليس حكماً معزولاً على خوارزمية محلّل بعينها.

في صفحة بحجم 10 كيلوبايت، الفارق لا يتجاوز 2×، ولن يلاحظه أحد. والسؤال الحقيقي هو: أين تقع صفحاتك على هذا المنحنى؟

ما هو cheerio

cheerio هو محلّل HTML بصياغة jQuery مخصص لـ Node، وهو الخيار الافتراضي في هذا النظام البيئي لسبب وجيه: 30,449 نجمة على GitHub، ورخصة MIT، وتحديث للمستودع في اليوم السابق مباشرةً لتشغيل هذا الاختبار. الإصدار المختبَر: 1.2.0.

المرجع الرسمي: مقدمة cheerio الرسمية.

import * as cheerio from "cheerio";
const $ = cheerio.load(html);
const titles = $("h3.title").map((_, e) => $(e).text()).get();
const hrefs = $("a").map((_, e) => $(e).attr("href")).get();

إذا سبق لك استخدام jQuery، فأنت تعرف واجهة الاستخدام بالفعل. وهذه الألفة هي أحد أهم أسباب انتشاره داخل نظامه البيئي.

تحت الغطاء، لا يعتمد على محلّل واحد بل على طبقة كاملة: htmlparser2 وparse5 للتحليل، وdomhandler وdomutils لبناء الشجرة، وcheerio-select لانتقاء العناصر، إضافة إلى undici وencoding-sniffer وغيرها — 11 تبعية مباشرة، تتحول إلى 22 حزمة من المستوى الأعلى وتشغل 9.0 ميغابايت على القرص. هذه الحزم توفر قدرات التحليل والترميز، كما أنها تضيف إلى بصمة الاعتمادات. هذا التقييم اختبر مخرجات المدخلات المشوهة، لكنه لم يختبر صحة الترميز ولم يفصل بين أي من محركي التحليل.

المنهجية ولماذا يمكن الوثوق بها

كانت قاعدة القياس هذه تحتوي بالفعل على اختبار أداء للمحللات: خمسة أحجام صفحات من 1 كيلوبايت إلى 10 ميغابايت، 50 تكراراً، وثلاث تشغيلات مستقلة، والأهم — بوابة تكافؤ تعتمد على هاش للمحتوى المستخرج، أي العناوين المرتبة مع روابط href المرتبة، مقارنةً بمحلّل مرجعي. أي محلّل يتخطى العمل بصمت لا يمكنه أن يقدّم زمناً سريعاً.

إضافة cheerio إلى هذه المنظومة احتاجت إلى فحصين قبل اعتماد أي رقم.

هل بقيت النتيجة المرجعية كما كانت؟ تم تشغيل selectolax مرة أخرى في الجلسة نفسها وعلى العينات نفسها. وقد أعاد إنتاج هاش المحتوى في 5 من 5 أحجام، وجاء متوسطه الوسيط p50 بين 0.989× و1.079× من الرقم المنشور. هذا يعني أننا على نفس الجهاز الذي أنتج الجدول الأصلي.

هل أنتج cheerio الحقول نفسها المقاسة؟ نعم، فقد تطابق هاش المحتوى — المحسوب في Node بالقيد ذاته، SHA-256 فوق نصوص العناوين المرتبة وروابط href المرتبة — مع المرجع في 5 من 5 أحجام. وهذا يثبت التكافؤ لهذه الحقول المرتبة على هذه العينات، وليس شكل DOM، أو ترتيب المستند، أو السمات، أو تطبيع النص، أو آلية الاستعادة من الأخطاء.

عندها فقط تصبح الأزمنة ذات معنى.

حجم الصفحةselectolaxlxmlPyQuerycheerio (Node)cheerio مقابل selectolax
1 KB0.0286 ms0.05080.04560.1147 ms4.0×
10 KB0.1725 ms0.18020.17280.3490 ms2.0×
100 KB1.4855 ms1.41451.40933.8399 ms2.6×
1 MB14.97 ms15.0314.9659.37 ms4.0×
10 MB158.10 ms165.25162.862,927.89 ms18.5×

p50 بالمللي ثانية، وهو الوسيط لثلاث تشغيلات. parser-bench.json. عملت محلات Python الثلاثة داخل عملية واحدة؛ أما cheerio فعمل داخل Node 22، وهذا حدٌّ خاص ببيئة التشغيل بقدر ما هو حدٌّ خاص بالمكتبة — انظر أدناه.

قراءة الجدول بصدق

Measured results chart: Parser time across page sizes

صف 1 KB مجرد ضجيج قياس. عبر محللات Python الثلاثة، بلغ التفاوت عند هذا الحجم 77.6%، كما أن التشغيلات الفردية تداخلت بشكل كبير — فقد تراوح selectolax بين 0.0267 و0.0404 ms عبر تشغيلاته الثلاثة. عند 28 ميكروثانية، تصبح دقة المؤقت والجدولة العاملين المسيطرين. لن أرتب أي أداة عند 1 KB، بما في ذلك cheerio.

منتصف الجدول لا يثير الدهشة. من 2× إلى 4× على الصفحات بين 10 KB و1 MB. بالنسبة لمستخرج يعالج بضع مئات من الصفحات، فهذا يعني 45 مللي ثانية للصفحة بدلاً من 15، ولن تلاحظ ذلك.

صف 10 MB ليس ضجيجاً. جاءت تشغيلات cheerio الثلاث عند 2,839 و2,928 و2,954 ms — متقاربة، وبعيدة بوضوح عن الصفوف الصغيرة. النتيجة الشاملة عند 10 MB تنحرف بوضوح عن النمط الخاص بالأحجام الأصغر. خمسة نقاط حجم لا تكفي لإثبات التعقيد التقاربي أو لتحديد الطبقة المسؤولة عن القفزة: هل هي زمن التشغيل، أو المحلل، أو المنتقيات، أو التخصيصات، أو جمع القمامة.

وتقع ضمن نطاق BeautifulSoup. القياس المنشور شمل أربعة محللات إضافية على نفس عينة 10 MB، ووضع رقم cheerio البالغ 2,927.89 ms إلى جانبها هو الأكثر فائدة في هذا المقال:

المحلل (10 MB)p50
selectolax (lexbor)159.93 ms
lxml172.93 ms
parsel231.85 ms
selectolax (modest)247.95 ms
BeautifulSoup + lxml2,261.56 ms
BeautifulSoup + html.parser2,788.75 ms
cheerio2,927.89 ms

الصفوف الأربعة الخاصة بـ Python مأخوذة من bench_parse.json المنشور؛ أما cheerio فمن هذا التشغيل. وقد أعاد المحلل المرجعي إنتاج النتائج بين التشغيلين ضمن 0.989×–1.079×، لذا اعتبر الفروقات الأصغر من نحو 8% ضمن هذا الهامش من عدم اليقين — cheerio مقابل محرك html.parser في BeautifulSoup (فارق 5%) ضمن هذا الهامش، بينما cheerio مقابل selectolax (18×) ليس كذلك.

BeautifulSoup هي المكتبة التي يلجأ إليها الناس عندما يريدون الراحة مع قبولهم أنها بطيئة — وهي المكتبة التي تنصحك كل نقاشات الأداء في Python باستبدالها. على مستند بحجم 10 MB، يقف cheerio في قاع النطاق نفسه، وليس في نطاق المحللات المدعومة بـ C التي يُصنَّف عادةً معها.

أما سؤال البديل داخل Node فما يزال مفتوحاً في هذا المقال. لم يتم اختبار بدائل Node الأحدث، لذلك لا يمكن لهذه النتيجة أن تقول إن تبديل المكتبة مستحيل أو أن تستبعدها باعتبارها أقل نضجاً. كل ما تثبته هو المسار المقاس لـ cheerio مقابل المكدسات Python المذكورة.

كما أنه مقارنة بين بيئات تشغيل، لا بين مكتبة فقط. أزمنة cheerio بالمللي ثانية تأتي من JIT وذاكرة القمامة في Node؛ أما الأرقام الأخرى فتأتي من CPython وهو يستدعي محللات مدعومة بـ C. هاش المحتوى يثبت أن العمل نفسه تم، وكلا الرقمين يمثلان ما يختبره المطور فعلياً عند اختيار المكدس — لكن لا ينبغي لأحد أن يقرأ هذا على أنه "خوارزمية cheerio أسوأ من selectolax بـ18×". هذا ما حدث على هذا الجهاز، داخل بيئة التشغيل الطبيعية لكل مكتبة.

واقع الإعداد

المكتبةالحزمالحجم على القرصالرخصةالنجومآخر تحديث
cheerio22 (npm)9.0 MiBMIT30,4492026-08-11
PyQuery3 (pip)20.1 MiBBSD2,3802026-07-27

المرجع الرسمي: وثائق إعداد cheerio.

metadata-snapshot.json، تم جلبه يوم الكتابة.

استغرق npm install cheerio أقل من ثانيتين وجلب 9.0 ميغابايت. أما التحميل البارد فتم قياسه عند 0.056 ثانية في تشغيل تحويل منفصل على الجهاز نفسه.

وجود 11 تبعية مباشرة كثير بالنسبة لمحلّل، ومن المفيد معرفته إذا كنت تراجع شجرة الاعتمادات لديك: htmlparser2 وparse5 وparse5-htmlparser2-tree-adapter وparse5-parser-stream وdomhandler وdomutils وdom-serializer وcheerio-select وencoding-sniffer وundici وwhatwg-mimetype. هناك محركان كاملان للتحليل داخل الحزمة، لأن cheerio يمكنه استخدام أيٍّ منهما بحسب ما تطلبه.

وثلاثون ألف نجمة وتحديث في اليوم السابق للاختبار هي من أقوى إشارات الصيانة التي يمكن أن تراها في هذه الفئة.

الذاكرة، وماذا يفعل HTML المكسور بها

بصمة الذاكرة وسلوك المدخلات المشوهة يؤثران في النشر والتعامل مع الأعطال، لذا تم قياسهما هنا بشكل منفصل.

السياق الأوسع لاختبار الضغط موجود في مقارنة الذاكرة وHTML المشوَّه عبر عشرة مكتبات.

الذروة في الذاكرة المقيمة عبر /usr/bin/time -l، مع عملية جديدة لكل خلية — أرضية الاستيراد هي تكلفة تحميل المكتبة وهي خاملة، أما القمم فتشمل المستند نفسه.

المكتبةالبيئةأرضية الاستيرادذروة 226 KBذروة 10 MB
html2textpython3.1418.719.971.2
pyquerypython3.1430.333.9172.5
resiliparsepython3.1420.525.1225.1
markdownifypython3.1423.928.9278.5
goose3python3.1444.152.4398.5
cheerionode2266.876.5398.5
justextpython3.1430.336.6431.2
newspaper4kpython3.1452.661.8668.5
trafilaturapython3.1452.564.8927.1
turndownnode2247.868.42947.1

memory-results.json. لا يمكن مقارنة خطوط الأساس بين Python وNode مباشرة؛ فالمفسّر موجود داخل كليهما.

يمتلك cheerio أعلى أرضية استيراد في هذا الجدول المختلط عند 66.8 MiB، شاملاً Node واعتماداته. وقد بلغت العملية ذروتها عند 398.5 MiB في عينة 10 MB. أما الصفوف الأخرى فتضم محللات ومحولات ومستخرجات مقالات تقوم بأعمال رئيسية مختلفة، لذا ينبغي استخدامها كسياق لبصمة العملية لا كترتيب أداء بين الأقران. صف turndown في نفس البيئة بلغ ذروة أعلى بكثير، لكنه ينفذ تحويلًا لا عقدة اختيار العناوين والروابط المقاسة هنا لـ cheerio.

HTML المشوَّه. اثنا عشر مستنداً، كل واحد منها يكسر شيئاً واحداً فقط — وسوم غير مغلقة، عناصر داخلية غير متداخلة بشكل صحيح، سمات غير مقتبسة تحتوي على مسافات، واصفات إغلاق شاردة، غياب كامل لـ <html>, سمات مكررة، مستند مقطوع في منتصف الوسم، كيانات معطوبة، <script> غير مغلق، تعريف ترميز كاذب، تعليق يحتوي على ترميز، و600 مستوى من التعشيش — بالإضافة إلى عينتين سليمتين تماماً بالحجم نفسه، لأن "أعاد لا شيء" لا يقول شيئاً عن التشوه إذا كانت المكتبة صامتة أيضاً على مستند سليم بالحجم ذاته.

لم يُصدر cheerio استثناءً في 0 من 14 حالة، ولم يُعد لا شيء في 0، ونجح في استعادة 11/22 من العلامات المقاسة عبر العينات المشوهة (malformed-results.json). بالنسبة للمحللات، يفحص المقيم علامات العناوين والروابط عبر أحد عشر مستنداً مشوهاً قابلاً للتقييم؛ ولا يحتسب علامة الفقرة، كما أن عينة <script> غير المغلقة مستثناة. ومن دون خط أساس لنفس العقد في هذا القسم، لا يمثل 11/22 ترتيباً للجودة. والاستنتاج المدعوم هو أن cheerio أعاد مخرجات غير فارغة من دون استثناء في جميع المدخلات الأربعة عشر المشوهة والسليمة، مع استعادة نصف العلامات المقاسة.

الإيجابيات والسلبيات

ما يميزه. صياغة jQuery مألوفة. MIT. إشارة صيانة مؤرشفة: 30,449 نجمة ونشاط في المستودع في اليوم السابق للاختبار. هناك محركا تحليل وحزم مرتبطة بالترميز، رغم أن الاستعادة بين المحركات ودقة الترميز لم تُعزل هنا. كما أن هاش العناوين + href المرتبة تطابق المرجع في كل حجم عينة.

ما يؤخذ عليه. أبطأ بـ 18.5× من selectolax على مستند 10 MB، وبـ 4× على 1 MB. 11 تبعية مباشرة، بما في ذلك تطبيقان كاملان للتحليل. خاص بـ Node فقط. ولا شيء في توثيقه يشير إلى حجم يصبح بعده الخيار غير واضح.

من ينبغي أن يستخدمه، ومن لا ينبغي

استخدم cheerio إذا كنت تعمل داخل Node، وكانت الواجهة الشبيهة بـ jQuery مهمة لك، وكانت الصفحات النموذجية قريبة من الأحجام المختبرة حتى 1 MB. 1 ميغابايت هو أكبر نقطة تم اختبارها قبل القفزة الحادة عند 10 MB؛ وهذا المقال لا يحدد نقطة الفصل بينهما ولا يدّعي ما النسبة من الويب التي تقع دونه.

اختبر قبل الاعتماد عليه إذا كنت تتعامل مع مستندات HTML ضخمة جداً مثل التقارير المولدة، أو تفريغات الفهارس، أو صفحات القوائم الطويلة. لم يتم اختبار سلوك خرائط مواقع XML. على عينة HTML بحجم 10 MB، يمثل 2.9 ثانية لكل مستند تكلفة ملموسة تتراكم بسرعة.

إذا كنت في Python، فهذه المقارنة تقول شيئاً آخر: selectolax وlxml وPyQuery متقاربة عملياً من 10 KB فما فوق (ضمن 0.5% إلى 5.4%، مع تداخل في نطاقات التشغيل)، لذا اختر بناءً على واجهة الاستخدام لا على السرعة. الفارق بين cheerio وكل واحد منها هو الرقم المهم، لا الفروق فيما بينها.

أين تناسب واجهة مُدارة مثل Thunderbit

cheerio يحلل HTML الذي لديك بالفعل. إنه لا يجلب الصفحات، ولا يعرض JavaScript، ولا يتعامل مع طبقة مكافحة الروبوتات — وفي كثير من الأهداف الحقيقية، هذا هو النصف الأصعب من المهمة.

خدمة مُدارة للجلب/العرض/الاستخراج، بما في ذلك Thunderbit، تقع عند حدود مسؤولية مختلفة. لم يتم قياس Thunderbit هنا. الفارق المهم هو بين تحليل HTML المزوّد لك عبر محددات، وبين تفويض الجلب والعرض والاستخراج إلى خدمة أخرى؛ وهذا المقال لا يقدم مقارنة موحدة في الجودة أو الكمون أو الكلفة.

والصياغة العادلة هي: إذا كان HTML بين يديك وتعرف المحددات، فcheerio مجاني ومريح للاستخدام. أما إذا كنت تجلب الصفحات على نطاق واسع، أو تفضّل وصف البيانات بدل وصف شجرة DOM، فهذه صفقة مختلفة.

وللاطلاع على المجال الأوسع، تغطي جولة حول واجهات Web Scraping API الخيارات المستضافة، بينما يغطي دليل open-source scraper الخيارات المستضافة ذاتياً. وإذا كانت المخرجات المحللة ستذهب إلى نموذج، فمقال تحويل HTML إلى Markdown في Python يشرح أين تضيع الدقة.

جرّب Thunderbit لاستخراج بيانات الويب

هل ينبغي أن تستخدم cheerio؟

نعم، داخل Node، عندما تهمك ملاءمة الواجهة، وتبقى المستندات النموذجية ضمن النطاق الصغير إلى 1 MB الذي تم اختباره.

ألفة الواجهة وإشارات الصيانة الحالية مدخلات اختيار مشروعة. ولا يثبت هذا الاختبار أن هناك إجابة دعم معيّنة أو أن توزيع أحجام الصفحات المختبرة يطابق محتوى الإنتاج.

الرقم الذي يجب الاحتفاظ به هو رقم 10 MB. ففي مكان ما بين 1 MB و10 MB، تتوقف تكلفة cheerio عن ملاحقة الآخرين وتبدأ بالارتفاع المضاعف — 4× تصبح 18.5×. إذا كان محتواك يتضمن مستندات بهذا الحجم، فاختبر قبل الالتزام، لأن المكتبة نفسها لن تحذرك.

جرّب Thunderbit لاستخراج بيانات الويب Get Started Free

الأسئلة الشائعة

هل من العدل مقارنة cheerio مع محللات Python؟ هذه مقارنة بين مكدسات تشغيل، وليست مقارنة بين الخوارزميات. أنتجت الأدوات الأربع جميعها نصوص العناوين وروابط href نفسها المرتبة وفق قاعدة الهاش على 5 من 5 أحجام صفحات. هذا لا يثبت تساوي المحللات بالكامل. أزمنة cheerio تتضمن سلوك وقت تشغيل Node، بينما تتضمن الأخرى CPython وهو يستدعي محللات مدعومة بـ C؛ لذا فالمقارنة تصف تلك الخيارات الشاملة من النهاية إلى النهاية.

لماذا لا يُرتّب صف 1 KB؟ لأن القياس عند 28 ميكروثانية يهيمن عليه الضجيج. عبر ثلاث تشغيلات، بلغ تشتت محللات Python 77.6%، مع تداخل واضح بين التشغيلات. أي ترتيب عند هذا الحجم سيكون أثراً جانبياً. أما من 10 KB فما فوق فالوضع مستقر بما يكفي للقراءة.

ما سبب القفزة عند 10 MB؟ هذا الاختبار لا يقول. ما يثبته هو أن القفزة حقيقية وليست ضجيجاً: جاءت تشغيلات cheerio الثلاث عند 2,839 و2,928 و2,954 ms، بعيدة بوضوح عن بقية النتائج، بينما كان الفارق عند 1 MB أربعة أضعاف. وعزل السبب يعني تتبع محركات cheerio الداخلية منفصلة، وهذا خارج نطاق هذه المقارنة.

كم عدد الاعتمادات فعلاً؟ 11 مباشرة، و22 حزمة من المستوى الأعلى بعد الحل، و9.0 MiB على القرص. اثنتان منها محركا تحليل كاملان — htmlparser2 وparse5 — لأن cheerio يستطيع استخدام أيٍّ منهما. هذا هو ثمن التعامل مع كل من التحليل المتسامح والتحليل المطابق للمواصفات، ومن المهم معرفته عند مراجعة شجرات الاعتمادات.

ما الذي لم يُختبر هنا؟ غطت الاختبارات ذروة ذاكرة العملية على مستند واحد بحجم 226 KB وآخر بحجم 10 MB، بالإضافة إلى مجموعة من 14 مدخلاً من HTML المشوَّه مع عينات سليمة، حيث لم يرفع cheerio استثناءً في أي منها، وأعاد مخرجات غير فارغة في الجميع، واستعاد 11/22 من العلامات المقاسة. لم تشمل الاختبارات البث عبر parse5-parser-stream، أو صحة الترميز، أو الاستعادة الخاصة بالمحرك، أو تحديد موقع القفزة في الأداء بين 1 و10 MB، أو تحليل XML، أو بدائل Node الأحدث.

Ke
Ke
المدير التقني في Thunderbit | عالم بيانات أول وخبير في تعلّم الآلة بخبرة تقارب عقدًا من الزمن في تعلّم الآلة وعلم البيانات، كيه شين خريج جامعة كولومبيا وكان سابقًا عالم بيانات أول في Walmart Labs. وبفضل خبرته العميقة المعترف بها من قبل الأقران في Python وR وJava والإحصاء، يشارك رؤى مجرّبة حول نقل خوارزميات الذكاء الاصطناعي المعقدة من النظرية إلى بنية جاهزة للإنتاج.
جدول المحتويات
Thunderbit · وكيل بيانات الويب بالذكاء الاصطناعي

استخرج البيانات من أي صفحة في بنقرة واحدة

يثق به أكثر من 250,000 مستخدم
تتوفر خطة مجانية
من صفحة ويب إلى جدول بيانات
صف ما تحتاجه — يتولى وكيل Thunderbit الذكي استخراجه وتصديره إلى Excel أو Google Sheets أو Airtable أو Notion. ابدأ مجانًا.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week