সেলেনিয়ামে সাধারণ জাভাস্ক্রিপ্ট ত্রুটি বোঝা এবং ঠিক করা
সঙ্গে ওয়েব স্ক্র্যাপিং যখন , জাভাস্ক্রিপ্ট-সম্পর্কিত ত্রুটির সম্মুখীন হওয়া অস্বাভাবিক নয়, বিশেষ করে যখন গতিশীল ওয়েব উপাদানগুলির সাথে কাজ করা যেমন . একটি ঘন ঘন ত্রুটি যে ডেভেলপারদের সম্মুখীন হয় , যা প্রায়ই জটিল পৃষ্ঠা উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করার সময় ঘটে।
এই ত্রুটিটি সাধারণত দেখা দেয় যখন সেলেনিয়াম a এর ভিতরে থাকা উপাদানগুলির সাথে অ্যাক্সেস বা ইন্টারঅ্যাক্ট করতে অক্ষম হয় , উন্নত মডুলারিটির জন্য অনেক আধুনিক ওয়েবসাইট দ্বারা ব্যবহৃত একটি অনন্য ধরনের এনক্যাপসুলেটেড DOM কাঠামো। পাইথনে, ব্রাউজার নিয়ন্ত্রণ করতে সেলেনিয়াম ব্যবহার করা এই জাতীয় উপাদানগুলির সাথে চতুর হতে পারে।
শোপির মতো প্ল্যাটফর্ম থেকে ওয়েব স্ক্র্যাপিংয়ের প্রসঙ্গে, পপআপ বা ব্যানারগুলি প্রায়শই ছায়া DOM ব্যবহার করে, যা প্রোগ্রামগতভাবে বন্ধ করা চ্যালেঞ্জ হতে পারে। এই সমস্যা স্বয়ংক্রিয় কাজগুলির মসৃণ প্রবাহকে বাধাগ্রস্ত করতে পারে এবং ডেটা সংগ্রহকে ব্যাহত করতে পারে।
এই নির্দেশিকাটি আপনাকে মোকাবেলার জন্য একটি পরিষ্কার সমাধানের মাধ্যমে নিয়ে যাবে ত্রুটি এবং ব্যবহার করে শোপিতে ছায়া DOM-এর মধ্যে এমবেড করা পপআপগুলি বন্ধ করার জন্য একটি ব্যবহারিক পদ্ধতি প্রদান করুন .
| আদেশ | ব্যবহারের উদাহরণ |
|---|---|
| shadowRoot | এটি একটি ছায়া DOM-এর মধ্যে উপাদানগুলি অ্যাক্সেস করতে ব্যবহৃত হয়। ছায়া DOM প্রধান DOM ট্রি থেকে কিছু উপাদানকে বিচ্ছিন্ন করে, তাদের অ্যাক্সেস করার জন্য shadowRoot সম্পত্তির প্রয়োজন হয়। এই স্ক্রিপ্টে, এটি একটি পপআপের ভিতরে বন্ধ বোতামটি সনাক্ত করতে ব্যবহৃত হয়। |
| execute_script() | এই সেলেনিয়াম পদ্ধতি ব্রাউজার সেশনের মধ্যে কাঁচা জাভাস্ক্রিপ্ট চালানোর অনুমতি দেয়। ছায়া DOM উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করার সময় এটি অপরিহার্য কারণ ঐতিহ্যগত সেলেনিয়াম পদ্ধতিগুলি কাজ নাও করতে পারে৷ |
| WebDriverWait() | এই কমান্ডটি সেলেনিয়ামে সুস্পষ্ট অপেক্ষা সেট আপ করে। এটি নিশ্চিত করে যে স্ক্রিপ্টটি একটি নির্দিষ্ট শর্ত পূরণ না হওয়া পর্যন্ত অপেক্ষা করে, যেমন একটি উপাদান ক্লিকযোগ্য হয়ে উঠছে। এটি ডায়নামিক কন্টেন্ট লোডিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ, যেমনটি শোপির পপআপগুলির সাথে দেখা যায়। |
| expected_conditions | এই মডিউলটিতে এমন শর্ত রয়েছে যা WebDriverWait এর সাথে ব্যবহার করা যেতে পারে, যেমন উপাদান দৃশ্যমানতা বা উপস্থিতি। এটি নিশ্চিত করে যে ক্লিক করার মতো ক্রিয়াকলাপগুলি তখনই ঘটে যখন লক্ষ্যযুক্ত উপাদানগুলি প্রস্তুত থাকে৷ |
| EC.presence_of_element_located() | লক্ষ্যযুক্ত উপাদানটি DOM-এ উপস্থিত রয়েছে তা নিশ্চিত করতে WebDriverWait-এর সাথে ব্যবহৃত একটি শর্ত। এটি বিশেষভাবে সহায়ক যখন একটি ছায়া DOM এ উপাদান লোড করার জন্য অপেক্ষা করা হয়। |
| EC.element_to_be_clickable() | WebDriverWait-এর সাথে আরেকটি দরকারী শর্ত, এটি নিশ্চিত করে যে লক্ষ্যযুক্ত উপাদানটি দৃশ্যমান এবং কোনো ইন্টারঅ্যাকশনের চেষ্টা করার আগে ক্লিকযোগ্য, ডায়নামিক ওয়েব পৃষ্ঠাগুলিতে ত্রুটি হ্রাস করে। |
| By.CSS_SELECTOR | এই পদ্ধতিটি তাদের CSS নির্বাচকদের মাধ্যমে উপাদানগুলি সনাক্ত করার অনুমতি দেয়। এটি বিশেষভাবে সহায়ক যখন একটি ছায়া DOM-এর ভিতরে উপাদানগুলিকে লক্ষ্য করে, যা মান XPath পদ্ধতি ব্যবহার করে অ্যাক্সেসযোগ্য নাও হতে পারে। |
| driver.quit() | স্ক্রিপ্ট চালানো শেষ হওয়ার পরে ব্রাউজার ইনস্ট্যান্স সঠিকভাবে বন্ধ করা হয়েছে তা নিশ্চিত করে। ওপেন ব্রাউজার সেশন ছেড়ে যাওয়া এড়াতে এটি একটি গুরুত্বপূর্ণ সেরা অনুশীলন। |
সেলেনিয়াম ওয়েব স্ক্র্যাপিংয়ে শ্যাডো ডম এবং পপআপগুলি কীভাবে পরিচালনা করবেন
উপরে প্রদত্ত স্ক্রিপ্টগুলির লক্ষ্য ওয়েব স্ক্র্যাপিংয়ের সম্মুখীন হওয়া একটি সাধারণ সমস্যার সমাধান করা ছায়া DOM উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করার সময়। একটি ছায়া DOM হল একটি ওয়েব পৃষ্ঠার একটি অংশ যা প্রধান DOM থেকে আলাদাভাবে কাজ করে, প্রায়শই জটিল ওয়েব উপাদানগুলিতে ব্যবহৃত হয়। শোপির মতো স্ক্র্যাপিং সাইটগুলির পরিপ্রেক্ষিতে, পপআপগুলি প্রায়শই ছায়া DOM-এর ভিতরে প্রদর্শিত হয়, যা ঐতিহ্যগত সেলেনিয়াম পদ্ধতিতে অ্যাক্সেস করা হলে ত্রুটির কারণ হতে পারে। প্রথম স্ক্রিপ্টটি জাভাস্ক্রিপ্ট এক্সিকিউশনের মাধ্যমে পপআপ বন্ধ করার জন্য ডিজাইন করা হয়েছে , একটি শক্তিশালী টুল যা সেলেনিয়ামকে ব্রাউজার প্রসঙ্গে কাঁচা জাভাস্ক্রিপ্ট চালানোর অনুমতি দেয়।
মূল চ্যালেঞ্জ হল একটি ছায়া DOM-এর ভিতরের উপাদানগুলি সাধারণ সেলেনিয়াম কমান্ডের মতো অ্যাক্সেসযোগ্য নয় . পরিবর্তে, আমরা ব্যবহার করে ছায়া DOM-এ যেতে জাভাস্ক্রিপ্ট ব্যবহার করি সম্পত্তি স্ক্রিপ্টটি প্রথমে এর শ্যাডো হোস্ট এলিমেন্ট অ্যাক্সেস করে এবং তারপরে এর অভ্যন্তরীণ কাঠামো অনুসন্ধান করে শোপি পপআপের বন্ধ বোতামটিকে লক্ষ্য করে। কাজে লাগিয়ে , স্ক্রিপ্ট এই বিচ্ছিন্ন DOM-এর ভিতরে উপাদানগুলিকে ম্যানিপুলেট এবং বন্ধ করতে সক্ষম। অ্যাসিঙ্ক্রোনাসভাবে লোড হওয়া গতিশীল পৃষ্ঠা উপাদানগুলি পরিচালনা করার জন্য স্পষ্ট অপেক্ষার সাথে মিলিত হলে এই সমাধানটি ভাল কাজ করে।
দ্বিতীয় স্ক্রিপ্ট পরিচয় করিয়ে দেয় , গতিশীল পৃষ্ঠা উপাদানের সময় পরিচালনার জন্য একটি অপরিহার্য টুল। যেহেতু শোপির পপআপগুলি অ্যাসিঙ্ক্রোনাসভাবে লোড হয়, তাই এই উপাদানগুলির সাথে সরাসরি ইন্টারঅ্যাক্ট করার ফলে ত্রুটি হতে পারে। এটি এড়াতে, নিশ্চিত করে যে আমরা যে উপাদানগুলির সাথে যোগাযোগ করতে চাই সেগুলি সম্পূর্ণরূপে লোড এবং প্রস্তুত৷ এই স্ক্রিপ্টটি প্রধান DOM উপাদান এবং ছায়া DOM উপাদান উভয়ের উপস্থিতির জন্য অপেক্ষা করে। পদ্ধতি নিশ্চিত করে যে সেলেনিয়াম উপাদানগুলি দৃশ্যমান এবং উপস্থিত হওয়ার পরেই তাদের সাথে যোগাযোগ করে, যা নাল রেফারেন্স ত্রুটিগুলি এড়ানোর জন্য অত্যন্ত গুরুত্বপূর্ণ।
উভয় স্ক্রিপ্টে, আমরা একটি দিয়ে ত্রুটির পরিস্থিতি পরিচালনা করি অপ্রত্যাশিত ত্রুটির কারণে প্রোগ্রামটি ক্র্যাশ না হয় তা নিশ্চিত করতে ব্লক করুন, যেমন উপাদানগুলি খুঁজে পাওয়া যাচ্ছে না। যে ওয়েবসাইটগুলি ঘন ঘন তাদের গঠন আপডেট করে বা পপআপ আচরণ পরিবর্তন করে স্ক্র্যাপ করার সময় ত্রুটি পরিচালনা করা বিশেষভাবে গুরুত্বপূর্ণ। উপরন্তু, এই স্ক্রিপ্টগুলি ব্যবহার করে ব্রাউজার সেশন বন্ধ করে সর্বোত্তম অনুশীলন অনুসরণ করে মেমরি লিক বা কর্মক্ষমতা সমস্যা এড়াতে মৃত্যুদন্ডের পরে.
পাইথনে সেলেনিয়াম সহ শ্যাডো ডম পরিচালনা এবং পপআপ বন্ধ করা
সেলেনিয়াম ওয়েবড্রাইভারের সাথে পাইথন ব্যবহার করে ছায়া DOM উপাদানগুলির সাথে যোগাযোগ করতে এবং পপআপগুলিকে গতিশীলভাবে পরিচালনা করতে।
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.chrome.options import Optionsfrom selenium.common.exceptions import JavascriptExceptionimport time# Initialize WebDriver with Chromeoptions = Options()driver = webdriver.Chrome(service=Service(), options=options)# Open Shopee websitedriver.get('https://www.shopee.co.th/')# Click the Thai language buttonth_button = driver.find_element(By.XPATH, '/html/body/div[2]/div[1]/div[1]/div/div[3]/div[1]/button')th_button.click()# Pause to allow popups to loadtime.sleep(3)# Try to close the shadow DOM popuptry:close_button = driver.execute_script('return document.querySelector("shopee-banner-popup-stateful")''.shadowRoot.querySelector("div.shopee-popup__close-btn")')close_button.click()except JavascriptException as e:print("Error: ", e)# Close the browserdriver.quit()
WebDriver ব্যবহার করে Shadow DOM ইন্টারঅ্যাকশনের জন্য অপেক্ষা করুন
ছায়া DOM-এর মধ্যে থাকা উপাদানগুলি মিথস্ক্রিয়া করার জন্য প্রস্তুত তা নিশ্চিত করতে সেলেনিয়ামে সুস্পষ্ট অপেক্ষা ব্যবহার করে।
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport time# Initialize WebDriver with Chromeoptions = Options()driver = webdriver.Chrome(service=Service(), options=options)# Open Shopee websitedriver.get('https://www.shopee.co.th/')# Click the Thai language buttonth_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div[1]/div[1]/div/div[3]/div[1]/button')))th_button.click()# Wait for the shadow DOM popup to be presenttry:shadow_host = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'shopee-banner-popup-stateful')))shadow_root = driver.execute_script('return arguments[0].shadowRoot', shadow_host)close_button = shadow_root.find_element(By.CSS_SELECTOR, 'div.shopee-popup__close-btn')close_button.click()except Exception as e:print("Error closing the popup: ", e)# Close the browserdriver.quit()
সেলেনিয়াম ওয়েবড্রাইভারের সাথে ডায়নামিক সামগ্রী পরিচালনা করা
ওয়েব স্ক্র্যাপিংয়ের জন্য সেলেনিয়াম ওয়েবড্রাইভারের সাথে কাজ করার সময় বিবেচনা করার আরেকটি মূল দিক হল কীভাবে পরিচালনা করা যায় যা পৃষ্ঠা লোড হওয়ার পর ক্রমাগত আপডেট বা পরিবর্তন হয়। অনেক আধুনিক ওয়েবসাইট, যেমন শোপি, গতিশীলভাবে বিষয়বস্তু লোড এবং আপডেট করতে জাভাস্ক্রিপ্ট ব্যবহার করে। এর মানে হল পৃষ্ঠার উপাদানগুলি পৃষ্ঠা লোড হওয়ার পরে অবিলম্বে উপলব্ধ নাও হতে পারে৷ এই ধরনের ক্ষেত্রে, পৃষ্ঠা লোড ইভেন্টের জন্য অপেক্ষা করার সেলেনিয়ামের ডিফল্ট আচরণ যথেষ্ট নাও হতে পারে। সুস্পষ্ট অপেক্ষা মত ব্যবহার করে নির্দিষ্ট উপাদান প্রদর্শিত বা ক্লিকযোগ্য হওয়ার জন্য অপেক্ষা করে এই সমস্যাটি সমাধান করতে পারে।
পপআপ, ব্যানার বা জটিল UI উপাদান সহ সাইট স্ক্র্যাপ করার জন্য যা নির্ভর করে , তাদের সাথে কীভাবে যোগাযোগ করতে হয় তা জানা অপরিহার্য। এই উপাদানগুলি একটি বিচ্ছিন্ন DOM কাঠামোর মধ্যে উপাদানগুলিকে লুকিয়ে রাখে যা XPath বা CSS নির্বাচকদের মত ঐতিহ্যগত পদ্ধতি দ্বারা অ্যাক্সেস করা যায় না। ব্যবহার করে কমান্ড আপনাকে ব্রাউজারের মধ্যে সরাসরি জাভাস্ক্রিপ্ট চালানোর অনুমতি দিয়ে এই ব্যবধানটি পূরণ করতে সাহায্য করে, আপনাকে ছায়া DOM-এ অ্যাক্সেস দেয় এবং পৃষ্ঠার সেই লুকানো অংশগুলির মধ্যে বন্ধ বোতাম বা ফর্ম ফিল্ডের মতো উপাদানগুলির সাথে মিথস্ক্রিয়া করার অনুমতি দেয়।
উপরন্তু, এই ধরনের ক্ষেত্রে ত্রুটি পরিচালনা করা গুরুত্বপূর্ণ হয়ে ওঠে। ওয়েবসাইটগুলি প্রায়শই তাদের গঠন পরিবর্তন করতে পারে, যার ফলে স্ক্র্যাপারগুলি ভেঙে যায়। এর সঠিক ব্যবহার পাইথনে ব্লক আপনাকে ত্রুটি ধরতে দেয় যেমন এবং স্ক্র্যাপারটি অপ্রত্যাশিতভাবে ক্র্যাশ না হয় তা নিশ্চিত করে তাদের সুন্দরভাবে পরিচালনা করুন। ত্রুটির বিবরণ ক্যাপচার করতে লগিং অন্তর্ভুক্ত করা মূল কারণ সনাক্ত করতে এবং ভবিষ্যতে স্ক্র্যাপগুলিতে এটি সমাধান করতে সহায়তা করতে পারে।
- একটি ছায়া DOM কি এবং কেন এটি অ্যাক্সেস করা কঠিন?
- দ একটি বিচ্ছিন্ন DOM ট্রি যা ওয়েব ডেভেলপাররা উপাদানগুলিকে এনক্যাপসুলেট করতে এবং মূল নথিতে শৈলী বা স্ক্রিপ্ট দ্বারা প্রভাবিত হওয়া থেকে আটকাতে ব্যবহার করে। এটি অ্যাক্সেস করা কঠিন কারণ ঐতিহ্যগত সেলেনিয়াম পদ্ধতিগুলি ছায়া DOM উপাদানগুলির সাথে সরাসরি মিথস্ক্রিয়া সমর্থন করে না।
- কিভাবে করে ছায়া DOM এর সাথে যোগাযোগ করতে সাহায্য করবেন?
- ব্রাউজার সেশনের মধ্যে সরাসরি জাভাস্ক্রিপ্ট চালানোর অনুমতি দেয়, ছায়া DOM উপাদানগুলিতে অ্যাক্সেস সক্ষম করে, যা অন্যথায় নিয়মিত সেলেনিয়াম কমান্ড ব্যবহার করে পৌঁছানো যায় না।
- কেন হয় গতিশীল সামগ্রী স্ক্র্যাপ করার জন্য গুরুত্বপূর্ণ?
- নিশ্চিত করে যে স্ক্রিপ্ট নির্দিষ্ট শর্তগুলির জন্য অপেক্ষা করে, যেমন একটি উপাদান ক্লিকযোগ্য বা উপস্থিত, এটির সাথে ইন্টারঅ্যাক্ট করার আগে। অ্যাসিঙ্ক্রোনাসভাবে লোড হওয়া গতিশীল বিষয়বস্তু পরিচালনার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ।
- আমি সম্মুখীন হলে আমি কি করা উচিত ?
- জাভাস্ক্রিপ্ট কোড নির্বাহে সমস্যা হলে ঘটে। ব্যবহার করে ত্রুটি হ্যান্ডলিং বাস্তবায়ন ব্লক সম্পূর্ণ স্ক্রিপ্ট ক্র্যাশ না করে এই ত্রুটিগুলি ধরতে এবং পরিচালনা করতে সাহায্য করতে পারে।
- ছায়া DOM ব্যবহার করে আমি কিভাবে গতিশীল পপআপ বন্ধ করতে পারি?
- একটি ছায়া DOM এ আবদ্ধ গতিশীল পপআপগুলি বন্ধ করতে, আপনাকে প্রথমে ছায়া রুট ব্যবহার করে অ্যাক্সেস করতে হবে এবং তারপর ছায়া DOM এর ভিতরে পপআপ বন্ধ বোতামটি সনাক্ত করুন।
ওয়েব স্ক্র্যাপিংয়ের জন্য সেলেনিয়াম ব্যবহার করার সময় ছায়া DOM উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করা চ্যালেঞ্জিং হতে পারে। যাইহোক, জাভাস্ক্রিপ্ট এক্সিকিউশন এবং সুস্পষ্ট অপেক্ষা ব্যবহার করে, আপনি কার্যকরভাবে এমন উপাদানগুলি পরিচালনা করতে পারেন যেগুলি স্ট্যান্ডার্ড পদ্ধতিতে অ্যাক্সেস করা কঠিন।
সঠিকভাবে ত্রুটিগুলি পরিচালনা করে এবং অপেক্ষাকে অন্তর্ভুক্ত করে, আপনি নিশ্চিত করতে পারেন যে আপনার স্ক্র্যাপিং স্ক্রিপ্টগুলি শক্তিশালী এবং নির্ভরযোগ্য। এই কৌশলগুলি ডায়নামিক বিষয়বস্তু এবং ছায়া DOM-এ এমবেড করা পপআপগুলির সাথে কাজ করার সময় সাধারণ সমস্যাগুলি এড়াতে সাহায্য করবে, একটি মসৃণ স্ক্র্যাপিং অভিজ্ঞতা নিশ্চিত করবে।
- থেকে সেলেনিয়ামে ছায়া DOM উপাদানগুলির সাথে ইন্টারঅ্যাক্ট করার তথ্য সেলেনিয়াম ওয়েবড্রাইভার ডকুমেন্টেশন .
- থেকে JavascriptException ত্রুটিগুলি পরিচালনা করার অন্তর্দৃষ্টি স্ট্যাক ওভারফ্লো .
- ওয়েব স্ক্র্যাপিং ডায়নামিক কন্টেন্ট ব্যবহার করার জন্য সর্বোত্তম অনুশীলনের উপর নির্দেশিকা রিয়েল পাইথন .