Trong bài đăng trên blog này, chúng tôi sẽ hướng dẫn bạn quy trình trích xuất hình ảnh từ các trang web bằng Python. Bạn sẽ học cách bắt đầu với các thư viện phổ biến, xử lý các cạm bẫy tiềm ẩn và thậm chí khám phá các kỹ thuật nâng cao để đưa kỹ năng trích xuất hình ảnh từ web của bạn lên một tầm cao mới.
Để bắt đầu thu thập hình ảnh bằng Python, bạn sẽ cần làm quen với một số thư viện chính giúp công việc này dễ dàng hơn. Các lựa chọn phổ biến nhất là BeautifulSoup, Scrapy và Requests.
BeautifulSoup là một thư viện Python được sử dụng để phân tích cú pháp các tài liệu HTML và XML. Nó tạo ra một cây phân tích cú pháp từ các mã nguồn trang có thể được sử dụng để trích xuất dữ liệu dễ dàng.
Sau đây là một ví dụ đơn giản về cách trích xuất URL hình ảnh bằng BeautifulSoup:
pip cài đặt bs4 yêu cầu
nhập yêu cầu từ bs4 nhập BeautifulSoup url = 'https://books.toscrape.com/' phản hồi = yêu cầu. lấy (url) soup = BeautifulSoup(response.text, 'html.parser' ) hình ảnh = soup.find_all( 'img' )
This code fetches the HTML content of the specified URL, parses it with BeautifulSoup, and then finds all the `<img>` tags, printing out their `src` attributes.
Sau khi bạn đã trích xuất URL hình ảnh, bước tiếp theo là tải chúng xuống. Thư viện Requests hoàn hảo cho nhiệm vụ này vì tính đơn giản và dễ sử dụng của nó.
Sau đây là cách bạn có thể tải xuống hình ảnh bằng Yêu cầu:
for ind, img in enumerate(images):
img_data = requests.get(url+img['src']).content
with open(f'image_{ind+1}.jpg', 'wb') as handler:
handler.write(img_data)
Tập lệnh này gửi yêu cầu GET đến URL hình ảnh và ghi nội dung nhị phân của hình ảnh vào một tệp.
Điều quan trọng là phải xử lý lỗi và ngoại lệ để đảm bảo tập lệnh của bạn chạy trơn tru ngay cả khi có sự cố phát sinh. Sau đây là phiên bản nâng cao của tập lệnh trước:
for ind, img in enumerate(images):
try:
img_data = requests.get(url+img['src']).content
with open(f'image_{ind+1}.jpg', 'wb') as handler:
handler.write(img_data)
except Exception as e:
print(f"An error occurred during the extraction of image \n Image Url: {img['src']} \n Error: {e}")
Đoạn mã này bao gồm khối try-except để phát hiện bất kỳ lỗi nào có thể xảy ra trong quá trình tải xuống.
Đối với các tác vụ thu thập dữ liệu phức tạp hơn, chẳng hạn như thu thập nhiều trang hoặc toàn bộ trang web, Scrapy là một thư viện mạnh mẽ có thể xử lý các tình huống này một cách hiệu quả.
Scrapy là một nền tảng thu thập dữ liệu web mã nguồn mở và cộng tác dành cho Python. Nó được thiết kế để có tốc độ và hiệu quả, lý tưởng cho các dự án thu thập dữ liệu quy mô lớn.
pip cài đặt scrapy
scrapy startproject image_scraper cd image_scraper
Tạo một tệp spider (`spiders/image_spider.py`) với nội dung sau:
import scrapy
class ImageSpider(scrapy.Spider):
name = 'imagespider'
start_urls = ['https://books.toscrape.com/']
def parse(self, response):
# Extract image URLs and convert them to absolute if necessary
for img in response.css('img::attr(src)').getall():
abs_img_url = response.urljoin(img)
yield {'image_url': abs_img_url}
# Find the link to the next page and create a request for it
next_page = response.css('a.next::attr(href)').get()
if next_page is not None:
next_page_url = response.urljoin(next_page)
yield response.follow(next_page_url, self.parse)
Công cụ thu thập dữ liệu Scrapy đơn giản này bắt đầu từ URL đã cho, trích xuất tất cả URL hình ảnh và theo dõi các liên kết trang tiếp theo để tiếp tục thu thập dữ liệu.
Để cải thiện hơn nữa các dự án thu thập dữ liệu của bạn, hãy cân nhắc sử dụng API để truy cập hình ảnh chất lượng cao và tự động hóa các tác vụ để tăng hiệu quả.
API cung cấp một cách đáng tin cậy và hợp pháp để truy cập hình ảnh. Nhiều trang web cung cấp API cho phép bạn tìm kiếm và tải xuống hình ảnh theo chương trình. Một trong những trang web này là Unsplash AP I.
import requests
# Replace 'YOUR_ACCESS_KEY' with your actual Unsplash Access Key
api_url = "https://api.unsplash.com/photos/random"
headers = {"Authorization": "Client-ID YOUR_ACCESS_KEY"}
params = {"query": "nature"}
try:
response = requests.get(api_url, headers=headers, params=params)
response.raise_for_status() # This will raise an exception for HTTP errors
data = response.json()
image_url = data['urls']['full']
print(image_url)
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}")
except Exception as err:
print(f"An error occurred: {err}")
Tập lệnh này sử dụng API Unsplash để lấy một hình ảnh thiên nhiên ngẫu nhiên.
Tự động hóa tiết kiệm thời gian và đảm bảo các tác vụ thu thập dữ liệu của bạn chạy trơn tru mà không cần can thiệp thủ công. Các công cụ như cron jobs trên hệ thống Unix hoặc Task Scheduler trên Windows có thể lên lịch cho các tập lệnh của bạn chạy theo các khoảng thời gian đều đặn.
Crontab là một tiện ích mạnh mẽ trong các hệ điều hành giống Unix để lập lịch các tác vụ, được gọi là " cron jobs " để chạy tự động vào những thời điểm cụ thể. Hãy cùng xem cách chúng ta có thể lập lịch một tác vụ bằng Crontab.
Một tệp crontab bao gồm các dòng lệnh, trong đó mỗi dòng đại diện cho một công việc riêng biệt. Cú pháp như sau:
PHÚT GIỜ DOM THỨ HAI DOW CMD
Đây là một ví dụ về việc chạy một tập lệnh python hàng ngày lúc 8:00PM
0 20 * * * / usr /bin/python3 /path/ đến /Image_Scraper.py
Trong bài đăng trên blog này, chúng tôi đã khám phá cách thu thập hình ảnh từ các trang web bằng Python. Chúng tôi đã đề cập đến những điều cơ bản với BeautifulSoup và Requests, các kỹ thuật nâng cao với Scrapy và các hoạt động thu thập dữ liệu có đạo đức. Ngoài ra, chúng tôi đã thảo luận về cách nâng cao các dự án thu thập dữ liệu của bạn bằng API và các công cụ tự động hóa như Windows Task Scheduler.
Thu thập hình ảnh là một kỹ năng mạnh mẽ có thể nâng cao khả năng thu thập dữ liệu của bạn và mở ra những khả năng mới cho các dự án của bạn.
Chúc bạn cạo vui vẻ!