Cách trích xuất hình ảnh: Hướng dẫn thực hành cho năm 2026

Cách trích xuất hình ảnh: Hướng dẫn thực hành cho năm 2026

Bạn đã chán ngán việc bị chặn IP làm gián đoạn hoạt động của mình chưa? Hãy triển khai các proxy dân dụng của chúng tôi để xoay vòng địa chỉ IP với tốc độ cao hoặc các proxy ISP an toàn để đảm bảo tuổi thọ lâu dài cho tài khoản.

Việc trích xuất hình ảnh nghe có vẻ đơn giản — chỉ cần tìm các URL và tải các tệp xuống. Tuy nhiên, trên thực tế, web hiện đại khiến hầu như mọi khâu trong quá trình này trở nên phức tạp hơn mức cần thiết: các thư viện hình ảnh được tải chậm khi cuộn trang, các URL hình ảnh được ký bởi CDN, phiên bản chất lượng cao nhất chỉ hiển thị khi di chuột qua, và bất kỳ trang web nào đáng để trích xuất đều có các biện pháp phòng thủ chống bot, đủ để phát hiện và chặn một skript thiếu kinh nghiệm chỉ sau vài trăm yêu cầu.

Hướng dẫn này trình bày các phương pháp thực tế vẫn hiệu quả vào năm 2026, từ các tiện ích mở rộng trình duyệt chỉ dùng một lần cho đến các quy trình xử lý Python đạt tiêu chuẩn sản xuất, cùng với những phần mà hầu hết các hướng dẫn thường bỏ qua: xử lý nội dung được hiển thị bằng JavaScript, cách vượt qua cơ chế bảo vệ chống liên kết trực tiếp, và các vấn đề pháp lý và đạo đức ngày càng khó có thể phớt lờ.

Hãy chọn phương pháp phù hợp dựa trên mức độ thực tế mà bạn cần

Có khoảng bốn cấp độ khác nhau trong việc trích xuất hình ảnh, và việc lựa chọn công cụ phù hợp phụ thuộc vào khối lượng dữ liệu, đối tượng mục tiêu và tần suất thực hiện.

Cấp độ 1 — Chỉ thực hiện một lần, khối lượng nhỏ, tại một địa điểm duy nhất. Sử dụng tiện ích mở rộng trình duyệt hoặc nhấp chuột phải và lưu lại. Bất kỳ cách nào khác đều là thừa thãi.

Cấp độ 2 — Từ hàng chục đến hàng trăm hình ảnh từ một trang web. Một công cụ trích xuất hình ảnh chuyên dụng hoặc một tập lệnh Python đơn giản để quét một trang duy nhất.

Cấp độ 3 — Hàng nghìn hình ảnh trên nhiều trang hoặc trang web. Một skript thu thập dữ liệu thực sự với cơ chế giới hạn tốc độ phù hợp, logic thử lại và hệ thống lưu trữ.

Cấp độ 4 — Thu thập dữ liệu liên tục, quy mô lớn (dữ liệu huấn luyện mô hình học máy, nghiên cứu thị trường thường xuyên). Một quy trình sản xuất với các proxy luân phiên, hỗ trợ trình duyệt không giao diện người dùng và kho dữ liệu thực tế.

Hầu hết các bài viết về chủ đề này đều nhầm lẫn giữa hai khái niệm này. Cách tiếp cận đúng đắn đối với cấp độ 1 thực sự khác biệt so với cấp độ 4, chứ không chỉ đơn thuần là một phiên bản thu nhỏ của nó.

Cấp độ 1: Tiện ích mở rộng trình duyệt

Để tải xuống một tá hình ảnh từ một trang web, các tiện ích mở rộng trình duyệt vẫn là cách nhanh nhất. Những tiện ích đáng cài đặt hiện nay:

  • Trình tải xuống hình ảnh (Chrome) — tải xuống hàng loạt một cách đơn giản với tính năng lọc theo kích thước và loại tệp. Đây là công cụ gần như là tiêu chuẩn chung nhất.
  • Imageye (Chrome, Edge) — bộ tính năng tương tự, giao diện bộ lọc tốt cho kích thước và định dạng.
  • DownThemAll! (Firefox) — một tiện ích cổ điển đã tồn tại từ lâu, vẫn được duy trì và hỗ trợ nhiều định dạng tệp hơn là chỉ hình ảnh.

Hãy tránh các tiện ích mở rộng chưa được cập nhật trong hơn một năm (nhiều công cụ “tải xuống bằng cách nhấp đúp” thuộc thế hệ năm 2020 hiện đã bị bỏ rơi hoặc âm thầm chứa mã độc — Cửa hàng tiện ích mở rộng của Chrome từ lâu đã trở thành một “nghĩa địa”). Hãy kiểm tra ngày cập nhật gần nhất trước khi cài đặt bất kỳ tiện ích nào.

Hạn chế của bất kỳ tiện ích mở rộng nào: bạn vẫn phải tự tải từng trang một. Khi số lượng hình ảnh vượt quá vài trăm, tay bạn sẽ bị chuột rút.

Cấp độ 2: Công cụ trích xuất hình ảnh và công cụ không giao diện người dùng

Một bước tiến so với các tiện ích mở rộng: các công cụ cho phép nhập một URL và trích xuất mọi hình ảnh từ trang đã hiển thị. Hầu hết các công cụ này chỉ hỗ trợ một trang web tại một thời điểm, nhưng sẽ tự động thực hiện các thao tác nhấp chuột thay cho bạn.

Đối với các công việc chỉ thực hiện một lần, phương án đơn giản nhất thường chỉ là wget từ dòng lệnh:

bash

wget -r -l 2 -A jpg,jpeg,png,webp,gif --no-parent https://example.com/gallery/

Chức năng này tải xuống các hình ảnh theo cách đệ quy đến hai cấp độ từ một URL, đồng thời lọc ra các tệp thuộc định dạng hình ảnh. Chức năng này đã có mặt trong mọi bản phân phối Linux trong suốt 25 năm qua và vẫn hoạt động tốt với các trang web tĩnh. Đối với Windows, chức năng tương đương là curl hoặc của PowerShell Invoke-WebRequest.

Đối với các trang web mà bạn không muốn viết mã, các công cụ không cần mã hóa vẫn hoạt động hiệu quả bao gồm: Octoparse (vẫn rất ổn định, mô hình freemium), Apify (hướng đến nhà phát triển hơn, là thị trường các công cụ thu thập dữ liệu có sẵn bao gồm cả những công cụ chuyên dụng cho hình ảnh), Bardeen (mới hơn, dựa trên tiện ích mở rộng trình duyệt, tích hợp với các công cụ quy trình làm việc khác). ParseHub không còn là lựa chọn được khuyến nghị rõ ràng như cách đây ba năm — gói miễn phí đã bị hạn chế đáng kể.

Các công cụ này hỗ trợ phân trang, hiển thị cơ bản bằng JavaScript và xuất dữ liệu theo định dạng CSV. Tuy nhiên, chúng bắt đầu gặp trục trặc khi xử lý các trang web được bảo vệ chặt chẽ hoặc bất kỳ trang nào có tính năng cuộn vô hạn yêu cầu đăng nhập.

Cấp độ 3: Python — ngôn ngữ mặc định của các nhà phát triển đang làm việc

Nếu muốn xử lý khối lượng công việc thực sự lớn, hãy tự viết mã. Bộ công cụ Python hoạt động ổn định vào năm 2026 rất gọn gàng:

  • requests — truy xuất các trang và tải xuống các tệp hình ảnh
  • BeautifulSoup — phân tích cú pháp HTML và tìm <img> thẻ và srcset thuộc tính
  • Playwright — khởi chạy một trình duyệt không giao diện thực sự khi trang web cần JavaScript để hiển thị hình ảnh
  • Pillow — xử lý các hình ảnh đã tải xuống (thay đổi kích thước, loại bỏ bản trùng lặp, kiểm tra định dạng)

Quy trình cơ bản để tạo một trang tĩnh:

Python

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import os

url = "https://example.com/gallery"
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)"}

resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, "html.parser")

os.makedirs("images", exist_ok=True)

for img in soup.find_all("img"):
    src = img.get("src") or img.get("data-src")
    if not src:
        continue
    full_url = urljoin(url, src)
    filename = os.path.join("images", os.path.basename(full_url.split("?")[0]))
    with open(filename, "wb") as f:
        f.write(requests.get(full_url, headers=headers).content)

Đó là bản tóm tắt trong 30 giây. Trên thực tế, bạn sẽ cần phải đối mặt với một số thực tế sau:

  • Hình ảnh tải chậm sống tại data-src, data-original, hoặc các thuộc tính tương tự thay vì src — hãy kiểm tra trang trước khi tin tưởng vào mã nguồn.
  • srcset thuộc tính hỗ trợ nhiều độ phân giải cho hình ảnh thích ứng. Phiên bản có chất lượng cao nhất thường không phải là phiên bản src chỉ đến; phân tích cú pháp srcset để giành lấy phần lớn nhất.
  • Các bộ sưu tập được hiển thị bằng JavaScript sẽ không xuất hiện trong requests không hiển thị kết quả nào cả. Hãy chuyển sang Playwright, đợi cho đến khi gallery được hiển thị xong, sau đó trích xuất từ DOM.
  • Các URL CDN đã được ký sẽ hết hạn — nếu bạn thu thập các URL trong một lần duy nhất và tải chúng về sau đó, bạn sẽ gặp lỗi 403. Hãy tải về ngay khi phát hiện ra chúng.
  • Bảo vệ chống liên kết trực tiếp từ chối các yêu cầu không có quyền Referer tiêu đề. Truyền URL của trang nguồn dưới dạng tham số Referer và hầu hết trong số đó sẽ tự biến mất.

Đối với việc trích xuất dữ liệu do Playwright thực hiện:

Python

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com/gallery")
    page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
    page.wait_for_timeout(2000)
    
    image_urls = page.eval_on_selector_all(
        "img", 
        "elements => elements.map(el => el.src)"
    )
    browser.close()

Điều này giải quyết vấn đề liên quan đến cơ chế “cuộn để tải thêm” – cơ chế khiến các công cụ thu thập dữ liệu đơn giản không hoạt động được trên hầu hết các thư viện hình ảnh hiện đại.

Cấp độ 4: Thu thập dữ liệu trên quy mô sản xuất

Khi số lượng hình ảnh trong mỗi lần chạy vượt quá vài nghìn, hoặc khi bạn đang chạy các tác vụ thu thập dữ liệu liên tục (các trường hợp phổ biến nhất là: xây dựng tập dữ liệu hình ảnh để huấn luyện máy học, theo dõi tài sản hình ảnh của đối thủ cạnh tranh, hoặc biên tập các nguồn cấp nội dung trên quy mô lớn), các điểm nghẽn sẽ thay đổi.

Kịch bản không còn là vấn đề nữa. Các vấn đề là:

Giới hạn tốc độ và chặn IP. Mọi trang web đáng tin cậy đều sẽ chặn một địa chỉ IP duy nhất nếu nó truy cập trang web đó nhiều hơn vài lần mỗi phút. Giải pháp là sử dụng các proxy dân dụng luân phiên — những địa chỉ IP được gán cho các hộ gia đình thực tế, trông không thể phân biệt được với lưu lượng truy cập của người dùng thông thường. Các proxy trung tâm dữ liệu không hiệu quả trong trường hợp này; các dịch vụ lưu trữ hình ảnh lớn và nền tảng thương mại điện tử thường tự động đánh dấu các dải IP của trung tâm dữ liệu theo mặc định.

Nội dung được giới hạn theo khu vực địa lý. Một số hình ảnh chỉ được hiển thị tại các khu vực cụ thể (hình ảnh thể thao có bản quyền, ảnh sản phẩm theo khu vực). Tính năng nhắm mục tiêu qua máy chủ proxy theo quốc gia sẽ xử lý vấn đề này; đối với nội dung được bản địa hóa thực sự, việc nhắm mục tiêu theo thành phố mới thực sự quan trọng.

Lưu trữ và loại bỏ dữ liệu trùng lặp. Một lần chạy tải về 100K hình ảnh, mỗi hình ảnh có dung lượng 200KB, sẽ chiếm 20GB. Tính băm cho từng hình ảnh trong quá trình tải xuống (một phương pháp đơn giản hashlib.md5(content).hexdigest()) cho phép bạn loại bỏ các bản trùng lặp mà không cần duy trì một cơ sở dữ liệu tên tệp song song.

Cơ chế thử lại. Mạng có thể gặp sự cố, CDN có thể giới hạn băng thông, trình duyệt có thể bị treo. Hãy áp dụng cơ chế “thử lại với khoảng thời gian chờ” cho mọi quá trình tải xuống và ghi lại các lỗi thay vì dừng hoạt động ngay khi gặp lỗi.

Đồng thời. Dùng aiohttp với asyncio đối với các tác vụ tải xuống có khối lượng lớn. Một tập lệnh tuần tự đơn giản tải xuống 10.000 hình ảnh với thời gian 200 ms cho mỗi yêu cầu sẽ mất 33 phút; trong khi phiên bản không đồng bộ chỉ mất chưa đầy một phút (với điều kiện nguồn có thể xử lý được — đừng làm sập máy chủ của người khác).

Đối với các dự án thuộc cấp độ này, cơ sở hạ tầng proxy quan trọng hơn cả tập lệnh thu thập dữ liệu. Tập lệnh chỉ dài 100 dòng và bạn có thể viết xong trong một buổi chiều. Các địa chỉ IP dân dụng đáng tin cậy và được luân phiên mới là yếu tố thực sự quyết định liệu công việc có chạy đến khi hoàn tất hay bị đình trệ ở mức 30% do địa chỉ IP bị chặn.

IPBurger là lựa chọn phù hợp ở đây — proxy dân cư luân phiên, nhắm mục tiêu theo quốc gia, phiên kết nối ổn định khi cần thiết — và quan điểm chung này vẫn đúng bất kể nhà cung cấp nào: ở cấp độ này, lớp proxy chính là lớp chịu tải chính.

Phần mà hầu hết các hướng dẫn đều bỏ qua: tính hợp pháp và đạo đức

Việc trích xuất hình ảnh là một trong những khía cạnh pháp lý còn nhiều điểm mập mờ trong lĩnh vực trích xuất dữ liệu web, do một số lý do cụ thể đã trở nên rõ ràng hơn trong hai năm qua:

Bản quyền được áp dụng mặc định đối với hình ảnh. Khác với các đoạn văn bản, nơi nguyên tắc sử dụng hợp lý có nhiều không gian linh hoạt hơn, việc sao chép hình ảnh nói chung là vấn đề liên quan đến bản quyền. Việc một hình ảnh có thể truy cập công khai trên internet không đồng nghĩa với việc được cấp phép sao chép và phân phối lại hình ảnh đó. Đối với mục đích thương mại, đây là một rủi ro thực sự; còn đối với các bộ dữ liệu huấn luyện học máy, đây là một lĩnh vực pháp lý đang được tranh luận sôi nổi và chưa có định hướng rõ ràng.

Điều khoản dịch vụ thường cấm rõ ràng việc thu thập dữ liệu tự động. Vi phạm Điều khoản dịch vụ thường không phải là hành vi hình sự, nhưng có thể là hành vi dân sự, và có thể dẫn đến việc tài khoản và địa chỉ IP của bạn bị khóa. Hãy đọc kỹ Điều khoản dịch vụ của bất kỳ trang web nào mà bạn đang thu thập dữ liệu tự động trên quy mô lớn.

Đạo luật về Trí tuệ nhân tạo (AI) của Liên minh châu Âu (EU) và các quy định tương tự đang bắt đầu yêu cầu công bố nguồn dữ liệu huấn luyện cho các mô hình AI. Nếu bạn đang thu thập dữ liệu cho học máy (ML), hãy ghi chép rõ nguồn gốc của dữ liệu và cách thức thu thập dữ liệu đó.

Một số nội dung bị cấm đăng tải bất kể khả năng truy cập kỹ thuật ra sao. Các hình ảnh chụp những cá nhân có thể nhận diện được, đặc biệt là trẻ vị thành niên, tuyệt đối không được phép đăng tải — ngay cả khi trang đó là trang công khai. Các quy định về quyền riêng tư (GDPR, CCPA) vẫn được áp dụng.

Quy tắc thực tiễn: nếu bạn cảm thấy ngại ngùng khi phải giải thích hoạt động thu thập dữ liệu của mình trước một thẩm phán hoặc luật sư của trang web đó, thì đừng làm điều đó. Nếu bạn có thể giải thích một cách rõ ràng — “chúng tôi đang thu thập hình ảnh sản phẩm được công khai để so sánh giá, tuân thủ tệp robots.txt, giới hạn tần suất yêu cầu và ghi rõ nguồn” — thì có lẽ bạn sẽ không gặp vấn đề gì.

Một quy trình làm việc mặc định hợp lý

Nếu bạn đang bắt đầu một dự án trích xuất hình ảnh ngay hôm nay và chưa chắc chắn nên chọn gói dịch vụ nào, đây là phương án có khả năng mở rộng:

  1. Kiểm tra trang trong công cụ phát triển của trình duyệt. Tìm vị trí thực tế của các URL hình ảnh. Tĩnh src? srcset? data-src? Hình nền trong CSS? Bài tìm hiểu chỉ mất 10 phút này sẽ giúp bạn tiết kiệm hàng giờ sau này.
  2. Hãy thử wget hoặc một cái nhỏ requests + BeautifulSoup Trước tiên là kịch bản. Nếu các hình ảnh hiển thị rõ nét, vậy là xong rồi.
  3. Nếu quá trình hiển thị bằng JavaScript gặp sự cố, hãy chuyển sang Playwright. Các trình duyệt không giao diện người dùng (headless) tuy chậm hơn nhưng vẫn xử lý được mọi thứ mà người dùng thực tế có thể nhìn thấy.
  4. Nếu bạn bắt đầu gặp các mã lỗi 403 hoặc 429, hãy thêm một lớp proxy dân dụng. Đừng cố lách hệ thống chống bot bằng cách điều chỉnh các tiêu đề (headers) liên tục; một khi trang web đã xác định được địa chỉ IP của bạn, nó sẽ không thể bị lừa được nữa.
  5. Hãy bổ sung các tính năng loại bỏ dữ liệu trùng lặp, logic thử lại và xử lý đồng thời khi khối lượng dữ liệu đủ lớn để biện minh cho mức độ phức tạp đó. Đừng xây dựng quy trình sản xuất ngay từ ngày đầu tiên.

Hầu hết các dự án trích xuất hình ảnh đều bị bỏ dở ngay tại bước 4 — không phải vì việc viết kịch bản quá khó, mà vì người vận hành cố gắng sử dụng các địa chỉ IP của trung tâm dữ liệu trong khi thực tế cần phải dùng địa chỉ IP dân dụng, tốn mất ba ngày cho việc đó rồi cuối cùng đành bỏ cuộc. Chỉ cần chọn cơ sở hạ tầng phù hợp ngay từ đầu thì phần còn lại sẽ rất đơn giản.

Sự vững mạnh của doanh nghiệp bạn phụ thuộc hoàn toàn vào thời gian hoạt động của proxy. Hãy chuyển sang sử dụng các proxy ISP tĩnh cấp doanh nghiệp để tận hưởng tốc độ chuyên dụng và độ tin cậy vững chắc. HOẶC Triển khai các proxy dân dụng luân phiên để đạt tỷ lệ thành công khi thu thập dữ liệu lên đến 99,9%.

Trong bài viết này:
Đừng lo lắng về chất lượng máy chủ proxy của bạn nữa

Các proxy ISP tĩnh của chúng tôi được đảm bảo hoàn toàn sạch và dành riêng 100% cho bạn. Không có gánh nặng chia sẻ, chỉ có hiệu suất.

Tải về các proxy tĩnh của nhà cung cấp dịch vụ Internet (ISP)

Tìm hiểu sâu hơn nữa về

Đừng để bị chặn nữa. Hãy bắt đầu mở rộng quy mô ngay hôm nay.

Hãy gia nhập cùng hơn 24.100 doanh nghiệp đang sử dụng các proxy dân dụng và ISP có độ ổn định cao nhất để thu thập dữ liệu thời gian thực trên quy mô lớn.

Hơn 100 triệu địa chỉ IP
Kích hoạt ngay lập tức
Hỗ trợ chuyên gia 24/7