یوٹیوب تخلیق کاروں کو اپنی ویڈیوز کی کارکردگی کا اندازہ کرنا ہوگا۔ مثبت اور منفی تبصروں کا تجزیہ کرنا ، اور ان کے مواد کو دوسروں کے ساتھ ایک ہی یا مختلف قسموں میں موازنہ کرنا ضروری ہوجاتا ہے۔
پوسٹ کردہ ویڈیوز کے ذریعے دستی طور پر چفٹ کرنا تخلیق کاروں کے لئے تکلیف دہ اور وقت طلب ہوسکتا ہے۔ یہ عین مطابق ہے جہاں یوٹیوب سکریپنگ اسکرپٹ انمول ہوجاتا ہے۔ ہم اس گائیڈ میں ڈیٹا اکٹھا کرنے کے عمل کو خود کار بنانے کے لئے تیار کردہ یوٹیوب اسکرپٹ تیار کریں گے۔
اسکرپٹ کے صحیح طریقے سے کام کرنے کے ل we ، ہمیں کچھ پیکیج انسٹال کرنے کی ضرورت ہے۔ انسٹال کرنے کا پہلا پیکیج سیلینیم وائر ہے ، جو سیلینیم کی ایک توسیع ہے جو مناسب پراکسی ترتیب کو قابل بناتا ہے ، اور خود ہی ضروری کلاسوں اور ماڈیولز کے لئے سیلینیم۔ ان پیکیجوں کو انسٹال کرنے کے لئے ، اپنے کمانڈ انٹرفیس میں درج ذیل کمانڈ پر عمل کریں:
pip install selenium-wire selenium blinker==1.7.0
اب درآمدات پر توجہ دیں۔
اس مرحلے پر ، لائبریریوں اور پیکیجوں کو درآمد کرنا ضروری ہے جو ہمارے اسکرپٹ میں ویب عناصر کے ساتھ بات چیت کرنے کے لئے استعمال ہوں گے۔ مزید برآں ، اسکرپٹ پر موثر عملدرآمد کو یقینی بنانے کے ل 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 ڈیٹا میں تبدیل کرنے میں مدد کرتا ہے ، جس سے زیادہ سے زیادہ ڈیٹا کی پیش کش کو یقینی بناتا ہے۔ ہمارے آئی پی کو نقاب پوش کرنے کے باوجود ، ٹائم ماڈیول عمل میں بے ترتیب پن متعارف کرانے ، اسکرپٹ جیسے طرز عمل کی ظاہری شکل کو روکنے کے لئے ضروری ہے۔
مزید برآں ، یہ ماڈیول اس بات کو یقینی بنانے کے لئے بہت ضروری ہے کہ ہمیں صفحے سے ڈیٹا نکالنے کی ضرورت ہے۔ بقیہ درآمدات میں ضروری طبقات یا سب ماڈلز شامل ہیں جو الگ الگ اقدامات انجام دیتے ہیں اور کوڈ کے بعد کے حصوں میں اس کی وضاحت کی جائے گی۔
جب بھی آپ ازگر میں اسکرپٹ کا استعمال کرتے ہوئے سیلینیم مثال چلاتے ہیں تو ، اسکرپٹ ہمارے 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)
یوٹیوب لینڈنگ پیج کے یو آر ایل کو اسٹور کرنے کے لئے "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}")
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()
آؤٹ پٹ اس طرح لگتا ہے:
یوٹیوب کی معلومات کی دولت کو محفوظ طریقے سے استعمال کرنا نمایاں طور پر فائدہ مند ہے جب اچھی طرح سے تیار کردہ اسکرپٹ جو پراکسیوں کو استعمال کرتے ہیں جو پلیٹ فارم کی پالیسیوں اور ضوابط پر عمل پیرا ہونے کو یقینی بناتے ہیں۔ مذکورہ بالا نقطہ نظر ذمہ دار ڈیٹا نکالنے میں سہولت فراہم کرتا ہے اور پلیٹ فارم کے ذریعہ عائد کردہ امکانی پابندیوں کے خطرے کو کم کرتا ہے۔
تبصرے: 0