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)

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à

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
5 và cùng sử dụng nó để làm một tool crawl dữ liệu nhé. Đầu tiên xem thử sau bài này chúng ta sẽ làm được gì nào.

Hướng dẫn crawl html python - thu thập dữ liệu html python
Hướng dẫn crawl html python - thu thập dữ liệu html python

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:

  1. Cài đặt module
  2. Lấy danh sách tin tức mới nhất
  3. Lấy dữ liệu tin tức chi tiết từng bài
  4. Tạo những mẫu tin tức nhanh từ dữ liệu ở trên

Cùng bắt đầu thôi!!

1. Cài đặt Module (Hướng dẫn trên cmd Window)

  • Cài đặt Requests: 
    pip install requests (hoặc python –m pip install requests)​
  • Cài đặt Pilow: 
    pip install Pillow (hoặc python –m pip install Pillow)​

*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é:

  • Update PIP: 
    pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)

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ới

2.1. Lấy dữ liệu

Hiể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à

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
5 sẽ giúp chúng ta làm điều đó. Cùng nhau tìm hiểu các dùng nhé !

requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)

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é.

import requests

response = requests.get("https://tuoitre.vn/tin-moi-nhat.htm")
print(response)

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 :

print(response.content)

Kết quả:

\r\n    \r\n    Tin m\xe1\xbb\x9bi nh\xe1\xba\xa5t - Tu\xe1\xbb\x95i tr\xe1\xba\xbb Online
…(còn nữa>…

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ệu

Có nhiều cách để bóc tách dữ liệu từ một văn bản dài, sử dụng

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
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
pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
8 nhé.

Cách cài đặt:

pip install beautifulsoup4 (hoặc python –m pip install beautifulsoup4

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é

import requests
from bs4 import BeautifulSoup

response = requests.get("https://tuoitre.vn/tin-moi-nhat.htm")
soup = BeautifulSoup(response.content, "html.parser")
print(soup)

Thành quả là bạn sẽ được in ra một trang html rất gọn gàng như thế này:

Hướng dẫn crawl html python - thu thập dữ liệu html python

2.3. Phân tích dữ liệu

Bướ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:

Hướng dẫn crawl html python - thu thập dữ liệu html python

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:

pip install Pillow (hoặc python –m pip install Pillow)​
0

Sau 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:

Hướng dẫn crawl html python - thu thập dữ liệu html python

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 đó:

pip install Pillow (hoặc python –m pip install Pillow)​
1

Kết quả:

pip install Pillow (hoặc python –m pip install Pillow)​
2

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.

2.2. Tách dữ liệu

Có nhiều cách để bóc tách dữ liệu từ một văn bản dài, sử dụng

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
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
pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
8 nhé.

pip install Pillow (hoặc python –m pip install Pillow)​
3

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é chúng ta dùng một vòng

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
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é :

pip install Pillow (hoặc python –m pip install Pillow)​
4

Thành quả là bạn sẽ được in ra một trang html rất gọn gàng như thế này:

pip install Pillow (hoặc python –m pip install Pillow)​
5

2.3. Phân tích dữ liệu

pip install Pillow (hoặc python –m pip install Pillow)​
6

Bướ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:

Hướng dẫn crawl html python - thu thập dữ liệu html python

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:

pip install Pillow (hoặc python –m pip install Pillow)​
7

Sau 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.

pip install Pillow (hoặc python –m pip install Pillow)​
8

3. Lấy dữ liệu chi tiết từng bài

pip install Pillow (hoặc python –m pip install Pillow)​
9

Chúng ta sử dụng

requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
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:

Hướng dẫn crawl html python - thu thập dữ liệu html python

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é:

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
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:

  • Biến charPerLine sẽ lưu số kí tự có thể chứa trên 1 dòng bằng cách lấy độ dài trang chia cho độ dài 1 kí tự, từ đó ta sẽ cắt chuỗi với mỗi chuỗi có
    requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
    3 kí tự hoặc bé hơn
  • 2 biến
    requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
    4 và point sẽ lưu điểm đầu và điểm cuối của dòng được cắt
  • Sau khi in một dòng, chúng ta sẽ cộng tọa độ y thêm 1 đoạn đúng bằng độ cao 1 dòng chữ.
  • Trường hợp một nội dung quá dài, ta cũng chỉ in
    requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
    5 dòng rồi in thêm dấu …

Hợp lý hơn rồi đó. Đến phần cuối thôi:

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
1

Đây là đoạn code cuối cùng, mình xin giải thích chút nhé:

  • Hàm này sẽ nhận dữ liệu mình vừa crawl về lúc nãy.
  • Chúng ta sẽ dùng một vòng for để duyệt hết giá trị trong data, nhưng dùng thêm hàm
    requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
    6 để có thể lấy được chỉ số, để lát nữa mình tạo tên file khỏi bị trùng nhé.
pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
2

Đoạn này sẽ xử lí phần chèn ảnh bài báo, chúng ra dùng

requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
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

requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
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ệ

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
3

Và phần còn lại chỉ là gọi hàm:

requests.method(url, params, data, json, headers, cookies, files, auth, timeout, allow_redirects, proxies, verify, stream, cert)
9 để ghi tiêu đề, tóm tắt và nội dùng

Cuối cùng chúng ra dùng phương thức

import requests

response = requests.get("https://tuoitre.vn/tin-moi-nhat.htm")
print(response)
0 để lưu ảnh

Bạ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: 

pip install -–upgrade pip (hoặc python –m pip install -–upgrade pip)
4

Thà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

Hướng dẫn crawl html python - thu thập dữ liệu html python
Hướng dẫn crawl html python - thu thập dữ liệu html python
Hướng dẫn crawl html python - thu thập dữ liệu html python