Hướng dẫn crawl html python - thu thập dữ liệu html python
Chào các bạn! Lại là mình đây (Thật ra đây là lần đầu tiên mình viết bài) Show Hôm nay mình sẽ cùng các bạn tìm hiểu về một Module khá phổ biến của Python đó là Sau bài viết này chúng ta sẽ crawl được tất cả những tin tức mới từ một trang báo điện tử và sử dụng chúng để tạo ra những mẫu tin tức nhanh như trên ảnh với 4 bước chính:
Cùng bắt đầu thôi!! 1. Cài đặt Module (Hướng dẫn trên cmd Window)
*Note: Nếu xài PIP cũ thì mọi người update lên pip mới trước khi cài Pillow nhé:
Trong quá trình cài đặt nếu có lỗi gì thì mọi người post lên để cùng tìm cách fix nhé! 2. Cào dữ liệu danh sách tin tức mới2.1. Lấy dữ liệuHiểu nôm na thì module Request dùng để gửi HTTP request, giống như thao tác bạn thường làm khi lướt mạng : Vào trình duyệt gõ codelearn.io và enter, bạn sẽ nhận được giao diện của trang web hoặc một dạng dữ liệu khác. Để lấy được dữ liệu trả về thì ta phải sử dụng một module hỗ trợ và 5 sẽ giúp chúng ta làm điều đó. Cùng nhau tìm hiểu các dùng nhé !
What ?? Cần nhiều tham số thế cơ á ? Không, chúng ta chỉ cần lấy dữ liệu từ một trang tin tức thôi, không cần gửi đi dữ liệu gì cả. Hãy thử thế này nhé.
Và đây là kết quả :
Thật là No hope , chúng ra đang cần một trang web cơ mà. Thử gọi vài thuộc tính ra thử xem nào :No hope , chúng ra đang cần một trang web cơ mà. Thử gọi vài thuộc tính ra thử xem nào :
Kết quả:
Chúng ra đã lấy được dữ liệu của một trang web, vấn đề bây giờ là tách dữ liệu.tách dữ liệu. 2.2. Tách dữ liệuCó nhiều cách để bóc tách dữ liệu từ một văn bản dài, sử dụng 7 (biểu thức chính quy) cũng là một cách nhưng thực tế thì python đã hỗ trợ mạnh hơn. Cùng tìm hiểu về module 8 nhé.Cách cài đặt:
Beautiful Soup sẽ giúp chúng ta phân tích dữ liệu HTML hay XML thành dữ liệu cây, từ đó giúp chúng ta truy xuất dữ liệu dễ dàng hơn. Cùng test thử nhé
Thành quả là bạn sẽ được in ra một trang html rất gọn gàng như thế này: 2.3. Phân tích dữ liệuBước tiếp theo là chúng ta cần phân tích xem dữ liệu cần lấy ở đâu. Rõ ràng để lấy dữ liệu chi tiết một bài báo ta cần liên kết đến bài đó nhỉ. Bật f12 lên và phân tích chút:phân tích xem dữ liệu cần lấy ở đâu. Rõ ràng để lấy dữ liệu chi tiết một bài báo ta cần liên kết đến bài đó nhỉ. Bật f12 lên và phân tích chút: Sau thời gian mò mẫm, chúng ta có thể tìm thấy link bài báo ở trong thẻ và thẻ này nằm trong thẻ h3 có class “title-news”. Vậy công việc của chúng ra là lọc tất cả thẻ h3 có class “title-news” và lấy thẻ a trong nó, cùng code tiếp nào: 0Sau khi thêm đoạn này chúng ta sẽ được một mảng các thẻ h3 là tiêu đề bài báo: Tiếp tục công việc tiếp theo là lấy link của tất cả các bài viết đó: 1Kết quả: 2Chúng ra đã lấy được dữ liệu của một trang web, vấn đề bây giờ là tách dữ liệu. 2.2. Tách dữ liệuCó nhiều cách để bóc tách dữ liệu từ một văn bản dài, sử dụng 7 (biểu thức chính quy) cũng là một cách nhưng thực tế thì python đã hỗ trợ mạnh hơn. Cùng tìm hiểu về module 8 nhé. 3Cách cài đặt: Beautiful Soup sẽ giúp chúng ta phân tích dữ liệu HTML hay XML thành dữ liệu cây, từ đó giúp chúng ta truy xuất dữ liệu dễ dàng hơn. Cùng test thử nhé chúng ta dùng một vòng 9 để duyệt qua tất cả các link và truy cập các link đó, các bạn chú ý do href của thẻ a sẽ không có link gốc (dạng “/router-ne”) nên chúng ta cần chèn thêm BASE URL vào nhé : 4Thành quả là bạn sẽ được in ra một trang html rất gọn gàng như thế này: 52.3. Phân tích dữ liệu 6Bước tiếp theo là chúng ta cần phân tích xem dữ liệu cần lấy ở đâu. Rõ ràng để lấy dữ liệu chi tiết một bài báo ta cần liên kết đến bài đó nhỉ. Bật f12 lên và phân tích chút: Sau thời gian mò mẫm, chúng ta có thể tìm thấy link bài báo ở trong thẻ và thẻ này nằm trong thẻ h3 có class “title-news”. Vậy công việc của chúng ra là lọc tất cả thẻ h3 có class “title-news” và lấy thẻ a trong nó, cùng code tiếp nào: 7Sau khi thêm đoạn này chúng ta sẽ được một mảng các thẻ h3 là tiêu đề bài báo:Tiếp tục công việc tiếp theo là lấy link của tất cả các bài viết đó: Một mảng các liên kết, khá hợp lí. Giải thích một chút nhé: Ở trên để tìm tất cả các thẻ h3 nên ta sử dụng hàm findAll() thõa mãn class truyền vào, nhưng ở dưới chỉ cần tìm duy nhất 1 thẻ a trong h3 nên ta chỉ cần dùng lệnh find(“a”) và dùng attrs[“thuoc_tinh”] để lấy thuộc tính của thẻ a. 83. Lấy dữ liệu chi tiết từng bài 9Chúng ta sử dụng 2 để mở thêm một ảnh và phương thức paste để chèn một ảnh vào ảnh khác với tham số truyền vào là ảnh được open ở trên và tuple chỉ tọa độ sẽ chèn.Lưu ý: là để draw được Tiếng Việt thì bạn cần phải load font có hỗ trợ Tiếng Việt vào như đoạn trên, cái path tới font ấy bạn có thể dẫn tới font đang lưu trong hệ thống hoặc tạo một folder font cùng cấp với file code để lưu font như mình nhé.: là để draw được Tiếng Việt thì bạn cần phải load font có hỗ trợ Tiếng Việt vào như đoạn trên, cái path tới font ấy bạn có thể dẫn tới font đang lưu trong hệ thống hoặc tạo một folder font cùng cấp với file code để lưu font như mình nhé. Bước cuối cùng: Mình sẽ tạo bố cục bài báo như thế này, mọi người có thể tùy sức sáng tạo theo ý mình nhé, code thôi nào. Đầu tiên các bạn sẽ thấy công việc chèn chữ lên ảnh sẽ được lặp đi lặp lại nên mình sẽ viết riêng một hàm để chèn chữ nhé: 0Ơ… sao phức tạp thế nhỉ?? Hàm để ghi chữ lúc nãy ngắn lắm cơ mà. Thực ra chúng ta còn một vấn đề khi chèn chữ đó là khi bạn ghi một chuỗi dài, nó không biết tự động xuống dòng khi vượt ra ngoài bức ảnh. Chính vì vậy chúng ta sẽ xử lí theo hướng sau:
Hợp lý hơn rồi đó. Đến phần cuối thôi: 1Đây là đoạn code cuối cùng, mình xin giải thích chút nhé:
2Đoạn này sẽ xử lí phần chèn ảnh bài báo, chúng ra dùng 7 để vẽ một hình chữ nhật làm nền, chúng ta sẽ truyền vào tọa độ góc trên, chiều dài, rộng và màu.Tiếp theo vì ảnh trên mạng sẽ có kích thước tùy ý nên chúng ta sẽ chuyển nó về ảnh thumbnail để dễ dàng chèn vào. Mình vẫn dùng 8 để lấy dử liệu là một bức ảnh và thuộc tính raw để lấy file raw truyền vào Image.open()Tiếp theo chúng ta sẽ dùng lệnh này để resize bước ảnh theo ý muốn vẫn giữ nguyên tỉ lệ 3Và phần còn lại chỉ là gọi hàm: 9 để ghi tiêu đề, tóm tắt và nội dùngCuối cùng chúng ra dùng phương thức 0 để lưu ảnhBạn có thể tạo một folder để lưu những file ảnh tạo ra như mình và tạo tên ảnh bằng những index lúc nãy để tránh trùng tên: 4Thành quảCuối cùng cũng đã xong, và đây là thành quả. Trong quá trình thực hiện nếu có lỗi gì thì mọi người cùng comment lên để thảo luận nhé. Thank for reading FullCode: Link gitHub |