ازگر کے ساتھ YouTube کے اہم ڈیٹا کو کھرچنے کا طریقہ

تبصرے: 0

یوٹیوب تخلیق کاروں کو اپنی ویڈیوز کی کارکردگی کا اندازہ کرنا ہوگا۔ مثبت اور منفی تبصروں کا تجزیہ کرنا ، اور ان کے مواد کو دوسروں کے ساتھ ایک ہی یا مختلف قسموں میں موازنہ کرنا ضروری ہوجاتا ہے۔

پوسٹ کردہ ویڈیوز کے ذریعے دستی طور پر چفٹ کرنا تخلیق کاروں کے لئے تکلیف دہ اور وقت طلب ہوسکتا ہے۔ یہ عین مطابق ہے جہاں یوٹیوب سکریپنگ اسکرپٹ انمول ہوجاتا ہے۔ ہم اس گائیڈ میں ڈیٹا اکٹھا کرنے کے عمل کو خود کار بنانے کے لئے تیار کردہ یوٹیوب اسکرپٹ تیار کریں گے۔

YouTube سے ڈیٹا نکالنے کے لئے ایک کھرچنی بنانا

اسکرپٹ کے صحیح طریقے سے کام کرنے کے ل we ، ہمیں کچھ پیکیج انسٹال کرنے کی ضرورت ہے۔ انسٹال کرنے کا پہلا پیکیج سیلینیم وائر ہے ، جو سیلینیم کی ایک توسیع ہے جو مناسب پراکسی ترتیب کو قابل بناتا ہے ، اور خود ہی ضروری کلاسوں اور ماڈیولز کے لئے سیلینیم۔ ان پیکیجوں کو انسٹال کرنے کے لئے ، اپنے کمانڈ انٹرفیس میں درج ذیل کمانڈ پر عمل کریں:

pip install selenium-wire selenium blinker==1.7.0

اب درآمدات پر توجہ دیں۔

مرحلہ 1: لائبریریوں اور پیکیجوں کی درآمد

اس مرحلے پر ، لائبریریوں اور پیکیجوں کو درآمد کرنا ضروری ہے جو ہمارے اسکرپٹ میں ویب عناصر کے ساتھ بات چیت کرنے کے لئے استعمال ہوں گے۔ مزید برآں ، اسکرپٹ پر موثر عملدرآمد کو یقینی بنانے کے ل we ہمیں ڈیٹا پروسیسنگ اور رن ٹائم مینجمنٹ کے لئے ماڈیولز شامل کرنا چاہئے۔

from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import json
import time

JSON ماڈیول نکالا ہوا ڈیٹا کو مناسب طریقے سے فارمیٹڈ JSON ڈیٹا میں تبدیل کرنے میں مدد کرتا ہے ، جس سے زیادہ سے زیادہ ڈیٹا کی پیش کش کو یقینی بناتا ہے۔ ہمارے آئی پی کو نقاب پوش کرنے کے باوجود ، ٹائم ماڈیول عمل میں بے ترتیب پن متعارف کرانے ، اسکرپٹ جیسے طرز عمل کی ظاہری شکل کو روکنے کے لئے ضروری ہے۔

مزید برآں ، یہ ماڈیول اس بات کو یقینی بنانے کے لئے بہت ضروری ہے کہ ہمیں صفحے سے ڈیٹا نکالنے کی ضرورت ہے۔ بقیہ درآمدات میں ضروری طبقات یا سب ماڈلز شامل ہیں جو الگ الگ اقدامات انجام دیتے ہیں اور کوڈ کے بعد کے حصوں میں اس کی وضاحت کی جائے گی۔

مرحلہ 2: سیلینیم کروم ڈرائیور کا قیام

جب بھی آپ ازگر میں اسکرپٹ کا استعمال کرتے ہوئے سیلینیم مثال چلاتے ہیں تو ، اسکرپٹ ہمارے IP ایڈریس کو جو بھی سرگرمی ہے اس کے لئے ہم استعمال کرتے ہیں۔ یہ خطرناک ہے ، خاص طور پر یوٹیوب جیسی ویب سائٹوں کے لئے اپنی ویب سائٹ سے معلومات کو کھرچنے کے خلاف سخت پالیسیوں کے ساتھ ، آپ ان کے روبوٹ فائل کو بہتر حوالہ کے ل check دیکھ سکتے ہیں۔ اس کے نتائج آپ کے آئی پی پر یوٹیوب کے مواد تک رسائی سے عارضی پابندیاں ہوسکتے ہیں۔

ان سب سے بچنے کے لئے ، ہمیں کچھ کام کرنے کی ضرورت ہے۔ ہمیں پراکسی کی تفصیلات رکھنے کے لئے 3 متغیرات بنانے کی ضرورت ہے جس کے ذریعے ہم اس صفحے تک رسائی حاصل کریں گے۔ اس کے بعد ہم ایک آپشن متغیر ، کروم_پشنز تیار کرتے ہیں ، جسے ہم کروم ویب ڈرایور مثال کے طور پر منتقل کریں گے تاکہ سیلینیم جانتا ہو کہ کھرچتے وقت کون سا پراکسی استعمال کرنا ہے۔ ہم پراکسی کی تفصیلات میں کروم_پشنز کے دلائل کے طور پر گزرتے ہیں اور ہمارا پراکسی سیٹ ہے۔

# صارف نام اور پاس ورڈ کے ساتھ پراکسی سرور ایڈریس کی وضاحت کریں
proxy_address = ""
proxy_username = ""
proxy_password = ""
# پراکسی اور توثیق کے ساتھ کروم کے اختیارات مرتب کریں
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')
# سیلینیم وائر کے ساتھ ویب ڈرایور مثال بنائیں
driver = wiredriver.Chrome(options=chrome_options)

مرحلہ 3: یوٹیوب ویڈیو پیج سے معلومات نکالنا

یوٹیوب لینڈنگ پیج کے یو آر ایل کو اسٹور کرنے کے لئے "YouTube_url_to_scrape" کے نام سے ایک متغیر بنائیں۔ اس کے بعد اس متغیر کو "ڈرائیور.جیٹ ()" کے طریقہ کار میں استعمال کیا جاتا ہے تاکہ سیلینیم کو کھرچنے کے ل a ایک مخصوص صفحے کو کھولنے کے لئے ہدایت کی جاسکے۔ جب اسکرپٹ چلایا جاتا ہے تو اس کارروائی کو عملی جامہ پہنانے سے ایک علیحدہ کروم ونڈو کھل جائے گی۔

youtube_url_to_scrape = ""
# سیلینیم وائر کی بہتر صلاحیتوں کے ساتھ اپنے سیلینیم آٹومیشن کو انجام دیں
driver.get(youtube_url_to_scrape)

اگلا ، ہم "نچوڑ _ انفارمیشن ()" فنکشن کی وضاحت کرتے ہیں ، جو نام کے مطابق ، صفحہ سے ضروری معلومات نکالتا ہے۔

اس بات کو یقینی بنانا ضروری ہے کہ صفحے پر موجود تمام عناصر بھری ہوئی ہوں۔ ایسا کرنے کے ل we ، ہم اسکرپٹ کو روکنے کے لئے ویب ڈرایورویٹ کلاس کا استعمال کرتے ہیں جب تک کہ کم از کم "مزید" بٹن دستیاب نہ ہو اور کلک کیا جائے ، جو "عنصر" متغیر کے تحت نافذ کیا جاتا ہے۔ ایک بار دستیاب ہونے کے بعد ، سیلینیم جاوا اسکرپٹ پر کلک ایکشن پر عملدرآمد کرتا ہے جو ویڈیو کی مکمل وضاحت تک رسائی کی اجازت دیتا ہے۔

پہلے بیان کردہ متحرک تبصرے کے مسئلے کو حل کرنے کے ل we ، ہم کسی بھی متعلقہ مسائل کو ختم کرنے کے لئے ایک حل نافذ کر رہے ہیں۔ ایکشن کلاس اور ٹائم ماڈیول کا استعمال کرتے ہوئے ، ہم ہر 10 سیکنڈ میں دو بار نیچے سکرول کرتے ہیں ، اور زیادہ سے زیادہ تبصرے کو یقینی بناتے ہوئے یقینی بناتے ہیں۔ یہ فعال نقطہ نظر متحرک طور پر بھری ہوئی مواد سے وابستہ ممکنہ رکاوٹوں سے بچاتا ہے۔

def extract_information() -> dict:
   try:
       element = WebDriverWait(driver, 15).until(
           EC.presence_of_element_located((By.XPATH, '//*[@id="expand"]'))
       )

       element.click()

       time.sleep(10)
       actions = ActionChains(driver)
       actions.send_keys(Keys.END).perform()
       time.sleep(10)
       actions.send_keys(Keys.END).perform()
       time.sleep(10)

سیلینیم ویب ڈرایور کا استعمال کرتے ہوئے عناصر کی تلاش کے مختلف طریقے ہیں۔ آپ ID ، class_name ، xpath ، وغیرہ کے ذریعہ تلاش کرسکتے ہیں۔ اس گائیڈ کے ل we ، ہم صرف ایک طریقہ کے بجائے ایک مجموعہ استعمال کریں گے۔

ایکسپاتھ کھرچنے کے دوران متغیرات کا پتہ لگانے کے لئے زیادہ پیچیدہ ابھی تک پیٹرن پر مبنی نظام ہے۔ یہ سب سے زیادہ پیچیدہ سمجھا جاتا ہے۔ تاہم ، کروم نے اتنا آسان بنا دیا ہے۔

کروم کے معائنہ ٹول کا استعمال کرتے ہوئے کوڈ کا جائزہ لیتے ہوئے ، ایکسپاتھ کی کاپی کرنے کے لئے سیدھے دائیں کلک کریں۔ ایک بار کاپی کرنے کے بعد ، آپ مطلوبہ معلومات پر مشتمل تمام عناصر ، جیسے ویڈیو عنوان ، تفصیل ، وغیرہ پر مشتمل تمام عناصر کی شناخت کے لئے `Find_elements` فنکشن کا استعمال کرسکتے ہیں۔

یہ نوٹ کرنا ضروری ہے کہ صفحے پر کچھ عناصر اسی طرح کی صفات کا اشتراک کرسکتے ہیں ، جس کی وجہ سے `Find_elements ()` کسی تار کے بجائے فہرست واپس کرنے کے لئے کال کریں۔ ایسے معاملات میں ، آپ کو متعلقہ معلومات کے اشاریہ کی نشاندہی کرنے اور متن کو نکالنے کے ل the فہرست کی جانچ کرنی ہوگی۔

نتیجہ کے طور پر ، `ڈیٹا` نامی ایک لغت متغیر واپس کیا جاتا ہے ، جس سے کھرچنے کے دوران حاصل کی جانے والی تمام معلومات کو شامل کیا جاتا ہے ، اس کے بعد کے حصے کے لئے ایک ضروری ہے۔

 video_title = driver.find_elements(By.XPATH, '//*[@id="title"]/h1')[0].text

   owner = driver.find_elements(By.XPATH, '//*[@id="text"]/a')[0].text

   total_number_of_subscribers = \
       driver.find_elements(By.XPATH, "//div[@id='upload-info']//yt-formatted-string[@id='owner-sub-count']")[
           0].text

   video_description = driver.find_elements(By.XPATH,                                  '//*[@id="description-inline-expander"]/yt-attributed-string/span/span')
   result = []
   for i in video_description:
       result.append(i.text)
   description = ''.join(result)

   publish_date = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[2].text
   total_views = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[0].text

   number_of_likes = driver.find_elements(By.XPATH,                                   '//*[@id="top-level-buttons-computed"]/segmented-like-dislike-button-view-model/yt-smartimation/div/div/like-button-view-model/toggle-button-view-model/button-view-model/button/div')[
       1].text

   comment_names = driver.find_elements(By.XPATH, '//*[@id="author-text"]/span')
   comment_content = driver.find_elements(By.XPATH, '//*[@id="content-text"]/span')
   comment_library = []

   for each in range(len(comment_names)):
       name = comment_names[each].text
       content = comment_content[each].text
       indie_comment = {
           'name': name,
           'comment': content
       }
       comment_library.append(indie_comment)

   data = {
       'owner': owner,
       'subscribers': total_number_of_subscribers,
       'video_title': video_title,
       'description': description,
       'date': publish_date,
       'views': total_views,
       'likes': number_of_likes,
       'comments': comment_library
   }

   return data

except Exception as err:
   print(f"Error: {err}")

مرحلہ 4: JSON فائل میں جمع کردہ ڈیٹا لکھیں

def organize_write_data(data:dict):
    output = json.dumps(data, indent=2, ensure_ascii=False).encode("ascii", "ignore").decode("utf-8")
    try:
        with open("output.json", 'w', encoding='utf-8') as file:
            file.write(output)
    except Exception as err:
        print(f"Error encountered: {err}")

فعل organize_write_data() واپس کیے گئے data کو بطور ان پٹ لیتا ہے اور اسے ایک منظم JSON ساخت میں ترتیب دیتا ہے۔ یہ منظم کردہ ڈیٹا کو "output.json" نامی ایک آؤٹ پٹ فائل میں لکھتا ہے جبکہ فائل لکھنے کے عمل کے دوران ممکنہ غلطیوں کا سامنا بھی کرتا ہے۔

مکمل کوڈ

اب تک ، ہمارے سکریپنگ پروگرام کا مکمل کوڈ یہ ہے:

from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import json
import time

# صارف نام اور پاس ورڈ کے ساتھ پراکسی سرور ایڈریس کی وضاحت کریں
proxy_address = ""
proxy_username = ""
proxy_password = ""

# پراکسی اور توثیق کے ساتھ کروم کے اختیارات مرتب کریں
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# سیلینیم وائر کے ساتھ ویب ڈرایور مثال بنائیں
driver = wiredriver.Chrome(options=chrome_options)

youtube_url_to_scrape = ""

# سیلینیم وائر کی بہتر صلاحیتوں کے ساتھ اپنے سیلینیم آٹومیشن کو انجام دیں
driver.get(youtube_url_to_scrape)


def extract_information() -> dict:
   try:
       element = WebDriverWait(driver, 15).until(
           EC.presence_of_element_located((By.XPATH, '//*[@id="expand"]'))
       )
       element.click()

       time.sleep(10)
       actions = ActionChains(driver)
       actions.send_keys(Keys.END).perform()
       time.sleep(10)
       actions.send_keys(Keys.END).perform()
       time.sleep(10)

       video_title = driver.find_elements(By.XPATH, '//*[@id="title"]/h1')[0].text

       owner = driver.find_elements(By.XPATH, '//*[@id="text"]/a')[0].text
       total_number_of_subscribers = \
           driver.find_elements(By.XPATH, "//div[@id='upload-info']//yt-formatted-string[@id='owner-sub-count']")[
               0].text

       video_description = driver.find_elements(By.XPATH,
                                                '//*[@id="description-inline-expander"]/yt-attributed-string/span/span')
       result = []
       for i in video_description:
           result.append(i.text)
       description = ''.join(result)

       publish_date = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[2].text
       total_views = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[0].text

       number_of_likes = driver.find_elements(By.XPATH,
                                              '//*[@id="top-level-buttons-computed"]/segmented-like-dislike-button-view-model/yt-smartimation/div/div/like-button-view-model/toggle-button-view-model/button-view-model/button/div')[
           1].text

       comment_names = driver.find_elements(By.XPATH, '//*[@id="author-text"]/span')
       comment_content = driver.find_elements(By.XPATH,
                                              '//*[@id="content-text"]/span')
       comment_library = []

       for each in range(len(comment_names)):
           name = comment_names[each].text
           content = comment_content[each].text
           indie_comment = {
               'name': name,
               'comment': content
           }
           comment_library.append(indie_comment)

       data = {
           'owner': owner,
           'subscribers': total_number_of_subscribers,
           'video_title': video_title,
           'description': description,
           'date': publish_date,
           'views': total_views,
           'likes': number_of_likes,
           'comments': comment_library
       }

       return data

   except Exception as err:
       print(f"Error: {err}")


# JSON کو ڈیٹا ریکارڈ کریں
def organize_write_data(data: dict):
   output = json.dumps(data, indent=2, ensure_ascii=False).encode("ascii", "ignore").decode("utf-8")
   try:
       with open("output.json", 'w', encoding='utf-8') as file:
           file.write(output)
   except Exception as err:
       print(f"Error encountered: {err}")


organize_write_data(extract_information())
driver.quit()

نتائج

آؤٹ پٹ اس طرح لگتا ہے:

Screenshot_1.png

یوٹیوب کی معلومات کی دولت کو محفوظ طریقے سے استعمال کرنا نمایاں طور پر فائدہ مند ہے جب اچھی طرح سے تیار کردہ اسکرپٹ جو پراکسیوں کو استعمال کرتے ہیں جو پلیٹ فارم کی پالیسیوں اور ضوابط پر عمل پیرا ہونے کو یقینی بناتے ہیں۔ مذکورہ بالا نقطہ نظر ذمہ دار ڈیٹا نکالنے میں سہولت فراہم کرتا ہے اور پلیٹ فارم کے ذریعہ عائد کردہ امکانی پابندیوں کے خطرے کو کم کرتا ہے۔

تبصرے:

0 تبصرے