Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Hướng dẫn Web Scraping tự động tải hình ảnh với Python
Trong bài hướng dẫn này, mình sẽ học cách xây dựng một chương trình tải hình ảnh từ Google Images bằng Python. Bài học sử dụng thư viện BeautifulSoup và requests để thực hiện web scraping, cho phép bạn tự động tìm và tải về hình ảnh từ các từ khóa được nhập vào.
Lưu ý quan trọng
Mặc dù mã nguồn bên dưới là một ví dụ cơ bản, Google đã thay đổi cách cấu trúc HTML của trang Google Images, do đó mã này có thể không hoạt động trực tiếp. Tuy nhiên, bạn sẽ có cái nhìn rõ hơn về các nguyên tắc cơ bản khi làm việc với web scraping bằng Python.
Cách xây dựng một chương trình tải hình ảnh từ Google Images bằng Python
import os import json import requests # Thư viện để gửi yêu cầu GET from bs4 import BeautifulSoup # Thư viện phân tích cú pháp HTML # URL Google Image Search GOOGLE_IMAGE = \ 'https://www.google.com/search?site=&tbm=isch&source=hp&biw=1873&bih=990&' # Header để tránh bị từ chối bởi Google usr_agent = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', 'Connection': 'keep-alive', } # Thư mục lưu hình ảnh SAVE_FOLDER = 'images' def main(): # Tạo thư mục lưu ảnh nếu chưa có if not os.path.exists(SAVE_FOLDER): os.mkdir(SAVE_FOLDER) download_images() def download_images(): # Yêu cầu người dùng nhập từ khóa và số lượng ảnh cần tải data = input('Bạn muốn tìm gì? ') n_images = int(input('Bạn muốn tải bao nhiêu ảnh? ')) print('Đang tìm kiếm...') # Tạo URL tìm kiếm searchurl = GOOGLE_IMAGE + 'q=' + data print(f'URL tìm kiếm: {searchurl}') # Gửi yêu cầu GET với User-Agent response = requests.get(searchurl, headers=usr_agent) html = response.text # Phân tích cú pháp HTML soup = BeautifulSoup(html, 'html.parser') # Tìm tất cả các thẻ <div> chứa hình ảnh results = soup.findAll('div', {'class': 'rg_meta'}, limit=n_images) # Trích xuất link từ JSON imagelinks = [] for re in results: text = re.text # Dữ liệu ở dạng chuỗi JSON text_dict = json.loads(text) # Chuyển đổi JSON thành dictionary Python link = text_dict['ou'] # Lấy link ảnh imagelinks.append(link) print(f'Tìm thấy {len(imagelinks)} hình ảnh.') print('Bắt đầu tải...') # Tải hình ảnh và lưu vào thư mục for i, imagelink in enumerate(imagelinks): response = requests.get(imagelink) imagename = os.path.join(SAVE_FOLDER, f'{data}_{i + 1}.jpg') with open(imagename, 'wb') as file: file.write(response.content) print('Hoàn tất tải hình ảnh!') if __name__ == '__main__': main()
Giải thích mã nguồn
Bài viết này được đăng tại [free tuts .net]
Thư viện requests
:
- Dùng để gửi yêu cầu HTTP đến trang web.
- Cần kèm User-Agent để tránh bị Google từ chối yêu cầu.
Thư viện BeautifulSoup
:
- Phân tích cú pháp HTML để dễ dàng lấy các thẻ HTML mong muốn.
- Dùng phương thức
findAll
để tìm các phần tửdiv
chứa liên kết ảnh.
Tách Dữ Liệu Từ JSON:
- Thẻ
<div>
chứa liên kết hình ảnh ở dạng JSON trong thuộc tínhrg_meta
. - Chuyển JSON thành dictionary để lấy liên kết ảnh.
Lưu Hình Ảnh:
- Mỗi ảnh được tải về với tên độc đáo và lưu trong thư mục
images
.
Cách chạy chương trình
Cài Đặt Các Thư Viện Cần Thiết:
pip install requests beautifulsoup4
Chạy Chương Trình:
python download_images.py
-
Nhập từ khóa tìm kiếm và số lượng ảnh cần tải khi được yêu cầu.
Hạn Chế
- Google thường xuyên thay đổi cách cấu trúc HTML, mã này có thể không hoạt động nếu HTML không còn khớp.
- Nên sử dụng API chính thức (như Google Custom Search) để tải ảnh một cách bền vững và tuân thủ chính sách.
Kết bài
Việc tự động tải hình ảnh bằng Python thông qua web scraping là một trải nghiệm thú vị và giúp bạn hiểu hơn về cách hoạt động của các công cụ như BeautifulSoup và requests. Tuy nhiên, để đảm bảo tính bền vững và tuân thủ chính sách từ các nền tảng lớn như Google, việc sử dụng API chính thức là lựa chọn an toàn và đáng tin cậy hơn.
Ngoài ra, bạn có thể phát triển chương trình hơn nữa bằng cách xử lý các trường hợp lỗi, như không tải được ảnh do liên kết hỏng, hoặc thêm các tính năng như giao diện người dùng để thao tác dễ dàng hơn, hỗ trợ tải ảnh từ nhiều từ khóa cùng lúc.
Hy vọng hướng dẫn này đã cung cấp cho bạn nền tảng vững chắc để bước đầu khám phá web scraping với Python. Chúc bạn lập trình vui vẻ và thành công!