Python के साथ आवश्यक YouTube डेटा को स्क्रैप करने का तरीका

टिप्पणियाँ: 0

YouTube रचनाकारों को अपने वीडियो के प्रदर्शन का आकलन करना होगा; सकारात्मक और नकारात्मक टिप्पणियों का विश्लेषण करना, और एक ही या विभिन्न श्रेणियों में दूसरों के साथ उनकी सामग्री की तुलना करना आवश्यक हो जाता है।

पोस्ट किए गए वीडियो के माध्यम से मैन्युअल रूप से शिफ्ट करना निर्माता के लिए थकाऊ और समय लेने वाला हो सकता है। यह ठीक है जहां एक YouTube स्क्रैपिंग स्क्रिप्ट अमूल्य हो जाती है। हम इस गाइड में डेटा-एकत्रित प्रक्रिया को स्वचालित करने के लिए डिज़ाइन की गई एक YouTube स्क्रिप्ट विकसित करेंगे।

YouTube से डेटा निकालने के लिए एक स्क्रैपर बनाना

स्क्रिप्ट को सही तरीके से कार्य करने के लिए, हमें कुछ पैकेज स्थापित करने की आवश्यकता है। इंस्टॉल करने के लिए पहला पैकेज सेलेनियम-वायर है, सेलेनियम का एक एक्सटेंशन जो उचित प्रॉक्सी कॉन्फ़िगरेशन को सक्षम करता है, और आवश्यक वर्गों और मॉड्यूल के लिए सेलेनियम स्वयं। इन पैकेजों को स्थापित करने के लिए, अपने कमांड इंटरफ़ेस में निम्न कमांड को निष्पादित करें:

pip install selenium-wire selenium blinker==1.7.0

अब आयात पर ध्यान दें।

चरण 1: पुस्तकालयों और पैकेजों को आयात करना

इस स्तर पर, वेब तत्वों के साथ बातचीत करने के लिए हमारी स्क्रिप्ट में उपयोग किए जाने वाले पुस्तकालयों और पैकेजों को आयात करना महत्वपूर्ण है। इसके अतिरिक्त, हमें स्क्रिप्ट के कुशल निष्पादन को सुनिश्चित करने के लिए डेटा प्रोसेसिंग और रनटाइम प्रबंधन के लिए मॉड्यूल शामिल करना चाहिए।

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: सेलेनियम क्रोम ड्राइवर की स्थापना

जब भी आप पायथन में एक स्क्रिप्ट का उपयोग करके सेलेनियम उदाहरण चलाते हैं, तो स्क्रिप्ट हमारे आईपी पते का उपयोग करती है कि हम जो भी गतिविधि कर रहे हैं, वह हम करना चाहते हैं। यह खतरनाक है, विशेष रूप से YouTube जैसी वेबसाइटों के लिए उनकी वेबसाइट से जानकारी स्क्रैप करने के खिलाफ सख्त नीतियों के साथ, आप बेहतर संदर्भ के लिए उनकी रोबोट फ़ाइल को देख सकते हैं। इसके परिणाम YouTube सामग्री तक पहुँचने से आपके IP पर अस्थायी प्रतिबंध हो सकते हैं।

उस सब से बचने के लिए, कुछ चीजें हैं जो हमें करने की आवश्यकता है। हमें उस प्रॉक्सी के विवरण को घर देने के लिए 3 चर बनाने की आवश्यकता है जिसके माध्यम से हम पृष्ठ तक पहुंचेंगे। फिर हम एक विकल्प चर बनाते हैं, chrome_options, जिसे हम क्रोम वेबड्राइवर उदाहरण में पास कर देंगे, इसलिए सेलेनियम जानता है कि स्क्रैपिंग करते समय किस प्रॉक्सी का उपयोग करना है। हम Chrome_options के लिए तर्क के रूप में प्रॉक्सी विवरण में पारित करते हैं और हमारी प्रॉक्सी सेट है।

# उपयोगकर्ता नाम और पासवर्ड के साथ प्रॉक्सी सर्वर पता निर्दिष्ट करें
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}')
# सेलेनियम-वायर के साथ एक WebDriver उदाहरण बनाएं
driver = wiredriver.Chrome(options=chrome_options)

चरण 3: YouTube वीडियो पेज से जानकारी निकालना

YouTube लैंडिंग पृष्ठ के URL को संग्रहीत करने के लिए "YouTube_url_to_scrape" नामक एक चर बनाएं। इस चर को तब "driver.get ()" विधि में उपयोग किया जाता है ताकि सेलेनियम को स्क्रैपिंग के लिए एक विशिष्ट पृष्ठ खोलने के लिए निर्देशित किया जा सके। इस क्रिया को निष्पादित करने से स्क्रिप्ट चलाने पर एक अलग क्रोम विंडो खुल जाएगी।

youtube_url_to_scrape = ""
# सेलेनियम-तार की बढ़ी हुई क्षमताओं के साथ अपने सेलेनियम स्वचालन का प्रदर्शन करें
driver.get(youtube_url_to_scrape)

अगला, हम "extract _information ()" फ़ंक्शन को परिभाषित करते हैं, जो कि नाम से पता चलता है, पृष्ठ से आवश्यक जानकारी निकालता है।

यह सुनिश्चित करना महत्वपूर्ण है कि पृष्ठ पर सभी तत्व लोड किए गए हैं। ऐसा करने के लिए, हम स्क्रिप्ट को कम से कम "अधिक" बटन उपलब्ध होने और क्लिक करने के लिए स्क्रिप्ट को रुकने के लिए WebDriverwait वर्ग का उपयोग करते हैं, जिसे "तत्व" चर के तहत लागू किया जाता है। एक बार उपलब्ध होने के बाद, सेलेनियम एक जावास्क्रिप्ट क्लिक एक्शन निष्पादित करता है जो वीडियो के पूर्ण विवरण तक पहुंच की अनुमति देता है।

पहले उल्लिखित गतिशील टिप्पणी मुद्दे को संबोधित करने के लिए, हम किसी भी संबंधित मुद्दों को खत्म करने के लिए एक समाधान लागू कर रहे हैं। एक्शन क्लास और टाइम मॉड्यूल का उपयोग करते हुए, हम हर 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)

सेलेनियम वेबड्राइवर का उपयोग करके तत्वों की खोज करने के विभिन्न तरीके हैं। आप इस गाइड के लिए आईडी, class_name, xpath, आदि द्वारा खोज सकते हैं, हम केवल एक विधि के बजाय एक संयोजन का उपयोग करेंगे।

XPath स्क्रैपिंग के दौरान चर का पता लगाने के लिए एक अधिक जटिल अभी तक पैटर्न-आधारित प्रणाली है। इसे सबसे जटिल माना जाता है; हालांकि, क्रोम ने इतना आसान बना दिया है।

Chrome के निरीक्षण टूल का उपयोग करके कोड की समीक्षा करते समय, बस XPATH को कॉपी करने के लिए राइट-क्लिक करें। एक बार कॉपी किए जाने के बाद, आप वांछित जानकारी वाले सभी तत्वों की पहचान करने के लिए `find_elements` फ़ंक्शन का उपयोग कर सकते हैं, जैसे कि वीडियो शीर्षक, विवरण, आदि।

यह ध्यान रखना महत्वपूर्ण है कि पृष्ठ पर कुछ तत्व समान विशेषताओं को साझा कर सकते हैं, जो एक स्ट्रिंग के बजाय एक सूची वापस करने के लिए `find_elements ()` कॉल का कारण बन सकते हैं। ऐसे मामलों में, आपको प्रासंगिक जानकारी के सूचकांक को इंगित करने और पाठ निकालने के लिए सूची की जांच करनी चाहिए।

निष्कर्ष पर, `डेटा` नामक एक शब्दकोश चर वापस आ जाता है, जो स्क्रैपिंग, एर्गो के दौरान सभी सूचनाओं को संलग्न करता है, जो बाद के अनुभाग के लिए एक आवश्यक है।

 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}")

फ़ंक्शन `Orsize_write_data ()` इनपुट के रूप में लौटाए गए `डेटा` को लेता है और इसे एक स्वरूपित 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}')

# सेलेनियम-वायर के साथ एक WebDriver उदाहरण बनाएं
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

सुरक्षित रूप से YouTube की जानकारी के धन का उपयोग करना काफी फायदेमंद है जब अच्छी तरह से तैयार की गई स्क्रिप्ट जो प्लेटफ़ॉर्म नीतियों और नियमों के पालन को सुनिश्चित करने के लिए प्रॉक्सी का उपयोग करती हैं, वे नियोजित हैं। ऊपर चर्चा की गई दृष्टिकोण जिम्मेदार डेटा निष्कर्षण की सुविधा देता है और मंच द्वारा लगाए गए संभावित प्रतिबंधों के जोखिम को कम करता है।

टिप्पणियाँ:

0 टिप्पणियाँ