ضمن مجموعة واحدة من العينات المعلَّمة والمتمحورة حول المقالات، قدّم newspaper4k مخرجات في جميع الحالات الـ22، واستعاد 98.65% من وحدات المقالات المحتسَبة، ولم يُدخل أيًّا من رموز الحشو المعلَّمة. هذه الأبعاد الثلاثة تجعله خيارًا قويًا بحسب أولويات هذا الاختبار؛ لكنها لا تعني أنه الفائز المطلق في كل الحالات.
لم تجمع أيٌّ من الأدوات الأخرى في هذه المجموعة النتائج الثلاث نفسها. Mozilla Readability استعاد كل وحدات المحتوى المحتسَبة لكنه تضمّن قدرًا أكبر من الحشو المعلَّم؛ أما goose3 فلم يضمّن حشوًا معلمًا، لكنه أعاد سلاسل فارغة مرتين. لذلك قد تفضّل قواعد قرار أخرى مكتبة مختلفة.
هناك إعداد افتراضي واحد في جلب البيانات يستحق الانتباه قبل النشر.
ما هو newspaper4k
newspaper4k هو نسخة مُحافَظ عليها من newspaper3k، والذي كان بدوره امتدادًا لـ Python 3 للمشروع الأصلي newspaper. هذه السلسلة التطويرية مهمة عندما تبحث عن المساعدة، لأن معظم ما ستجده على الإنترنت يعود إلى المشروع الأقدم، وبعض واجهاته البرمجية تغيّرت.
المرجع الرسمي: المستودع الرسمي لـ newspaper4k.

أكثر خطأ شائع في استخدام هذه المكتبة، على سبيل المثال، هو اللجوء إلى set_html(). هذه الدالة غير موجودة. يجب تمرير HTML عبر download():
from newspaper import Article
a = Article(url="https://example.com/story")
a.download(input_html=html) # not set_html()
a.parse()
text = a.text
لقد أخطأت في هذا في أول تشغيل لي، وسجّلت المكتبة 0 من 22 في البداية قبل أن أتأكد إن كانت المشكلة من جانبي. وكانت كذلك.
والناتج الذي تحصل عليه ليس مجرد نص. كائن Article يوفّر حقولًا مثل text وtitle وauthors وpublish_date وtop_image وimages وmovies وmeta_description وmeta_lang وtags وarticle_html. أما keywords وsummary فتتطلبان تثبيت NLP الاختياري وإعداد مجموعة البيانات كما هو موضّح أدناه. تم حصر الحقول، لكن لم تُقَيَّم دقة البيانات الوصفية.
الإصدار المختبَر: 0.9.6، برخصة MIT، مع 1,135 نجمة على GitHub، وآخر دفع للمستودع بتاريخ 2026-07-31. هذا النشاط المؤرخ لقطة زمنية لا حكم نهائيًا على صحة الصيانة. Python 3.14.2.
النتيجة
| المكتبة | استدعاء المقالات (كل 22) | تسرّب الحشو | دقة محتوى النص | الرموز الملوِّثة | إنتاج مخرجات |
|---|---|---|---|---|---|
| Readability | 1.0000 | 0.2353 | 0.9109 | 35 | 22/22 |
| trafilatura | 0.9865 | 0.0588 | 0.9411 | 4 | 22/22 |
| newspaper4k | 0.9865 | 0.0000 | 0.9452 | 0 | 22/22 |
| resiliparse | 0.9054 | 0.0588 | 0.9381 | 7 | 22/22 |
| jusText | 0.8378 | 0.4706 | 0.8760 | 74 | 19/22 |
| goose3 | 0.8243 | 0.0000 | 1.0000 | 0 | 20/22 |
sixway-scores.json. كل وحدة في كل عينة تحمل رمزًا فريدًا، لذا فإن "استعاد" و"سرّب" هنا يعنيان تطابقًا نصيًا مباشرًا لا درجة تشابه. الاستدعاء محسوب على جميع الحالات الـ22؛ أما التسرّب والدقة فمحسوبان على 11 حالة تحتوي على المقال والحشو معًا.
من المفيد فصل ثلاثة أعمدة عن بعضها.
أجاب على كل صفحة. goose3 وjusText لم يفعلا ذلك — 20 و19 من 22. وهذا أهم مما يبدو، لأن الدقة وF1 في جدول كهذا تكونان مشروطتين بإنتاج مخرجات: المكتبة التي تعيد سلسلة فارغة لا تساهم في طرفي النسبة، لذا يكون الامتناع مجانيًا. دقة goose3 البالغة 1.0000 حُسبت على 10 من 11 عينة؛ بينما newspaper4k حقق 0.9452 على 11 من 11. ليستا القياسان نفسيهما تمامًا.
لم يُسرّب شيئًا. تتضمن العينات حشوًا عدائيًا مقصودًا — كتلًا ترويجية محايدة التصنيف تقع بجانب المقال، وسلاسل تعليقات بأسماء فئات عادية، وكتل إعلانية لا تقول "ad". حيلة إلصاق الجار التي يستخدمها Readability ابتلعت عدة أجزاء منها؛ أما newspaper4k فلم يبتلع أيًا منها.
فاته عنصر واحد من أصل 74، وهذا العنصر المفقود مشترك.
هذا الفقدان يقع في عينة غير نثرية — صفحة مبنية من جداول، وكتلة برمجية، وعناصر قصيرة، وتعليق صورة بدلًا من الفقرات — والعنصر الذي تجاهله هو التعليق التوضيحي (caption). وهو ليس وحيدًا في ذلك:
| المكتبة | الاستدعاء في صفحة غير نثرية | العناصر التي سقطت |
|---|---|---|
| Readability | 1.000 | — |
| jusText | 1.000 | — |
| trafilatura | 0.875 | التعليق التوضيحي |
| resiliparse | 0.875 | التعليق التوضيحي |
| newspaper4k | 0.875 | التعليق التوضيحي |
| goose3 | 0.250 | الجدولان معًا، كتلة الشفرة، العنصران القصيران، التعليق التوضيحي |
تسقط ثلاث مكتبات التعليق نفسه من دون أي عنصر آخر، وهذا يبدو أقرب إلى افتراض موروث مشترك حول قيمة التعليق التوضيحي منه إلى ثلاثة أخطاء منفصلة. إذا كان محتواك توثيقًا أو وصفات أو أي شيء يحمل فيه التعليق التوضيحي معلومات لا توجد في الفقرة، فاختباره قبل الاعتماد عليه أمر مهم — وReadability وjusText احتفظا به.
العينة نفسها هي المكان الذي ينهار فيه goose3 تمامًا، إذ يخسر ثلاثة أرباع الصفحة، لذا فإن "المحتوى غير النثري" محور اختلاف أكبر بكثير بين الأدوات الست مما يوحي به جدول الملخص.
من ناحية السرعة، كان وسيط الاستخراج في newspaper4k عبر 22 عينة هو 2.69 مللي ثانية، وهو الأبطأ بين الأدوات الست، مع أسوأ حالة بلغت 199.81 مللي ثانية. مقارنة بوسيط resiliparse البالغ 0.06 مللي ثانية، فهذا فارق 45× في هذا التشغيل المضبوط. قد يبدو الوسيط صغيرًا في سير عمل لصفحة واحدة، لكن الإنتاجية وكمون الذيل تحت الحمل لم تُختبرا. أما زمن الاستيراد البارد فمقاس بشكل منفصل أدناه.
الإعداد الافتراضي الذي سأغيّره في السطر الأول

المرجع الرسمي: توثيق newspaper4k.
عند مراجعة كائن Configuration المرفق يظهر 22 إعدادًا. أحدها هو:

_honor_robotstxt = False
newspaper4k لا يحترم robots.txt إلا إذا أخبرته بذلك. إذا سمحت له بالجلب — Article(url).download() من دون input_html — فسوف يجلب أي عنوان تضعه أمامه، بغض النظر عمّا يقوله ملف robots الخاص بالموقع.
هذا خيار هندسي يمكن الدفاع عنه عندما تكون وظيفة المكتبة الأساسية هي تحليل HTML موجود لديك أصلًا، لكنه يصبح خيارًا غير مقبول حين تكتشفه في الإنتاج بعد توجيهه إلى ألف رابط. اضبط honor_robotstxt=True في Configuration، أو مرّر input_html وتولَّ أنت الجلب، وهذا ما فعلته طوال هذا الاختبار.
شيئان آخران يجدر معرفتهما:
number_threads = 10. التوازي الافتراضي في أدوات التعامل مع عدة مقالات هو عشرة. التوازي لا يعني عدد طلبات في الثانية، لكنه قد يسبب دفعة من الطلبات المتزامنة ما لم تحدد حدودًا وجدولة واضحة لكل مضيف.
fetch_images = True. جلب الصور مفعّل افتراضيًا، وهذا يطرح سؤال الاستخدام دون اتصال. مع حظر socket.connect، فإن المسار المختبَر في newspaper4k 0.9.6 — download(input_html=…) متبوعًا بـ parse() على إدخال HTML محفوظ — اكتمل، وأعاد 1,292 حرفًا، وحاول صفر اتصالات شبكية. هذا يثبت صلاحية هذا المسار تحديدًا، لا كل الإعدادات أو الإضافات أو أنواع المحتوى أو الإصدارات المستقبلية.
أما بقية الإعدادات فهي معقولة: min_word_count = 300، وmin_sent_count = 7، وmax_text = 100,000، وhttp_success_only = True، وmemorize_articles = True، وfollow_meta_refresh = False، وallow_binary_content = False.
واقع الإعداد والتثبيت
pip install newspaper4k يسحب 22 حزمة و47.5 MiB في نحو ست ثوانٍ. زمن الاستيراد البارد في عملية فرعية جديدة: 2.812 ثانية — وهو الأبطأ في المقارنة.
| المكتبة | الحزم | site-packages | الاستيراد البارد | p50 للاستخراج |
|---|---|---|---|---|
| resiliparse | 5 | 21.0 MiB | 0.015 s | 0.06 ms |
| jusText | 3 | 22.4 MiB | 0.777 s | 0.56 ms |
| goose3 | 16 | 44.3 MiB | 2.181 s | 1.85 ms |
| newspaper4k | 22 | 47.5 MiB | 2.812 s | 2.69 ms |
| trafilatura | 17 | 69.9 MiB | 1.584 s | 0.51 ms |
install-and-import.json. كل مكتبة في بيئة افتراضية فارغة مستقلة، لذا لا ترث أيٌّ منها اعتمادات الأخرى.
2.812 ثانية للاستيراد تعني 187 مرة زمن resiliparse البالغ 15 مللي ثانية. في عامل تشغيل طويل الأمد تدفع هذا مرة واحدة ثم يصبح غير مهم. أما في دالة serverless فستدفعه عند كل بدء بارد، وهنا تكون newspaper4k الخيار الخاطئ مهما كانت جودة الاستخراج.
هناك نقطة خشنة أخرى في التثبيت. عند الاستيراد يظهر تحذير:
UserWarning: nltk is not installed. Some NLP features will be unavailable. Install it with: pip install 'newspaper4k[nlp]'
لم يحتج أي شيء في هذا الاختبار إلى تلك الميزات وعمل الاستخراج جيدًا من دونها، لكن التثبيت الأساسي ليس التثبيت الكامل، وnewspaper4k[nlp] يسحب شجرة اعتمادات أثقل بكثير مع تنزيلات لمجموعات البيانات. ضع هذا في الحسبان فقط إذا كنت تريد الكلمات المفتاحية والملخصات.
الذاكرة، وما يفعله HTML المعطوب بها
شيئان تذكرهما كل مراجعة في هذه الدفعة على أنهما غير مختبرين، وتم قياسهما الآن.
سياق اختبار الضغط الأوسع موجود في مقارنة استهلاك الذاكرة وHTML المعطوب عبر عشر مكتبات.
أقصى الذاكرة المقيمة، عبر /usr/bin/time -l، عملية جديدة لكل خلية — الحد الأدنى للاستيراد هو تكلفة المكتبة وهي محمّلة وخاملة، أما القمم فتشمل المستند نفسه.
| المكتبة | وقت التشغيل | حد الاستيراد الأدنى (MiB) | ذروة 226 KB HTML (MiB) | ذروة 10 MB HTML (MiB) |
|---|---|---|---|---|
| html2text | python3.14 | 18.7 | 19.9 | 71.2 |
| pyquery | python3.14 | 30.3 | 33.9 | 172.5 |
| resiliparse | python3.14 | 20.5 | 25.1 | 225.1 |
| markdownify | python3.14 | 23.9 | 28.9 | 278.5 |
| goose3 | python3.14 | 44.1 | 52.4 | 398.5 |
| cheerio | node22 | 66.8 | 76.5 | 398.5 |
| justext | python3.14 | 30.3 | 36.6 | 431.2 |
| newspaper4k | python3.14 | 52.6 | 61.8 | 668.5 |
| trafilatura | python3.14 | 52.5 | 64.8 | 927.1 |
| turndown | node22 | 47.8 | 68.4 | 2947.1 |
memory-results.json. خطوط الأساس في Python وNode غير قابلة للمقارنة المباشرة؛ فالمفسّر موجود داخل الاثنين.
حد newspaper4k الأدنى هو 52.6 MiB وذروته عند 10 MB هي 668.5 MiB — ثاني أثقل خيار بين مكتبات Python. لا تمثل أيٌّ من القيمتين مشكلة في الصفحات العادية؛ لكنهما مهمتان إذا كنت تعالج مستندات كبيرة على عامل بذاكرة محدودة.
HTML المعطوب. اثنا عشر مستندًا يكسر كل واحد منها شيئًا واحدًا فقط — وسوم غير مغلقة، عناصر متداخلة بشكل خاطئ، سمات غير مقتبسة وبداخلها مسافات، سمات إغلاق زائدة، وعدم وجود <html> أصلًا، وسمات مكررة، ومستند مقطوع في منتصف وسم، وكيانات خاطئة، و<script> غير مغلق، وادعاء كاذب بترميز charset، وتعليق يحتوي على ترميز HTML، و600 مستوى من التعشيق — إضافة إلى عينتين سليمتين تمامًا وبأحجام متطابقة، لأن عبارة "أعاد لا شيء" لا تعني شيئًا عن سوء البنية إذا كانت المكتبة صامتة أيضًا على مستند سليم بنفس الحجم.
تتباين العينات السليمة والمعطوبة بوضوح في النتائج الخام:
| المجموعة | المستندات | رمى استثناء | مخرجات فارغة | استعاد الرموز المحتسَبة |
|---|---|---|---|---|
| عينات سليمة متطابقة | 2 | 0 | 0 | غير مستخدم في درجة المعطوب |
| عينات معطوبة | 12 | 0 | 10 | 5/33، باستثناء حالة <script> غير المغلق |
أنتجت العينتان السليمتان 70 و1,351 حرفًا، بينما أعطت عشرة من أصل اثني عشر إدخالًا معطوبًا سلسلة فارغة. وهذا يجعل الصمت هنا منسوبًا إلى سوء البنية في تصميم هذه العينات، لا إلى قِصر الإدخال فقط. أداة التقييم تتحقق من رموز الترويسة والفقرة والرابط عبر أحد عشر مستندًا معطوبًا مؤهلًا. وتم استثناء عينة script غير المغلق لأن التحليل وفق HTML5 يجعل الوسوم اللاحقة ضمن محتوى السكربت. انظر malformed-results.json. هذا قيد استرجاع مهم يجب أخذه في الاختيار، وليس مجرد نجاح من نوع "لم يرمِ استثناء".
الإيجابيات والسلبيات
لمصلحته. لا توجد رموز حشو معلَّمة في هذه المقارنة، ومخرجات على جميع حالات المقالات الـ22 المضبوطة، واستدعاء محتوى مقالات محتسب بنسبة 0.9865. يوفّر نص المقال وحقول البيانات الوصفية، رغم أن دقة البيانات الوصفية لم تُختبر. المسار المختبَر مع HTML محفوظ لم يُجرِ أي محاولات شبكية مع حظر socket.connect. وكان للمستودع دفع حديث بتاريخ مُسجَّل وقت الفحص؛ أما صحة الصيانة الأوسع فلم تُقيَّم.
ضده. أثقل استيراد بارد في المجموعة عند 2.812 ثانية، و22 حزمة / 47.5 MiB من site-packages المقاسة. الافتراضي في honor_robotstxt هو False، وأدوات المقالات المتعددة تفترض عشرة خيوط. التثبيت الأساسي يحذّر من غياب NLTK، لذا تحتاج الكلمات المفتاحية والملخصات إلى تثبيت اختياري أثقل. والأهم أن عشرة من أصل اثني عشر ملف HTML معطوب أعادت مخرجات فارغة رغم أن العينات السليمة المطابقة أنتجت نصًا.
من يناسبه ومن لا يناسبه
فكّر في newspaper4k إذا كانت أولوياتك هي: إنتاج نص غير فارغ من corpus مضبوطة ومتمحورة حول المقالات، وتقليل الحشو المعلَّم في هذه المجموعة، مع قبول استيراد بارد أبطأ. وفق هذه القاعدة المحددة فقد تصدّر هذه المقارنة. أما قاعدة مختلفة فقد تختار Readability للاحتفاظ الأعلى بالمحتوى المحتسَب، أو resiliparse لسرعة البدء والاستخراج الوسيط.
تجاوزه أو اختبره بعناية إذا كان بدء التشغيل البارد هو العامل الحاسم، أو إذا كانت 47.5 MiB من site-packages المقاسة رقمًا مؤثرًا، أو إذا كانت استعادة HTML المعطوب مهمة. resiliparse استورد هنا أسرع بـ187 مرة، لكنه لم يتعادل مع trafilatura في كل أعمدة الجودة: trafilatura حقق استدعاء أعلى للمقالات، كما اختلفت بينهما أيضًا أنماط التسرب والدقة. newspaper4k موجَّه للمقالات؛ أما قوائم المنتجات ولوحات المعلومات فلم تُختبر، لذا لا يمكن ادعاء أي سلوك بشأنها.
مهما فعلت، اضبط honor_robotstxt إذا سمحت له بالجلب. هذه ليست ملاحظة أداء.
أين يناسبك API مُدار
يمكن لـ newspaper4k تحليل HTML يقدمه المستدعي، وله أيضًا مسارات جلب. أما خدمة استخراج مُدارة فتوضع فيها عملية الجمع والعرض وبناء المخطط وراء حدٍّ يخص المورّد. نحن نبني Thunderbit، لكنه لم يُشغّل على هذه المجموعة من العينات، لذا لا تقدم هذه المراجعة أي مقارنة في الجودة أو العرض أو مقاومة الحظر أو الكمون أو التكلفة. بالنسبة لـ HTML المقال المحفوظ، فالأدلة هنا تخص newspaper4k وحده؛ أما الأهداف غير المقالية فلها تقييمها الخاص.
للاطلاع على نفس العينات عبر جميع المستخرجات الستة، راجع مقارنة الاستخراج عبر ست مكتبات.
وللاختيار في المجال المستضاف، يقدّم استعراض أفضل واجهات Web Scraping API الصورة الأوسع؛ وللبدائل ذاتية الاستضافة، راجع الدليل الشامل للمستخرجات مفتوحة المصدر. وإذا كان النص سيتجه إلى نموذج، فإن تحويل HTML إلى Markdown في Python يشرح أين تضيع الدقة.
جرّب Thunderbit لاستخراج بيانات الويب
هل ينبغي استخدام newspaper4k؟
تعامل مع newspaper4k باعتباره خيارًا قويًا لاستخراج نص المقالات عندما يكون HTML متاحًا لديك أصلًا، ثم أجرِ اختبارًا عمليًا على موقعك وبياناتك قبل اعتماده. المجموعة المضبوطة تدعم استدعاءً عاليًا للمحتوى المحتسَب، وعدم وجود حشو معلَّم، وإخراجًا غير فارغ في جميع عينات المقالات الـ22. لكنها لا تغطي الصفحات الحقيقية أو دقة البيانات الوصفية، كما أن عشرة من أصل اثني عشر ملف HTML معطوب أعادت مخرجات فارغة.
إذا استخدمت مسار الجلب، فراجع صراحةً honor_robotstxt=False، والتوازي بعشرة خيوط، وضوابط المعدل لكل مضيف. وإذا كان بدء التشغيل البارد أو حجم الاعتمادات مهمًا، فقِس ملاحظة الاستيراد المحلي البالغة 2.812 ثانية و47.5 MiB من site-packages داخل بيئة النشر لديك بدلًا من اعتبارها كلفة عامة ثابتة للحاويات.
جرّب Thunderbit لاستخراج بيانات الويب Get Started Free
الأسئلة الشائعة
لماذا لا تعمل set_html()؟
لأنها غير موجودة في newspaper4k. يجب إدخال HTML عبر download(input_html=html) ثم parse(). قد تعرض نتائج البحث أمثلة خاصة بـ newspaper3k، لذا يقع هذا الخطأ بسهولة؛ وقد وقعت فيه في التشغيل الأول ثم صححت أداة الاختبار قبل التقييم.
هل يحترم newspaper4k ملف robots.txt؟
ليس افتراضيًا. قيمة honor_robotstxt تأتي معروضة كـ False. اضبطها على True في Configuration إذا سمحت للمكتبة بالجلب، أو مرّر input_html واجلبه بنفسك. كما أن العمل مع عدة مقالات يستخدم افتراضيًا عشرة خيوط. هذا توازي غير مختار، وليس معدل طلبات ثابتًا؛ لذا ضع حدودًا صريحة لكل مضيف عند الجلب.
هل تقوم parse() بطلبات شبكية؟
في newspaper4k 0.9.6، مسار download(input_html=…) متبوعًا بـ parse() لم يُجرِ أي محاولة اتصال لإدخال HTML محفوظ واحد بينما كان socket.connect محظورًا. هذا لا يثبت أن كل إعدادات التحليل أو الإضافات أو أنواع المحتوى أو الإصدارات المستقبلية خالية من الشبكة.
ما معنى تحذير NLTK عند الاستيراد؟
التثبيت الأساسي لا يتضمن NLTK، لذا فإن استخراج الكلمات المفتاحية والتلخيص غير متاحين، وتذكر المكتبة ذلك عند الاستيراد. أما الاستخراج نفسه فلا يتأثر — كل ما قيس هنا جرى على التثبيت الأساسي. أمر pip install 'newspaper4k[nlp]' يضيف هذه الميزات مع شجرة اعتمادات أثقل وتنزيلات للمجموعات اللغوية.
ما الذي لم يختبره هذا التقرير؟ الصفحات الحقيقية — فهذه عينات مضبوطة ذات وحدات معلَّمة. كما جُمعت الحقول الوصفية لكن لم تُقَيَّم دقتها في العنوان أو المؤلف أو التاريخ أو الصورة. ولم تُختبر أيضًا الاستخراجات متعددة اللغات، أو إضافات NLP، أو جمع المصادر متعدد الخيوط، أو الإنتاجية تحت الحمل. وقد قيس أقصى استهلاك للذاكرة على إدخال HTML بحجم 226 KB وآخر بحجم 10 MB فقط، لا تحت التوازي أو الحمل المستمر.


