জাভাস্ক্রিপ্ট-সক্ষম ওয়েবপৃষ্ঠাগুলি থেকে একটি URL ডাউনলোড করতে Python 3.x কীভাবে ব্যবহার করবেন

JavaScript

জাভাস্ক্রিপ্ট-নির্ভর পৃষ্ঠাগুলি থেকে সামগ্রী ডাউনলোড করার চ্যালেঞ্জগুলি অতিক্রম করা

ওয়েবপৃষ্ঠাগুলি থেকে ডাউনলোডগুলি স্বয়ংক্রিয় করতে পাইথন ব্যবহার করার সময়, আপনি এমন পরিস্থিতির সম্মুখীন হতে পারেন যেখানে একটি ওয়েবপৃষ্ঠার সঠিক কার্যকারিতার জন্য JavaScript সক্ষম করা প্রয়োজন৷ এটি হতাশাজনক হতে পারে, যেমন লাইব্রেরিগুলি জাভাস্ক্রিপ্ট এক্সিকিউশন পরিচালনা করার জন্য ডিজাইন করা হয়নি। এরকম একটি উদাহরণ হল JFrog আর্টিফ্যাক্টরি, যা সামগ্রী প্রদর্শন করতে বা ডাউনলোডের অনুমতি দিতে জাভাস্ক্রিপ্টের প্রয়োজন।

ঐতিহ্যগত ওয়েব স্ক্র্যাপিং, আপনি ব্যবহার করতে পারেন বা ওয়েবপৃষ্ঠার সামগ্রী আনতে। যাইহোক, যে পৃষ্ঠাগুলি জাভাস্ক্রিপ্টের উপর খুব বেশি নির্ভর করে, এই লাইব্রেরিগুলি কম পড়ে কারণ তারা গতিশীল সামগ্রী রেন্ডারিং পরিচালনা করতে পারে না। সুতরাং, এই সীমাবদ্ধতা কাটিয়ে উঠতে আপনার আরও উন্নত সরঞ্জামের প্রয়োজন হবে।

সৌভাগ্যবশত, পাইথন জাভাস্ক্রিপ্ট-সক্ষম পৃষ্ঠাগুলি পরিচালনা করার জন্য বিকল্পগুলি অফার করে। টুলের মত বা সম্পূর্ণ ব্রাউজার ইমুলেশন সক্ষম করুন, আপনাকে এই ধরনের পৃষ্ঠাগুলির সাথে যোগাযোগ করতে এবং ডাউনলোড করার অনুমতি দেয়। এই লাইব্রেরিগুলি একটি বাস্তব ব্রাউজার পরিবেশ অনুকরণ করতে পারে যেখানে জাভাস্ক্রিপ্ট সম্পূর্ণরূপে সমর্থিত।

এই নিবন্ধটি কীভাবে ব্যবহার করা থেকে সুইচ করতে হয় তা অন্বেষণ করবে জাভাস্ক্রিপ্ট-সক্ষম ওয়েবপৃষ্ঠাগুলি থেকে সামগ্রী অ্যাক্সেস এবং ডাউনলোড করার জন্য আরও সক্ষম লাইব্রেরিতে, আপনার অটোমেশন কাজগুলি সুচারুভাবে চালানো নিশ্চিত করে৷

আদেশ ব্যবহারের উদাহরণ
webdriver.Chrome() সেলেনিয়ামে একটি ক্রোম ব্রাউজার ইনস্ট্যান্স শুরু করে। জাভাস্ক্রিপ্ট-ভারী পৃষ্ঠাগুলি লোড করার জন্য একটি ব্রাউজার পরিবেশ অনুকরণ করার জন্য এই কমান্ডটি অত্যন্ত গুরুত্বপূর্ণ।
options.add_argument('--headless') সেলেনিয়াম ব্রাউজারটিকে হেডলেস মোডে চালানোর জন্য কনফিগার করে, যার মানে ব্রাউজারটি একটি GUI ছাড়াই কাজ করে। এটি ব্রাউজার উইন্ডো প্রদর্শন না করে স্বয়ংক্রিয় স্ক্রিপ্ট চালানোর জন্য দরকারী।
time.sleep() একটি নির্দিষ্ট সময়ের জন্য স্ক্রিপ্টের সম্পাদনে বিরতি দেয়। এই প্রেক্ষাপটে, এটি ওয়েবপেজে জাভাস্ক্রিপ্টকে পরবর্তী ক্রিয়াকলাপের সাথে এগিয়ে যাওয়ার আগে সম্পূর্ণরূপে লোড হওয়ার জন্য সময় দেয়৷
page.content() Pyppeteer-এ, এই কমান্ডটি গতিশীলভাবে রেন্ডার করা জাভাস্ক্রিপ্ট সামগ্রী সহ ওয়েব পৃষ্ঠার সম্পূর্ণ বিষয়বস্তু পুনরুদ্ধার করে, যা চূড়ান্ত HTML আউটপুট সংরক্ষণের জন্য অপরিহার্য।
await page.waitForSelector() এগিয়ে যাওয়ার আগে একটি নির্দিষ্ট HTML উপাদান লোড হওয়ার জন্য অপেক্ষা করে। জাভাস্ক্রিপ্ট-ভারী পৃষ্ঠাগুলির সাথে কাজ করার সময় বিষয়বস্তু বের করার আগে প্রয়োজনীয় উপাদানগুলি রেন্ডার করা হয়েছে তা নিশ্চিত করার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ৷
session.get() Requests-HTML থেকে এই কমান্ড প্রদত্ত URL-এ একটি GET অনুরোধ পাঠায়। কোনো জাভাস্ক্রিপ্ট উপাদান রেন্ডার করার আগে ওয়েবপেজ আনতে এটি এখানে ব্যবহার করা হয়।
response.html.render() রিকোয়েস্ট-এইচটিএমএল লাইব্রেরির মধ্যে একটি ওয়েবপেজে জাভাস্ক্রিপ্ট এক্সিকিউট করে। সম্পূর্ণ ব্রাউজারের প্রয়োজন ছাড়াই জাভাস্ক্রিপ্ট-সক্ষম পৃষ্ঠাগুলি পরিচালনা করার জন্য এই কমান্ডটি কেন্দ্রীয়।
launch(headless=True) Pyppeteer-এ একটি হেডলেস ব্রাউজার চালু করে, সেলেনিয়ামের মতো। এটি একটি গ্রাফিকাল ব্রাউজার উইন্ডো না খুলেই স্ক্রিপ্টটিকে জাভাস্ক্রিপ্ট-ভারী ওয়েবপৃষ্ঠাগুলিতে অ্যাক্সেস এবং ইন্টারঅ্যাক্ট করতে দেয়।
with open() পাইথনে লেখার জন্য একটি ফাইল খোলে। এই ক্ষেত্রে, এটি ওয়েবপৃষ্ঠা থেকে পুনরুদ্ধার করা HTML সামগ্রীকে আরও প্রক্রিয়াকরণ বা বিশ্লেষণের জন্য একটি ফাইলে সংরক্ষণ করতে ব্যবহৃত হয়।

জাভাস্ক্রিপ্ট-সক্ষম পৃষ্ঠাগুলি থেকে ডাউনলোড করতে পাইথন ব্যবহার করা

ঐতিহ্যগত পাইথন ওয়েব স্ক্র্যাপিং, লাইব্রেরি পছন্দ করে প্রায়ই ওয়েবপেজ থেকে সরাসরি সামগ্রী ডাউনলোড করতে ব্যবহৃত হয়। যাইহোক, জাভাস্ক্রিপ্ট-ভারী সাইটগুলির সাথে কাজ করার সময়, যেমন JFrog আর্টিফ্যাক্টরি, এই লাইব্রেরিগুলি কম পড়ে। প্রাথমিক কারণ হল যে ওয়েবপেজটি গতিশীলভাবে সামগ্রী লোড করার জন্য জাভাস্ক্রিপ্টের প্রয়োজন, যা অনুরোধ সামলাতে পারে না। এটি কাটিয়ে উঠতে, আমরা এর মতো সমাধানগুলি চালু করেছি , , এবং অনুরোধ-এইচটিএমএল, যা জাভাস্ক্রিপ্ট কার্যকর করার অনুমতি দেয়। এই সরঞ্জামগুলি একটি ব্রাউজার পরিবেশ অনুকরণ করে, পাইথন স্ক্রিপ্টগুলিকে জাভাস্ক্রিপ্ট-নির্ভর ওয়েবপৃষ্ঠাগুলি থেকে সামগ্রী অ্যাক্সেস এবং ডাউনলোড করতে সক্ষম করে।

সেলেনিয়াম ব্যবহার করে প্রথম পদ্ধতিতে একটি ব্রাউজার ইনস্ট্যান্স চালু করা জড়িত যা জাভাস্ক্রিপ্ট রেন্ডার করতে পারে। এটি আমাদের পৃষ্ঠার উত্স কোড বের করার আগে পৃষ্ঠাটি সম্পূর্ণরূপে লোড হওয়ার জন্য অপেক্ষা করার অনুমতি দেয়৷ এটি বিশেষভাবে উপযোগী যখন পৃষ্ঠার বিষয়বস্তু গতিশীলভাবে তৈরি করা হয়। উদাহরণস্বরূপ, ব্যবহার করে কমান্ড একটি ব্রাউজার শুরু করে এবং তারপর লক্ষ্য URL অ্যাক্সেস করে। ব্যবহার করে , আমরা নিশ্চিত করি যে জাভাস্ক্রিপ্ট লোড করার জন্য যথেষ্ট সময় দেওয়া হয়েছে। অবশেষে, নিষ্কাশন করা পৃষ্ঠার বিষয়বস্তু একটি ফাইলে সংরক্ষিত হয়, যা আমাদেরকে একটি স্ট্যাটিক আকারে প্রয়োজনীয় ওয়েবপৃষ্ঠা প্রদান করে।

দ্বিতীয় পদ্ধতিতে, আমরা Pyppeteer নিযুক্ত করেছি, Puppeteer-এর জন্য একটি পাইথন মোড়ক। Pyppeteer হল আরেকটি শক্তিশালী টুল যা জাভাস্ক্রিপ্ট এক্সিকিউশন পরিচালনা করার জন্য ডিজাইন করা হয়েছে। সেলেনিয়ামের মতো, Pyppeteer একটি হেডলেস ব্রাউজার চালু করে যা ওয়েবপৃষ্ঠায় নেভিগেট করে, জাভাস্ক্রিপ্ট চালানোর জন্য অপেক্ষা করে এবং তারপর সামগ্রীটি পুনরুদ্ধার করে। Pyppeteer ব্যবহার করার একটি মূল সুবিধা হল এটি ব্রাউজিং সেশনের উপর আরো নিয়ন্ত্রণ প্রদান করে, যেমন কমান্ড ব্যবহার করে নির্দিষ্ট উপাদান লোড হওয়ার জন্য অপেক্ষা করা . এটি নিশ্চিত করে যে স্ক্রিপ্ট ডাউনলোড করার চেষ্টা করার আগে প্রয়োজনীয় পৃষ্ঠার বিষয়বস্তু সম্পূর্ণরূপে রেন্ডার করা হয়েছে।

তৃতীয় সমাধানটি রিকোয়েস্ট-এইচটিএমএল লাইব্রেরি ব্যবহার করে, যা সেলেনিয়াম বা পাইপেটিয়ারের মতো সম্পূর্ণ ব্রাউজার ছাড়াই জাভাস্ক্রিপ্ট রেন্ডার করার প্রক্রিয়াটিকে সহজ করে। রিকোয়েস্ট-এইচটিএমএল ব্যবহার করে আমরা একটি HTTP সেশন শুরু করতে পারি ওয়েবপেজ আনতে, তারপর জাভাস্ক্রিপ্ট দিয়ে চালান পদ্ধতি সম্পূর্ণ ব্রাউজার সিমুলেশন পদ্ধতির তুলনায় এই সমাধানটি হালকা এবং যখন আপনার সম্পূর্ণ ব্রাউজারের ওভারহেডের প্রয়োজন হয় না তখন এটি প্রায়শই আরও উপযুক্ত। এটি সহজ জাভাস্ক্রিপ্ট অপারেশনের জন্য বিশেষভাবে উপযোগী, এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে একটি সর্বোত্তম পছন্দ করে তোলে।

পাইথনে জাভাস্ক্রিপ্ট-সক্ষম পৃষ্ঠাগুলির সাথে URL ডাউনলোড করা হচ্ছে

এই সমাধানটি জাভাস্ক্রিপ্ট-ভারী পৃষ্ঠাগুলি পরিচালনা করতে সেলেনিয়াম, একটি পাইথন লাইব্রেরি ব্যবহার করে। সেলেনিয়াম আপনাকে একটি ওয়েব ব্রাউজার নিয়ন্ত্রণ করতে দেয়, যা আপনাকে জাভাস্ক্রিপ্ট এক্সিকিউশন অনুকরণ করতে এবং গতিশীল সামগ্রী পুনরুদ্ধার করতে সক্ষম করে।

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time
def download_using_selenium(url, username, apikey):
    # Setup Selenium WebDriver
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.get(url)
    time.sleep(3)  # Wait for JavaScript to load
    
    # Assuming basic authentication via URL for this example
    auth_url = f'{url}?username={username}&password={apikey}'
    driver.get(auth_url)
    
    # Extract content
    page_content = driver.page_source
    
    # Save to file
    with open("download_selenium.html", "w") as file:
        file.write(page_content)
    
    driver.quit()
    print("Download complete using Selenium.")

জাভাস্ক্রিপ্ট-সক্ষম পৃষ্ঠাগুলি ডাউনলোড করার জন্য Pyppeteer ব্যবহার করা

এই সমাধানটি Pyppeteer ব্যবহার করে, Puppeteer-এর একটি পাইথন পোর্ট (হেডলেস ব্রাউজার), যা জাভাস্ক্রিপ্ট চালাতে পারে এবং গতিশীলভাবে পৃষ্ঠার বিষয়বস্তু পুনরুদ্ধার করতে পারে।

import asyncio
from pyppeteer import launch
async def download_using_pyppeteer(url, username, apikey):
    # Launch headless browser
    browser = await launch(headless=True)
    page = await browser.newPage()
    
    # Basic auth and URL loading
    auth_url = f'{url}?username={username}&password={apikey}'
    await page.goto(auth_url)
    
    # Wait for the JavaScript to load
    await page.waitForSelector('body')
    
    # Extract page content
    content = await page.content()
    
    # Save to file
    with open("download_pyppeteer.html", "w") as file:
        file.write(content)
    
    await browser.close()
    print("Download complete using Pyppeteer.")
# Run the async function
asyncio.get_event_loop().run_until_complete(download_using_pyppeteer("https://example.com", "user", "key"))

জাভাস্ক্রিপ্ট রেন্ডারিং পরিচালনার জন্য অনুরোধ-এইচটিএমএল ব্যবহার করা

এই পদ্ধতিটি রিকোয়েস্টস-এইচটিএমএল লাইব্রেরি ব্যবহার করে, যা সম্পূর্ণ ব্রাউজারের প্রয়োজন ছাড়াই সহজ জাভাস্ক্রিপ্ট রেন্ডারিংয়ের অনুমতি দেয়।

from requests_html import HTMLSession
def download_using_requests_html(url, username, apikey):
    session = HTMLSession()
    
    # Make the request
    auth_url = f'{url}?username={username}&password={apikey}'
    response = session.get(auth_url)
    
    # Render the JavaScript
    response.html.render()
    
    # Save the page content
    with open("download_requests_html.html", "w") as file:
        file.write(response.html.html)
    
    print("Download complete using Requests-HTML.")
download_using_requests_html("https://example.com", "user", "key")

জাভাস্ক্রিপ্ট-সক্ষম পৃষ্ঠাগুলির জন্য পাইথন ওয়েব স্ক্র্যাপিং উন্নত করা

জাভাস্ক্রিপ্ট-ভারী ওয়েবপৃষ্ঠাগুলি স্ক্র্যাপ করার সময়, একটি সাধারণ চ্যালেঞ্জ হল প্রমাণীকরণ বা API কী সীমাবদ্ধতাগুলিকে বাইপাস করা, বিশেষত JFrog আর্টিফ্যাক্টরির মতো অ্যাপ্লিকেশনগুলিতে। যদিও আমরা আগে সেলেনিয়াম এবং পাইপেটিয়ারের মতো সরঞ্জামগুলির সাথে ব্রাউজার অটোমেশন অন্বেষণ করেছি, সেখানে অন্যান্য সমাধান রয়েছে যা HTTP প্রতিক্রিয়াগুলি পরিচালনা করার উপর আরও বেশি ফোকাস করে। উদাহরণস্বরূপ, এপিআইগুলিকে একীভূত করা এবং শিরোনামগুলিকে লিভারেজ করা একটি সম্পূর্ণ ব্রাউজার সিমুলেশনের ওভারহেড ছাড়াই প্রমাণীকরণ প্রম্পটগুলিকে বাইপাস করতে বা আরও নির্দিষ্ট সামগ্রী পুনরুদ্ধার করতে সহায়তা করতে পারে৷

আরেকটি মূল দিক হল কিভাবে এই লাইব্রেরিগুলি জটিল ফর্মগুলি পরিচালনা করে, যেমন লগইন বা API টোকেন ইনপুটের জন্য প্রয়োজনীয়। একটি সাধারণ সমাধান যেমন পাইথন লাইব্রেরি ব্যবহার করে ফর্ম জমা অনুকরণ জড়িত . এটি জাভাস্ক্রিপ্ট এক্সিকিউশনের প্রয়োজন ছাড়াই সার্ভার-সাইড প্রমাণীকরণের সাথে নির্বিঘ্ন মিথস্ক্রিয়া করার অনুমতি দেয়, সম্পদ সংরক্ষণ করে। উপরন্তু, আরো নিরাপদ পৃষ্ঠাগুলির জন্য, আপনার স্ক্রিপ্টে সেশন ম্যানেজমেন্ট এবং টোকেন-ভিত্তিক প্রমাণীকরণের মতো বৈশিষ্ট্যগুলি যোগ করা উল্লেখযোগ্যভাবে কর্মক্ষমতা বাড়াতে পারে।

ক্যাপচা চ্যালেঞ্জগুলির মতো সম্ভাব্য সমস্যাগুলি নিয়ে আলোচনা করাও গুরুত্বপূর্ণ, যা কাজগুলি স্ক্র্যাপিং বা স্বয়ংক্রিয় করার সময় একটি বাধা হতে পারে৷ ক্যাপচাগুলির সাথে মোকাবিলা করার জন্য, কিছু বিকাশকারী তৃতীয় পক্ষের পরিষেবাগুলি বেছে নেয় যা স্বয়ংক্রিয়ভাবে ক্যাপচা সমাধান করে। অন্যরা মেশিন লার্নিং অ্যালগরিদমগুলিকে একীভূত করে, যদিও এটি আরও জটিল হতে পারে। এই অতিরিক্ত নিরাপত্তা ব্যবস্থাগুলি বোঝার ফলে আপনি জাভাস্ক্রিপ্ট-ভিত্তিক প্ল্যাটফর্মগুলির সাথে ইন্টারঅ্যাক্ট করার সময় আপনার পাইথন স্ক্রিপ্টটি কার্যকরীভাবে চলে তা নিশ্চিত করে চ্যালেঞ্জগুলির একটি বিস্তৃত পরিসর পরিচালনা করার জন্য আপনার স্ক্রিপ্টগুলি প্রস্তুত করতে সহায়তা করে৷

  1. আমি পাইথনের সাথে জাভাস্ক্রিপ্ট-রেন্ডার করা সামগ্রী কীভাবে স্ক্র্যাপ করতে পারি?
  2. এর মতো টুল ব্যবহার করুন , , বা ওয়েবপেজ থেকে সামগ্রী আনার সময় জাভাস্ক্রিপ্ট এক্সিকিউশন পরিচালনা করতে।
  3. জাভাস্ক্রিপ্ট-ভারী ওয়েবসাইটগুলি পরিচালনা করার জন্য সেরা টুল কি?
  4. জটিল জাভাস্ক্রিপ্ট-ভারী সাইটগুলির জন্য প্রায়ই সেরা পছন্দ কারণ এটি বাস্তব ব্রাউজার ইন্টারঅ্যাকশন অনুকরণ করে। এছাড়াও অত্যন্ত কার্যকর।
  5. আমি কিভাবে ওয়েব স্ক্র্যাপিং এ প্রমাণীকরণ পরিচালনা করব?
  6. আপনি ব্যবহার করতে পারেন HTTP হেডারে API কী এবং টোকেন পাঠিয়ে মৌলিক এবং টোকেন-ভিত্তিক প্রমাণীকরণ পরিচালনা করার জন্য লাইব্রেরি।
  7. স্ক্র্যাপ করার সময় আমি কি ক্যাপচা বাইপাস করতে পারি?
  8. হ্যাঁ, ক্যাপচা-সমাধান পরিষেবাগুলি ব্যবহার করে বা মেশিন লার্নিং অ্যালগরিদমগুলিকে একীভূত করে৷ যাইহোক, এটি জটিলতা যোগ করে এবং সমস্ত ব্যবহারের ক্ষেত্রে ব্যবহারিক নাও হতে পারে।
  9. সহজ স্ক্র্যাপিং কাজের জন্য ব্রাউজার অটোমেশন এড়ানো কি সম্ভব?
  10. হ্যাঁ, সহজ কাজের জন্য, গ্রন্থাগার বা সম্পূর্ণ ব্রাউজার অটোমেশনের প্রয়োজন ছাড়াই ডেটা আনয়ন পরিচালনা করতে পারে।

জাভাস্ক্রিপ্ট-ভারী ওয়েবপৃষ্ঠাগুলি থেকে সামগ্রী অ্যাক্সেস করার জন্য কেবলমাত্র মৌলিক HTTP অনুরোধের চেয়ে বেশি প্রয়োজন। Selenium এবং Pyppeteer-এর মতো টুলস ব্যবহার করে, আমরা ব্রাউজার এনভায়রনমেন্টের অনুকরণ করতে পারি যা জাভাস্ক্রিপ্ট চালায় এবং একটি ওয়েবপৃষ্ঠার সম্পূর্ণ বিষয়বস্তু পুনরুদ্ধার করে। এই সরঞ্জামগুলি অটোমেশন কাজের জন্য নমনীয়তা প্রদান করে।

যদিও ব্রাউজার অটোমেশন আরও সম্পদ-নিবিড়, এটি জটিল পৃষ্ঠাগুলি পরিচালনা করার জন্য একটি নির্ভরযোগ্য সমাধান। সহজ ক্ষেত্রে, অনুরোধ-এইচটিএমএল একটি হালকা বিকল্প হতে পারে। সঠিক টুল নির্বাচন করা সাইটের জটিলতা এবং আপনার প্রকল্পের নির্দিষ্ট চাহিদার উপর নির্ভর করে।

  1. জাভাস্ক্রিপ্ট-ভারী পৃষ্ঠাগুলির সাথে ওয়েব স্ক্র্যাপিংয়ের জন্য সেলেনিয়াম ব্যবহারের তথ্য অফিসিয়াল সেলেনিয়াম ডকুমেন্টেশন থেকে উল্লেখ করা হয়েছিল। এটি এখানে অ্যাক্সেস করুন: সেলেনিয়াম ডকুমেন্টেশন .
  2. গতিশীল জাভাস্ক্রিপ্ট বিষয়বস্তু পরিচালনার জন্য Pyppeteer-এর বাস্তবায়ন Pyppeteer-এর GitHub পৃষ্ঠার বিবরণের উপর ভিত্তি করে। আপনি এখানে আরো খুঁজে পেতে পারেন: Pyppeteer GitHub .
  3. অনুরোধ এবং অনুরোধ-এইচটিএমএল লাইব্রেরির জন্য, অনুরোধ-এইচটিএমএল ডকুমেন্টেশন থেকে অন্তর্দৃষ্টি নেওয়া হয়েছে, যা পাইথনে জাভাস্ক্রিপ্ট রেন্ডারিং পরিচালনা করার একটি গভীর উপলব্ধি প্রদান করে: অনুরোধ-এইচটিএমএল ডকুমেন্টেশন .
  4. প্রমাণীকরণ এবং API ব্যবহার পরিচালনার জন্য সর্বোত্তম অনুশীলনগুলি রিয়েল পাইথনে পাওয়া পাইথন ওয়েব স্ক্র্যাপিং কৌশলগুলির নিবন্ধগুলি দ্বারা অনুপ্রাণিত হয়েছিল: রিয়েল পাইথন .