| category | general | |||||
|---|---|---|---|---|---|---|
| date | 2026-03-20 | |||||
| description | تعيين وكيل المستخدم في صندوق عزل لاستخراج عنوان الصفحة عبر عرض HTML بدون رأس – تعلّم كيفية ضبط DPI للجهاز وإنشاء نسخة من صندوق العزل. | |||||
| draft | false | |||||
| keywords |
|
|||||
| language | ar | |||||
| og_description | تعيين وكيل المستخدم في بيئة معزولة، استخراج عنوان الصفحة، والتحكم في DPI للجهاز لضمان عرض HTML بدون رأس موثوق. | |||||
| og_title | تعيين وكيل المستخدم لعرض HTML بدون رأس – دليل كامل | |||||
| tags |
|
|||||
| title | تعيين وكيل المستخدم لتص rendering HTML بدون رأس – دليل كامل | |||||
| url | /ar/java/configuring-environment/set-user-agent-for-headless-html-rendering-complete-guide/ |
{{< blocks/products/pf/main-wrap-class >}} {{< blocks/products/pf/main-container >}} {{< blocks/products/pf/tutorial-page-section >}}
هل احتجت يوماً إلى تعيين وكيل المستخدم أثناء استخراج بيانات موقع ولكنك لم تكن متأكدًا من تأثيره على الصفحة المرسومة؟ لست وحدك. في العديد من السيناريوهات بدون رأس يقرر الخادم ما HTML الذي يرسل بناءً على سلسلة UA، لذا فإن ضبطها بشكل صحيح قد يكون الفرق بين صفحة فارغة والمحتوى الذي تحتاجه فعليًا.
في هذا الدرس سنستعرض كيفية تكوين صندوق رملي، إنشاء نسخة من الصندوق الرملي، تعديل دقة DPI للجهاز، وأخيرًا استخراج عنوان الصفحة من جلسة تصوير HTML بدون رأس. لا إطالة—مجرد مثال Java قابل للتنفيذ يمكنك إضافته إلى مشروعك اليوم.
نصيحة محترف: إذا كنت تستخدم بالفعل Aspose.HTML (أو مكتبة مشابهة)، فإن الخطوات أدناه تتطابق 1‑ إلى 1 مع واجهة برمجة التطبيقات الخاصة بها. إذا كنت على تقنية مختلفة، ففكر في الصندوق الرملي كأي سياق متصفح بدون رأس (Playwright، Selenium، إلخ).
- صندوق رملي بسلسلة وكيل‑المستخدم مخصصة.
- تصوير يدعم DPI بحيث تتصرف وحدات CSS (pt، in، cm) كالشاشة الحقيقية.
- طريقة نظيفة لاستخراج عنوان الصفحة بعد أن تُرسم الصفحة بالكامل.
- فئة Java مستقلة يمكنك تشغيلها من سطر الأوامر.
المتطلبات المسبقة؟ فقط Java 8+ وملف JAR الخاص بـ Aspose.HTML for Java في مسار الـ classpath. لا شيء آخر.
أول شيء تريد القيام به هو إخبار محرك التصوير بأي متصفح تتظاهر بأنه. يتم ذلك عبر طريقة SandboxConfiguration#setUserAgent.
import com.aspose.html.Sandbox;
import com.aspose.html.SandboxConfiguration;
import com.aspose.html.HTMLDocument;
/* Step 1: Configure the sandbox – screen size, DPI, and user‑agent */
SandboxConfiguration sandboxConfig = new SandboxConfiguration();
sandboxConfig.setScreenSize(1280, 800); // width × height in pixels
sandboxConfig.setDeviceDPI(96); // DPI for CSS unit conversion
sandboxConfig.setUserAgent("AsposeHTML/1.0"); // <-- set user agentلماذا هذا مهم؟ العديد من المواقع تقدم تخطيطًا مبسطًا للوكيلات غير المعروفة (فكر في “bot”) وتخفي البيانات التي تحتاجها فعليًا. من خلال تقليد متصفح حقيقي تجبر الخادم على إرجاع الصفحة الكاملة.
نص الصورة: لقطة شاشة لتكوين وكيل المستخدم.
بمجرد أن يصبح التكوين جاهزًا، شغّل الصندوق الرملي. فكر فيه كإطلاق Chrome بدون رأس يعيش فقط في الذاكرة.
/* Step 2: Create the sandbox using the configuration */
try (Sandbox sandboxInstance = new Sandbox(sandboxConfig)) {
// The sandbox is now ready for rendering tasks.
// Anything you do inside this block runs headlessly.
}استخدام نمط try‑with‑resources يضمن التخلص من الصندوق الرملي بشكل صحيح، مما يحرر الموارد الأصلية. إذا نسيت إغلاقه، قد تتسرب الذاكرة أو مقابض الملفات—شيء رأيت أنه يسبب مشاكل للمبتدئين.
استدعاء setDeviceDPI ليس مجرد ميزة إضافية؛ فهو يؤثر مباشرةً على كيفية حساب وحدات CSS مثل pt أو mm. إذا كنت تصوّر فواتير، ملفات PDF، أو أي صفحة حساسة للتخطيط، فإن مطابقة DPI الهدف يضمن أن لقطات الشاشة أو البيانات المستخرجة تبدو تمامًا كما هي على شاشة حقيقية.
لقد رأيت الاستدعاء بالفعل في مقتطف التكوين، ولكن إليك فحص سريع للمنطقية:
int dpi = sandboxConfig.getDeviceDPI(); // should return 96
System.out.println("Sandbox DPI set to: " + dpi);إذا كنت بحاجة إلى دقة أعلى (مثلاً لأصول بنمط retina)، زد القيمة إلى 144 أو 192. فقط تذكر الحفاظ على نسبة حجم الشاشة؛ وإلا قد يتجاوز التخطيط الحدود.
الآن بعد أن الصندوق الرملي يعمل، حمّل صفحة واسحب عنوانها. طريقة HTMLDocument#getTitle تقرأ وسم <title> بعد أن يتم تحليل DOM للصفحة بالكامل.
/* Step 3: Load a web page inside the sandboxed environment */
HTMLDocument htmlDoc = new HTMLDocument(sandboxInstance, "https://example.com");
/* Step 4: Work with the rendered document – extract its title */
String pageTitle = htmlDoc.getTitle();
System.out.println("Title: " + pageTitle);تشغيل الكود أعلاه ضد https://example.com يطبع:
Title: Example Domain
هذه هي خطوة استخراج عنوان الصفحة عمليًا. إذا كان الموقع يستخدم JavaScript لتعيين العنوان ديناميكيًا، فإن الصندوق الرملي سينفذ السكريبت (بما أن تمكين البرمجة النصية مفعل افتراضيًا). إذا رأيت سلسلة فارغة، تحقق مرة أخرى من أن الصفحة تحتوي فعلاً على عنصر <title> بعد تشغيل السكريبتات.
بجمع كل ما سبق، إليك فئة كاملة جاهزة للتنفيذ. يمكنك نسخها ولصقها في Main.java ثم تشغيل javac Main.java && java Main.
import com.aspose.html.Sandbox;
import com.aspose.html.SandboxConfiguration;
import com.aspose.html.HTMLDocument;
/**
* Demonstrates how to set user agent, configure DPI,
* create a sandbox instance, and extract the page title
* using headless HTML rendering.
*/
public class Main {
public static void main(String[] args) {
// 1️⃣ Configure sandbox: screen, DPI, and user‑agent
SandboxConfiguration config = new SandboxConfiguration();
config.setScreenSize(1280, 800);
config.setDeviceDPI(96);
config.setUserAgent("AsposeHTML/1.0"); // <-- set user agent
// 2️⃣ Create sandbox (auto‑close with try‑with‑resources)
try (Sandbox sandbox = new Sandbox(config);
// 3️⃣ Load the page inside the sandbox
HTMLDocument doc = new HTMLDocument(sandbox, "https://example.com")) {
// 4️⃣ Extract and print the title
String title = doc.getTitle();
System.out.println("Title: " + title);
} catch (Exception e) {
// Simple error handling – in real code you might log this
System.err.println("Rendering failed: " + e.getMessage());
}
}
}Title: Example Domain
إذا استبدلت https://example.com بأي عنوان URL آخر، سترى عنوان تلك الصفحة— بشرط ألا يمنع الموقع الوكلاء بدون رأس. هذا هو مسار تصوير HTML بدون رأس بالكامل في أقل من 30 سطرًا من Java.
| السؤال | الجواب |
|---|---|
| ماذا لو كان الموقع يحظر وكلاء غير معروفين؟ | استخدم سلسلة متصفح شائعة، مثل "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/119.0 Safari/537.36". الصندوق الرملي يتيح لك تعيين أي وكيل مستخدم تختاره. |
| هل أحتاج إلى تمكين JavaScript؟ | هو مفعّل افتراضيًا. إذا أوقفته مسبقًا، استدعِ config.setEnableJavaScript(true). |
| كيف ألتقط لقطة شاشة بدلاً من مجرد العنوان؟ | بعد تحميل المستند، استدعِ htmlDoc.save("page.png", SaveFormat.PNG). الـ DPI الذي ضبطته مسبقًا سيؤثر على حجم الصورة. |
| هل يمكنني تصوير عدة صفحات في صندوق رملي واحد؟ | نعم. أعد استخدام نفس كائن Sandbox؛ فقط أنشئ كائنات HTMLDocument جديدة لكل عنوان URL. |
| ماذا عن شهادات HTTPS؟ | الصندوق الرملي يثق بمخزن المفاتيح الافتراضي لـ Java. للشهادات ذات التوقيع الذاتي، استوردها إلى مخزن الثقة في JVM أو عطل التحقق عبر config.setIgnoreCertificateErrors(true). |
- تدوير وكلاء المستخدم – احتفظ بقائمة من سلاسل الوكيل الشائعة واختر واحدة عشوائيًا لكل طلب. هذا يقلل من احتمال التعرض للإشارة.
- احترام robots.txt – رغم أنك تعمل بدون رأس، فإن الاستخراج الأخلاقي يعني الالتزام بسياسة الزحف للموقع.
- تحديد معدل الطلبات – أضف
Thread.sleep(500)بين الطلبات لتجنب إغراق الخادم. - تخزين HTML المرسوم مؤقتًا – إذا كنت تحتاج نفس الصفحة مرارًا، احفظ الـ HTML على القرص وأعد استخدامه؛ التصوير يستهلك CPU بشكل كبير.
- مراقبة الذاكرة – الصندوق الرملي يحتفظ بموارد أصلية. في مهام طويلة الأمد، استدعِ
System.gc()دوريًا أو أعد تشغيل الصندوق الرملي بعد دفعة من العناوين.
أنت الآن تعرف كيف تعيّن وكيل المستخدم لتصوير HTML بدون رأس موثوق، وتضبط DPI الجهاز، تنشئ نسخة من الصندوق الرملي، وت استخراج عنوان الصفحة في سير عمل Java نظيف. المثال الكامل أعلاه يعمل فورًا، يطبع العنوان، ويترك مساحة لتوسعات مثل لقطات الشاشة أو تحويل PDF.
الخطوة التالية: جرّب استبدال العنوان بـ URL يقدم محتوى مختلف بناءً على وكيل المستخدم، أو جرب قيم DPI أعلى لترى كيف تتغير تخطيطات CSS. يمكنك أيضًا استكشاف طرق HTMLDocument.save لتوليد ملفات PDF—طريقة مفيدة أخرى لأرشفة الصفحات المرسومة.
برمجة سعيدة، ولتظل أدوات الاستخراج غير مكتشفة!
{{< /blocks/products/pf/tutorial-page-section >}} {{< /blocks/products/pf/main-container >}} {{< /blocks/products/pf/main-wrap-class >}} {{< blocks/products/products-backtop-button >}}
