Người tạo YouTube phải đánh giá hiệu suất của video của họ; Phân tích nhận xét tích cực và tiêu cực, và so sánh nội dung của họ với những người khác trong cùng hoặc các loại khác nhau trở nên cần thiết.
Việc sàng lọc thủ công thông qua các video được đăng có thể tẻ nhạt và tốn thời gian cho người sáng tạo. Đây chính xác là nơi tập lệnh Scraping YouTube trở nên vô giá. Chúng tôi sẽ phát triển một tập lệnh YouTube được thiết kế để tự động hóa quy trình thu thập dữ liệu trong hướng dẫn này.
Để tập lệnh hoạt động chính xác, chúng tôi cần cài đặt một số gói. Gói đầu tiên để cài đặt là Selenium-Wire, một phần mở rộng của selen cho phép cấu hình proxy thích hợp và chính selenium cho các lớp và mô-đun thiết yếu. Để cài đặt các gói này, hãy thực hiện lệnh sau trong giao diện lệnh của bạn:
pip install selenium-wire selenium blinker==1.7.0
Bây giờ chúng ta hãy tập trung vào nhập khẩu.
Ở giai đoạn này, điều quan trọng là nhập các thư viện và các gói sẽ được sử dụng trong tập lệnh của chúng tôi để tương tác với các yếu tố web. Ngoài ra, chúng ta nên bao gồm các mô -đun để xử lý dữ liệu và quản lý thời gian chạy để đảm bảo thực hiện hiệu quả tập lệnh.
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
Mô -đun JSON hỗ trợ chuyển đổi dữ liệu được trích xuất thành dữ liệu JSON được định dạng đúng, đảm bảo trình bày dữ liệu tối ưu. Mặc dù che giấu IP của chúng tôi, mô-đun thời gian rất cần thiết để giới thiệu tính ngẫu nhiên cho các hành động, ngăn chặn sự xuất hiện của hành vi giống như kịch bản.
Ngoài ra, mô -đun này rất quan trọng để đảm bảo rằng các yếu tố chúng ta cần trích xuất dữ liệu từ trang đã được tải. Các nhập khẩu còn lại bao gồm các lớp hoặc mô hình con cần thiết thực hiện các hành động riêng biệt và sẽ được xây dựng trong các phần tiếp theo của mã.
Bất cứ khi nào bạn chạy một phiên bản selen bằng cách sử dụng tập lệnh trong Python, tập lệnh sử dụng địa chỉ IP của chúng tôi cho bất kỳ hoạt động nào mà chúng tôi muốn thực hiện. Điều này là nguy hiểm, đặc biệt đối với các trang web như YouTube với các chính sách nghiêm ngặt đối với thông tin cạo từ trang web của họ, bạn có thể xem tệp robot của họ để có tài liệu tham khảo tốt hơn. Hậu quả của việc này có thể là những hạn chế tạm thời đối với IP của bạn truy cập nội dung YouTube.
Để tránh tất cả những điều đó, có một vài điều chúng ta cần làm. Chúng ta cần tạo 3 biến để chứa các chi tiết của proxy mà qua đó chúng ta sẽ truy cập trang. Sau đó, chúng tôi tạo một biến tùy chọn, Chrome_options, chúng tôi sẽ chuyển vào phiên bản Chrome WebDriver để Selenium biết proxy nào sẽ sử dụng khi cạo. Chúng tôi vượt qua các chi tiết proxy dưới dạng đối số cho Chrome_Options và proxy của chúng tôi được đặt.
# Chỉ định địa chỉ máy chủ proxy với tên người dùng và mật khẩu
proxy_address = ""
proxy_username = ""
proxy_password = ""
# Thiết lập các tùy chọn Chrome với proxy và xác thực
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')
# Tạo một thể hiện webdriver với Selenium-Wire
driver = wiredriver.Chrome(options=chrome_options)
Tạo một biến có tên là “youtube_url_to_scrape” để lưu trữ URL của trang chủ YouTube. Biến này sau đó được sử dụng trong phương thức “driver.get()” để hướng dẫn Selenium mở một trang cụ thể để thu thập dữ liệu. Việc thực hiện hành động này sẽ mở một cửa sổ Chrome riêng biệt khi chạy tập lệnh.
youtube_url_to_scrape = ""
# Thực hiện tự động hóa selen của bạn với khả năng nâng cao của dây selen
driver.get(youtube_url_to_scrape)
Tiếp theo, chúng ta định nghĩa hàm “extract_information()”, đúng như tên gọi, hàm này trích xuất thông tin cần thiết từ trang.
Điều quan trọng là đảm bảo rằng tất cả các yếu tố trên trang được tải. Để làm điều này, chúng tôi sử dụng lớp WebDriverWait để tạm dừng tập lệnh ít nhất là cho đến khi nút "Thêm" có sẵn và nhấp, được triển khai theo biến "Phần tử". Khi có sẵn, Selenium thực hiện hành động nhấp chuột JavaScript cho phép truy cập vào mô tả đầy đủ của video.
Để giải quyết vấn đề bình luận động được đề cập trước đó, chúng tôi đang thực hiện một giải pháp để loại bỏ mọi vấn đề liên quan. Sử dụng lớp hành động và mô -đun thời gian, chúng tôi cuộn xuống hai lần cứ sau 10 giây, đảm bảo xóa càng nhiều bình luận càng tốt. Cách tiếp cận chủ động này bảo vệ chống lại các tắc nghẽn tiềm năng liên quan đến nội dung được tải động.
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)
Có nhiều cách khác nhau để tìm kiếm các yếu tố sử dụng selenium webdriver. Bạn có thể tìm kiếm theo ID, class_name, xpath, v.v. Đối với hướng dẫn này, chúng tôi sẽ sử dụng kết hợp thay vì chỉ một phương thức.
XPath là một hệ thống phức tạp hơn nhưng dựa trên mẫu để định vị các biến trong quá trình cạo. Nó được coi là phức tạp nhất; Tuy nhiên, Chrome đã làm cho điều đó dễ dàng.
Trong khi xem xét mã bằng công cụ kiểm tra Chrome, chỉ cần nhấp chuột phải để sao chép XPath. Sau khi được sao chép, bạn có thể sử dụng hàm `find_elements` để xác định tất cả các yếu tố chứa thông tin mong muốn, chẳng hạn như tiêu đề video, mô tả, v.v.
Điều quan trọng cần lưu ý là các yếu tố nhất định trên trang có thể chia sẻ các thuộc tính tương tự, điều này có thể gây ra cuộc gọi `find_elements ()` để trả về danh sách thay vì một chuỗi. Trong những trường hợp như vậy, bạn phải kiểm tra danh sách để xác định chỉ số thông tin liên quan và trích xuất văn bản.
Kết luận, một biến từ điển có tên là `Data` được trả về, đóng gói tất cả các thông tin được thu thập trong quá trình cạo, Ergo, một điều cần thiết cho phần tiếp theo.
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}")
Hàm organize_write_data() nhận data được trả về làm đầu vào và sắp xếp nó thành một cấu trúc JSON có định dạng. Sau đó, nó ghi dữ liệu đã được sắp xếp này vào một tệp đầu ra có tên "output.json" đồng thời xử lý các lỗi tiềm ẩn trong quá trình ghi tệp.
Cho đến nay, đây là mã đầy đủ của chương trình cạo của chúng tôi:
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
# Chỉ định địa chỉ máy chủ proxy với tên người dùng và mật khẩu
proxy_address = ""
proxy_username = ""
proxy_password = ""
# Thiết lập các tùy chọn Chrome với proxy và xác thực
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')
# Tạo một thể hiện webdriver với Selenium-Wire
driver = wiredriver.Chrome(options=chrome_options)
youtube_url_to_scrape = ""
# Thực hiện tự động hóa selen của bạn với khả năng nâng cao của dây selen
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}")
# Ghi lại dữ liệu vào 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()
Đầu ra trông như thế này:
Khai thác an toàn thông tin của YouTube YouTube có lợi đáng kể khi các tập lệnh được chế tạo tốt sử dụng các ủy nhiệm để đảm bảo tuân thủ các chính sách và quy định của nền tảng được sử dụng. Cách tiếp cận được thảo luận ở trên tạo điều kiện cho việc trích xuất dữ liệu có trách nhiệm và giảm thiểu rủi ro của các hạn chế tiềm năng do nền tảng áp đặt.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bình luận: 0