Cách quét dữ liệu Spotify bằng Python
Tóm tắt được tạo bởi AI:
Dữ liệu danh sách phát Spotify có thể hữu ích để thu thập thông tin về bài hát, nghệ sĩ và các chi tiết khác của bản nhạc. Spotify không cung cấp quyền truy cập chi tiết vào một số dữ liệu nếu không có khóa API, nhưng bằng cách sử dụng Playwright cho Python, chúng ta có thể truy cập nội dung động và trích xuất dữ liệu danh sách phát trực tiếp từ trang web của Spotify. Bài viết này minh họa cách triển khai Playwright để thu thập thông tin như tên bài hát, tên ban nhạc, liên kết và độ dài của các bản nhạc trong danh sách phát Spotify.
Yêu cầu và cài đặt
Để bắt đầu, hãy cài đặt Playwright và lxml để xử lý nội dung trang động và phân tích HTML:
pip install playwright
pip install lxml
Tiếp theo, để kích hoạt trình duyệt Playwright, hãy sử dụng lệnh sau để tải về các tập tin nhị phân của trình duyệt cần thiết:
playwright install
Sau khi thiết lập xong, chúng ta đã sẵn sàng để thu thập dữ liệu từ Spotify.
Quy trình thu thập dữ liệu Spotify: Hướng dẫn từng bước
Nội dung của Spotify được tải động, do đó việc sử dụng requests hoặc các thư viện HTTP đơn giản khác sẽ không thể thu thập được toàn bộ thông tin được JavaScript hiển thị. Playwright là một thư viện tự động hóa trình duyệt cho phép chúng ta tương tác với các trang web động như thể chúng ta đang trực tiếp duyệt trang đó, điều này có nghĩa là chúng ta có thể đợi JavaScript tải xong trước khi thu thập dữ liệu.
Playwright cũng hỗ trợ cấu hình proxy, cho phép chúng ta sử dụng các địa chỉ IP khác nhau nếu cần thiết để tránh giới hạn tốc độ hoặc các hạn chế theo khu vực trên Spotify.
Bên dưới là hướng dẫn chi tiết từng bước để thu thập dữ liệu, kèm theo các ví dụ mã giúp bạn hiểu rõ quy trình một cách trực quan hơn.
Bước 1. Thiết lập hàm để lấy nội dung HTML
Hàm `fetch_html_content` khởi tạo môi trường Playwright, mở một trình duyệt và điều hướng đến URL danh sách phát Spotify. Tại đây, chúng ta đặt headless=False để giao diện trình duyệt vẫn hiển thị (hữu ích cho việc gỡ lỗi); đối với các tác vụ tự động, đặt thành True sẽ tăng tốc quá trình thực thi.
Tùy chọn wait_until='networkidle' sẽ đợi cho đến khi hoạt động mạng ổn định trước khi thu thập nội dung trang, đảm bảo tất cả các phần tử được tải chính xác.
from playwright.async_api import async_playwright
async def fetch_html_content(playlist_url):
async with async_playwright() as p:
# Trình duyệt khởi chạy với thiết lập proxy nếu cần
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
# Điều hướng đến URL
await page.goto(playlist_url, wait_until='networkidle')
# Cho phép thời gian hoạt động mạng để giải quyết
await page.wait_for_timeout(3000)
# Nắm bắt nội dung trang
page_content = await page.content()
# Đóng trình duyệt
await browser.close()
return page_content
Để sử dụng proxy với xác thực địa can IP throng Playwright, hãy định cấu hình chức năng khởi chạy như sau:
browser = await p.chromium.launch(headless=True, proxy={"server": "http://your-proxy-server:port"})
Điều này sẽ định tuyến các yêu cầu thông qua máy chủ proxy được chỉ định, che giấu IP ban đầu của bạn và giúp tránh các hạn chế loại bỏ tiềm năng.
Bước 2. Phân tích nội dung HTML
Với chức năng FromString của LXML, chúng tôi tạo một trình phân tích cú pháp cho nội dung HTML được tìm nạp. Điều này cho phép chúng tôi định vị và trích xuất dữ liệu cụ thể bằng cách sử dụng các biểu thức XPath.
from lxml.html import fromstring
page_content = await fetch_html_content('https link')
parser = fromstring(page_content)
Bước 3. Trích xuất thông tin theo dõi
Với các bộ chọn XPath, chúng tôi thu thập các chi tiết sau cho từng bản nhạc trong danh sách phát:
- Tên theo dõi;
- URL theo dõi;
- Tên nghệ sĩ;
- URL nghệ sĩ;
- Thời lượng theo dõi.
track_names = parser.xpath('//div[@data-testid="tracklist-row"]//a[@data-testid="internal-track-link"]/div/text()')
track_urls = parser.xpath('//div[@data-testid="tracklist-row"]//a[@data-testid="internal-track-link"]/@href')
track_urls_with_domain = [f"https://open.spotify.com/{url}" for url in track_urls]
artist_names = parser.xpath('//div[@data-testid="tracklist-row"]//div[@data-encore-id="text"]/a/text()')
artist_urls = parser.xpath('//div[@data-testid="tracklist-row"]//div[@data-encore-id="text"]/a/@href')
artist_urls_with_domain = [f"https://open.spotify.com/{url}" for url in artist_urls]
track_durations = parser.xpath('//div[@data-testid="tracklist-row"]//div[@class="PAqIqZXvse_3h6sDVxU0"]/div/text()')
Danh sách URL được hoàn thành với miền Spotify để tạo các liên kết đủ điều kiện.
Bước 4. Lưu dữ liệu vào tệp CSV
Sau khi thu thập dữ liệu, chúng tôi viết nó vào một tệp CSV. Mỗi hàng trong tệp chứa tên theo dõi, URL theo dõi, tên nghệ sĩ, URL nghệ sĩ và thời lượng theo dõi.
import csv
rows = zip(track_names, track_urls_with_domain, artist_names, artist_urls_with_domain, track_durations)
csv_filename = "spotify_playlist.csv"
with open(csv_filename, mode='w', newline='') as file:
writer = csv.writer(file)
# Viết tiêu đề
writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
# Viết hàng
writer.writerows(rows)
print(f"Data successfully written to {csv_filename}")
Điều này tạo ra một tệp CSV có cấu trúc tốt, dễ dàng phân tích và sử dụng trong các ứng dụng tiếp theo.
Ví dụ về mã hoàn chỉnh với hỗ trợ proxy
Dưới đây là mã đầy đủ, kết hợp tất cả các bước cho quy trình cạo Spotify hợp lý:
from playwright.async_api import async_playwright
from lxml.html import fromstring
import csv
async def fetch_html_content(playlist_url):
async with async_playwright() as p:
# Trình duyệt khởi chạy, với tùy chọn proxy nếu cần
browser = await p.chromium.launch(headless=False, proxy={"server": "http://your-proxy-server:port", "username": "username", "password": "password"})
page = await browser.new_page()
# Điều hướng đến URL
await page.goto(playlist_url, wait_until='networkidle')
# Đợi bất kỳ hoạt động mạng nào ổn định
await page.wait_for_timeout(3000)
# Nắm bắt nội dung trang
page_content = await page.content()
# Đóng trình duyệt
await browser.close()
return page_content
page_content = asyncio.run(fetch_html_content('https link'))
parser = fromstring(page_content)
# Trích xuất chi tiết
track_names = parser.xpath('//div[@data-testid="tracklist-row"]//a[@data-testid="internal-track-link"]/div/text()')
track_urls = parser.xpath('//div[@data-testid="tracklist-row"]//a[@data-testid="internal-track-link"]/@href')
track_urls_with_domain = [f"https://open.spotify.com/{url}" for url in track_urls]
artist_names = parser.xpath('//div[@data-testid="tracklist-row"]//div[@data-encore-id="text"]/a/text()')
artist_urls = parser.xpath('//div[@data-testid="tracklist-row"]//div[@data-encore-id="text"]/a/@href')
artist_urls_with_domain = [f"https://open.spotify.com/{url}" for url in artist_urls]
track_durations = parser.xpath('//div[@data-testid="tracklist-row"]//div[@class="PAqIqZXvse_3h6sDVxU0"]/div/text()')
# Viết cho CSV
rows = zip(track_names, track_urls_with_domain, artist_names, artist_urls_with_domain, track_durations)
csv_filename = "spotify_playlist.csv"
with open(csv_filename, mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["track_names", "track_urls", "artist_names", "artist_urls", "track_durations"])
writer.writerows(rows)
print(f"Data successfully written to {csv_filename}")
Thu thập dữ liệu danh sách phát Spotify Bing Python với Playwright cho phép truy cập vào nội dung động để trích xuất và phân tích thông tin theo dõi. Bằng cách định cấu hình Playwright với proxy, chúng ta có thể xử lý giới hạn tỷ lệ, tạo ra một cách đáng tin cậy để thu thập dữ liệu danh sách phát. Thiết lập này mở ra các khả năng để phân tích chi tiết và có thể dễ dàng điều chỉnh cho các loại nội dung Spotify khác.
