Selenium không khó
| | |

Selenium không khó: Lấy tất cả url video của một playlist trên youtube

This entry is part 3 of 3 in the series Selenium không khó

Chào các bạn đã quay lại với Series mang tên: Selenium không khó của Lập trình không khó. Ở bài viết trước mình đã hướng dẫn các bạn cách để tự động đăng nhập facebook rồi. Trong bài hôm nay, mình sẽ hướng dẫn các bạn xây dựng ứng dụng đầu tiên: tự động đăng nhập facebook với Selenium. Trong bài thứ 3 này mình sẽ chia sẻ tới các bạn ý tưởng và cách để lấy tất cả url video của một playlist trên youutube nhé.

Một số lưu ý trước khi thực hiện

  • Youtube là một mạng xã hội video lớn và chủ sở hữu của nó là Google. Do đó, việc chúng ta thu thập dữ liệu trên trang này sẽ gặp đôi chút khó khăn hơn so với các website thông thường khác.
  • Hiện tại, theo mình kiểm tra thì youtube không biết bằng cách nào họ chặn việc thực thi các lệnh javascript của chúng ta trên trang của họ. Vấn đề này ảnh hưởng ra sao lát nữa mình sẽ phân tích cho các bạn.
  • Nếu chúng ta muốn code một lần và dùng lâu dài, hãy nghĩ đến trường hợp website của họ thay đổi cấu trúc html. Khi đó, code của chúng ta sẽ ít nhiều bị ảnh hưởng, khả năng làm lại từ đầu là rất cao.

Thế nào là một playlist trên Youtube?

Một playlist trên Youtube là một danh sách video do người dùng tạo ra, các video trong playlist này thường là các video của một series hoặc có cùng nội dung. Mục đích của playlist là để người dùng tiện theo dõi các video liên quan của một channel.

Dưới đây là một hình ảnh một playlist video:

Hình ảnh cho trang playlist trên Youtube
Hình ảnh cho trang playlist trên Youtube

Khi bạn vào trang playlist của Youtube, bạn sẽ nhìn thấy địa chỉ URL của trình duyệt đang hiển thị có dạng sau:

Ở đây, bạn chú ý cho mình <play_list_id> nhé, vì chúng ta sẽ sử dụng nó làm input của bài toán lấy tất cả url video của một playlist trên youutube.

Khó khăn khi giải quyết bài toán này

Trong quá trình mình làm, mình gặp phải những khó khăn sau đây:

  • Trang playlist không hiển thị toàn bộ video trong playlist đó sau khi tải trang, phải cuộn xuống thì nó mới hiển thị tiếp.
  • Trang playlist của Youtube cũng như hầu hết các website khác, họ đều sử dụng JavaScript và dùng Infinity loading để tải và hiển thị dữ liệu. Cơ chế của Infinity loading là chỉ load khi người dùng cuộn tới cuối trang, tức là nếu không cuộn thì không load ra.
  • Trang này chặn excute javascript, nếu họ không chặn thì có lẽ có nhiều cách làm hơn(cái này mới họ mới thêm vào gần đây thôi)

Ý tưởng lấy url video playlist trên Youtube

Ý tưởng thực hiện

Ở đây mình có biết có 2 cách khác nhau. Nhưng mình sẽ hướng dẫn sử dụng Selenium để lấy. Vì nó liên quan tới series này, và bản thân mình không thích dùng API của Google cho lắm 🙁

Sử dụng Youtube Data API

Các bạn tự trải nghiệm nha. Chỉ cần search youtube data api và đọc hướng dẫn của họ để làm hoặc tìm các sample mà mọi người hướng dẫn.

Sử dụng Selenium + ý tưởng táo bạo

Chúng ta là sẽ cuộn đến cuối trang của playlist cho tới khi nào không thể cuộn được nữa. Khi đó, chúng ta sẽ có toàn bộ source code của trang playlist với danh sách đầy đủ tất cả các video trong playlist này.

Sau khi có source code thì bạn chỉ cần tìm cách lấy hết các url video ra là được. Ở đây mình dùng regex cho nhanh. Sau đó bạn có thể lọc trùng lặp nếu cần(sử dụng cấu trúc dữ liệu set)

Làm sao để Selenium cuộn trang?

Cho tới hiện tại mình biết và đã sử dụng hai cách sau đây. Cách đầu tiên là cách dùng Javascript để cuộn trang. Mặc dù nó đã bị chặn bởi Youtube, nhưng các website khác thì không hề nha.

Sử dụng Javascript để cuộn trang

Nếu bạn nào có kinh nghiệm sử dụng Javascript ắt hẳn sẽ biết lệnh này dùng làm gì?

Bạn hãy thử vào Facebook, mở devtools(Ctrl Shift I) và dán lệnh này vào tab Console xem nhé. Hoặc vào bất cứ trang nào mà chúng ta có thể cuộn trang ấy.

Full source code cho phương án này như sau:

  1. Cuộn tới cuộn trang sử dụng lệnh Javascript phía trên
  2. Chờ vài giây cho nó tải dữ liệu
  3. Kiểm tra xem body.scrollHeight hiện tại với body.scrollHeight trước đó có bằng nhau không. Nếu có nghĩa là cuối trang rồi, hoàn thành. Nếu không thì lại quay lại bước 1.

Sử dụng bàn phím để cuộn trang

Như mình đã nói, cách trên rất hay nhưng đã bị Youtube chặn, bạn thử sẽ thấy trang nó không hề cuộn. Nhưng Youtube không chặn bàn phím được. Và chúng ta có 2 phím để cuộn trang là PAGE_DOWNPAGE_UP

Như vậy, ta sẽ cho Selenium thực thi giả lập nhấn phím PAGE_DOWN thay cho lệnh Javascript phía trên. Còn về quy trình và các bước thì vẫn giống y hệt.

Còn nữa, do chúng ta không execute script được nên không lấy được scrollHeight. Do đó, mình sẽ thay bằng việc đếm số video hiện đang hiện thị trên trình duyệt trước và sau khi cuộn trang để kiểm tra xem đã load hết video chưa.

Làm sao để lấy video url từ html code?

Sau khi cuộn tới cuối trang, chúng ta hoàn toàn có thể lấy source code của trang ở thời điểm đã hiện thị toàn bộ playlist lên trình duyệt. Việc tiếp theo là lấy các video url!

Nhận thấy các video url có video_id là 11 ký tự. Và các đường dẫn ở thời điểm hiện tại có thể match theo regex sau:

Ở đây, mình sẽ chỉ cần lấy ID của video thôi, sau đó sẽ lắp ghép sau theo cú pháp này:

Có thể còn nhiều cách khác nhau, bao gồm cả việc bóc tách html. Các bạn có thể thử thêm để học được nhiều hơn nhé.

Kết luận

Với ý tưởng này thì dù cho Youtube có thay đổi cấu trúc html thì chúng ta vẫn lấy được các url video như thường. Nhưng với điều kiện là bạn bóc tách các url ở bước tiếp theo sử dụng regex như mình có nói ở trên. Chứ nếu mà bóc tách html như bài hướng dẫn số 2 thì code sẽ phải sửa lại khi html của trang bị đổi.

Code lấy tất cả url video của playlist trên Youtube

Các bạn lưu ý code này chỉ hỗ trợ cho Python 3+. Mình chưa thử trên phiên bản Python 2 nên có thể sẽ phát sinh lỗi nếu bạn dùng Python phiên bản này.

Trong bài này mình giả sử các bạn đã đọc qua hết 2 bài hướng dẫn đầu tiên và đã làm thành công nhé. Nếu các bạn gặp lỗi gì thì hãy để lại comment mình sẽ giải đáp cho các bạn.

Cách chạy:

Source code:

Lưu ý: Để ẩn trình duyệt khi chạy code Selenium thì bạn bỏ comment dòng code này nhé:

File kết quả sau khi chạy trông như thế này đây.

lay-tat-ca-url-video-cua-mot-playlist-tren-youtube-2

Giờ bạn có thể dùng youtube-dl để download chúng về đơn giản rồi.

Similar Posts

Subscribe
Notify of
guest
7 Bình luận
Inline Feedbacks
View all comments