Cách cạo ảnh từ web bằng Python

Trình quét hình ảnh Python không chỉ là một công cụ để rèn luyện kỹ năng lập trình của bạn. Bạn cũng có thể sử dụng nó để tạo nguồn hình ảnh cho một dự án máy học hoặc tạo hình thu nhỏ của trang web. Mặc dù có thể có những cách khác để làm những điều tương tự, nhưng không gì có thể đánh bại khả năng kiểm soát của bạn bằng cách sử dụng các công cụ bạn tự xây dựng.
Tìm hiểu cách trích xuất hình ảnh từ bất kỳ trang web nào bằng Python và thư viện BeautifulSoup.
Mục Lục
Scraping hình ảnh có hợp pháp không?
Giống như quét web tổng quát hơn, cạo hình ảnh là một phương pháp để tải xuống nội dung trang web. Nó không phải là bất hợp pháp, nhưng có một số quy tắc và thực tiễn tốt nhất bạn nên tuân theo. Trước tiên, bạn nên tránh cạo một trang web nếu nó tuyên bố rõ ràng rằng nó không muốn bạn làm như vậy. Bạn có thể tìm ra điều này bằng cách tìm kiếm /robots.txt tập tin trên trang web đích.
Hầu hết các trang web cho phép thu thập dữ liệu web vì họ muốn các công cụ tìm kiếm lập chỉ mục nội dung của họ. Bạn có thể loại bỏ các trang web như vậy vì hình ảnh của chúng được công bố rộng rãi.
Tuy nhiên, chỉ vì bạn có thể tải xuống một hình ảnh, điều đó không có nghĩa là bạn có thể sử dụng nó như thể nó là của riêng bạn. Hầu hết các trang web cấp phép cho hình ảnh của họ để ngăn bạn xuất bản lại hoặc sử dụng lại chúng theo những cách khác. Luôn cho rằng bạn không thể sử dụng lại hình ảnh trừ khi có quy định miễn trừ cụ thể.
Thiết lập gói Python
Bạn sẽ cần cài đặt một vài gói trước khi bắt đầu. Nếu bạn chưa cài đặt Python trên máy tính của mình, hãy truy cập trang web python.org chính thức để tải xuống và cài đặt phiên bản mới nhất.
Tiếp theo, mở thiết bị đầu cuối của bạn vào thư mục dự án của bạn và kích hoạt môi trường ảo Python để cô lập các phần phụ thuộc của bạn.
Cuối cùng, cài đặt yêu cầu và BeautifulSoup gói sử dụng pip:
pip install bs4 requests
Scraping hình ảnh với Python
Đối với hướng dẫn cạo hình ảnh này, bạn sẽ sử dụng yêu cầu thư viện để tìm nạp một trang web có chứa các hình ảnh đích. Sau đó, bạn sẽ chuyển phản hồi từ trang web đó vào BeautifulSoup để lấy tất cả các địa chỉ liên kết hình ảnh từ img các thẻ. Sau đó, bạn sẽ ghi từng tệp hình ảnh vào một thư mục để tải hình ảnh xuống.
Cách tìm nạp URL hình ảnh bằng Python’s BeautifulSoup
Bây giờ, hãy tiếp tục và tạo một tệp Python trong thư mục gốc dự án của bạn. Đảm bảo rằng bạn nối .py phần mở rộng cho tên tệp.
Mỗi đoạn mã trong hướng dẫn này tiếp tục từ đoạn trước.
Mở tệp Python bằng bất kỳ trình soạn thảo mã tốt nào và sử dụng mã sau để yêu cầu một trang web:
import requests
URL = "imagesiteURL"
getURL = requests.get(URL, headers={"User-Agent":"Mozilla/5.0"})
print(getURL.status_code)
Nếu chương trình trên xuất ra mã phản hồi 200, yêu cầu đã thành công. Nếu không, bạn có thể muốn đảm bảo rằng kết nối mạng của mình ổn định. Ngoài ra, hãy đảm bảo rằng bạn đã cung cấp một URL hợp lệ.
Bây giờ sử dụng BeautifulSoup để đọc nội dung của trang web với sự hỗ trợ của html_parser:
from bs4 import BeautifulSoupsoup = BeautifulSoup(getURL.text, 'html.parser')
images = soup.find_all('img')
print(images)
Mã này tạo một danh sách các đối tượng, mỗi đối tượng đại diện cho một hình ảnh từ trang web. Tuy nhiên, những gì bạn cần từ dữ liệu này là văn bản của mỗi hình ảnh src thuộc tính.
Để trích xuất nguồn từ mỗi img nhãn:
imageSources = []for image in images:
imageSources.append(image.get('src'))
print(imageSources)
Chạy lại mã của bạn và các địa chỉ hình ảnh bây giờ sẽ xuất hiện trong một danh sách mới (hình ảnh). Bạn đã trích xuất thành công từng nguồn hình ảnh từ trang web đích.
Cách lưu hình ảnh bằng Python
Đầu tiên, tạo một thư mục đích tải xuống trong thư mục gốc dự án của bạn và đặt tên cho nó hình ảnh.
Để Python tải xuống thành công hình ảnh, đường dẫn của chúng cần phải là URL tuyệt đối đầy đủ. Nói cách khác, chúng cần bao gồm tiền tố “http: //” hoặc “https: //”, cộng với tên miền đầy đủ của trang web. Nếu trang web tham chiếu hình ảnh của nó bằng các URL tương đối, bạn sẽ cần chuyển chúng thành URL tuyệt đối.
Trong trường hợp dễ dàng, khi URL là tuyệt đối, việc bắt đầu tải xuống chỉ là trường hợp yêu cầu từng hình ảnh từ các nguồn được trích xuất trước đó:
for image in imageSources:
webs = requests.get(image)
open('images/' + image.split('/')[-1], 'wb').write(webs.content)
Các image.split (‘/’)[-1] từ khóa tách liên kết hình ảnh tại mỗi dấu gạch chéo (/). Sau đó, nó lấy tên tệp hình ảnh (bao gồm bất kỳ phần mở rộng nào) từ phần tử cuối cùng.
Hãy nhớ rằng, trong một số trường hợp hiếm hoi, tên tệp hình ảnh có thể xung đột, dẫn đến tải xuống ghi đè. Vui lòng khám phá các giải pháp cho vấn đề này như một phần mở rộng cho ví dụ này.
Các URL tuyệt đối có thể trở nên khá phức tạp, với rất nhiều trường hợp phức tạp cần giải quyết. May mắn thay, có một phương pháp hữu ích trong request.compat gói được gọi là urljoin. Phương thức này trả về một URL đầy đủ, một URL cơ sở và một URL có thể là tương đối. Nó cho phép bạn giải quyết các giá trị bạn sẽ tìm thấy trong href và src thuộc tính.
Đoạn mã cuối cùng trông như thế này:
from bs4 import BeautifulSoup
URL = "imagesiteURL"
getURL = requests.get(URL, headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(getURL.text, 'html.parser')images = soup.find_all('img')
resolvedURLs = []
for image in images:
src = image.get('src')
resolvedURLs.append(requests.compat.urljoin(URL, src))
for image in resolvedURLs:
webs = requests.get(image)
open('images/' + image.split('/')[-1], 'wb').write(webs.content)
Không bao giờ thiếu dữ liệu hình ảnh
Nhiều dự án nhận dạng hình ảnh đã gặp phải một bức tường gạch do không đủ số lượng hình ảnh để đào tạo một người mẫu. Nhưng bạn luôn có thể trích xuất hình ảnh từ các trang web để tăng cường kho dữ liệu của mình. Và may mắn thay, Python là một công cụ quét hình ảnh mạnh mẽ mà bạn có thể sử dụng liên tục mà không sợ bị trả giá.
Nếu bạn quan tâm đến việc tìm nạp các loại dữ liệu khác từ web, bạn có thể muốn tìm hiểu cách sử dụng Python để tìm kiếm web chung.