Làm cách nào để tải xuống hình ảnh từ internet bằng python?

Bất cứ khi nào bạn truy cập bất kỳ trang web nào, bạn có thể bắt gặp các loại nội dung khác nhau, từ văn bản đến hình ảnh, âm thanh đến video. Đôi khi, bạn chỉ muốn đọc nội dung, lướt qua thông tin. Những lần khác, bạn có thể muốn lưu thông tin trên trang để tham khảo sau này

Hãy xem xét trường hợp bạn muốn tải xuống tất cả hình ảnh từ một trang web. Tải xuống riêng lẻ tất cả chúng không chỉ tốn nhiều công việc thủ công mà còn rất tốn thời gian và không hiệu quả. Nhưng hãy đoán xem, bạn có thể giải quyết vấn đề này bằng cách sử dụng Python. Trong hướng dẫn này, bạn sẽ học cách tải xuống tất cả hình ảnh của trang web bằng Python

Kỹ thuật download toàn bộ hình ảnh của một trang web bằng Python. Rút trích nội dung trang web

Web Scraping về cơ bản là một phương pháp được sử dụng để trích xuất dữ liệu từ nhiều. Dữ liệu này có thể ở bất kỳ dạng nào - văn bản, hình ảnh, âm thanh, video, v.v.
Trong quá trình quét web, chúng tôi trích xuất trực tiếp mã HTML cơ bản của trang web. Sau đó, bạn có thể sử dụng mã này để sao chép/truy xuất dữ liệu trang web cần thiết.

Bây giờ, chúng ta hãy tìm hiểu cách trích xuất hình ảnh từ trang web bằng cách sử dụng kỹ thuật trên, nhưng thông qua python

Cài đặt các module cần thiết

  1. re– Đây là mô-đun biểu thức chính quy của Python hỗ trợ khớp các chuỗi và biểu thức được chỉ định bởi một bộ quy tắc
  2. yêu cầu-Mô-đun Python này được sử dụng để gửi yêu cầu HTTP đến máy chủ
  3. bs4– Điều này cung cấp thư viện BeautifulSoup cho phép trích xuất dữ liệu từ các tệp HTML/XML, thường bằng cách làm việc với trình phân tích cú pháp

Một mã đơn giản để thực hiện tải xuống

import re
import requests
from bs4 import BeautifulSoup
site = '//www.codespeedy.com/'
response = requests.get[site]
soup = BeautifulSoup[response.text, 'html.parser']
image_tags = soup.find_all['img']
urls = [img['src'] for img in image_tags]
for url in urls:
    filename = re.search[r'/[[\w_-]+[.][jpg|gif|png]]$', url]
    if not filename:
         print["Regular expression didn't match with the url: {}".format[url]]
         continue
    with open[filename.group[1], 'wb'] as f:
        if 'http' not in url:
            url = '{}{}'.format[site, url]
        response = requests.get[url]
        f.write[response.content]
print["Download complete, downloaded images can be found in current directory!"]
Download complete, downloaded images can be found in current directory!

Trong đoạn mã trên;

  • Đầu tiên, bạn nhập tất cả các mô-đun cần thiết, như đã đề cập trước đó
  • Tiếp theo, bạn phải chỉ định địa chỉ của trang web mà chúng tôi muốn tải xuống tất cả các hình ảnh
  • Sau đó, bạn có thể gửi yêu cầu GET tới URL đã chỉ định, yêu cầu tài nguyên
  • Khi điều này được thực hiện, bạn có thể sử dụng BeautifulSoup để triển khai quét web. Điều này hoạt động với trình phân tích cú pháp và trích xuất HTML/XML của URL. Hơn nữa, hãy rút tất cả các thẻ hình ảnh khỏi tệp Html
  • Khi bạn nhận được các thẻ hình ảnh, hãy loại bỏ thuộc tính nguồn của tất cả các hình ảnh hiện có, thuộc tính này chỉ định URL của nguồn hình ảnh. Sau đó, bạn phải lặp lại tất cả các URL nguồn này, đồng thời xác minh định dạng của chúng
  • Cuối cùng, bạn có thể ghi tệp hình ảnh vào thư mục hiện tại, do đó hoàn tất quá trình tải xuống

Mã chi tiết hơn

Một mã toàn diện hơn, trong đó URL được nhập rõ ràng và hình ảnh được tải xuống và lưu trữ trong một thư mục mới do người dùng chỉ định, cùng với việc theo dõi số lượng hình ảnh trên trang web như sau

from bs4 import *
import requests
import os
def folder_create[images]:
    folder_name = input["Enter name of folder: "]
    os.mkdir[folder_name]
    download_images[images, folder_name]
def download_images[images, folder_name]:
    count = 0
    print[f"Found {len[images]} images"]
    if len[images] != 0:
        for i, image in enumerate[images]:
            image_link = image["src"]
            r = requests.get[image_link].content
            with open[f"{folder_name}/images{i+1}.jpg", "wb+"] as f:
                f.write[r]
                count += 1
        if count == len[images]:
            print["All the images have been downloaded!"]
        else:
            print[f" {count} images have been downloaded out of {len[images]}"]
def main[url]:
    r = requests.get[url]
    soup = BeautifulSoup[r.text, 'html.parser']
    images = soup.findAll['img']
    folder_create[images]
url = input["Enter site URL:"]
main[url]
Enter site URL://www.codespeedy.com/
Enter name of folder: abc
Found 13 images
All the images have been downloaded!

Một thư mục có tên ABC được tạo trong thư mục hiện tại và các hình ảnh được tải xuống thư mục đó

Bạn đã bao giờ muốn tải xuống tất cả hình ảnh trên một trang web nhất định chưa?

Để bắt đầu, chúng tôi cần khá nhiều phụ thuộc, hãy cài đặt chúng

pip3 install requests bs4 tqdm

Mở một tệp Python mới và nhập các mô-đun cần thiết

import requests
import os
from tqdm import tqdm
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin, urlparse

Trước tiên, hãy tạo một trình xác thực URL để đảm bảo rằng URL được chuyển là hợp lệ, vì có một số trang web đặt dữ liệu được mã hóa vào vị trí của URL, vì vậy chúng ta cần bỏ qua những trang web đó.

def is_valid[url]:
    """
    Checks whether `url` is a valid URL.
    """
    parsed = urlparse[url]
    return bool[parsed.netloc] and bool[parsed.scheme]

hàm urlparse[] phân tích một URL thành sáu thành phần, chúng ta chỉ cần xem liệu netloc [tên miền] và lược đồ [giao thức] có ở đó không

Thứ hai, tôi sẽ viết chức năng cốt lõi lấy tất cả các URL hình ảnh của một trang web

def get_all_images[url]:
    """
    Returns all image URLs on a single `url`
    """
    soup = bs[requests.get[url].content, "html.parser"]

Nội dung HTML của trang web nằm trong đối tượng

import requests
import os
from tqdm import tqdm
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin, urlparse
1, để trích xuất tất cả các thẻ img trong HTML, chúng ta cần sử dụng phương thức
import requests
import os
from tqdm import tqdm
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin, urlparse
2, hãy cùng xem thực tế

Download complete, downloaded images can be found in current directory!
0

Điều này sẽ truy xuất tất cả các phần tử img dưới dạng danh sách Python

Mặc dù vậy, tôi đã bọc nó trong một đối tượng tqdm chỉ để in thanh tiến trình. Để lấy URL của thẻ img, có thuộc tính src. Tuy nhiên, có một số thẻ không chứa thuộc tính src, chúng ta bỏ qua chúng bằng cách sử dụng câu lệnh continue ở trên

Bây giờ chúng tôi cần đảm bảo rằng URL là tuyệt đối

Download complete, downloaded images can be found in current directory!
1

Có một số URL chứa các cặp khóa-giá trị HTTP GET mà chúng tôi không thích [kết thúc bằng một cái gì đó như thế này "/image. png?c=3. 2. 5"], hãy loại bỏ chúng

Download complete, downloaded images can be found in current directory!
2

Chúng tôi đang nhận được vị trí của '?'

Bây giờ, hãy đảm bảo rằng mọi URL đều hợp lệ và trả về tất cả các URL hình ảnh

Download complete, downloaded images can be found in current directory!
3

Bây giờ chúng ta có một chức năng lấy tất cả các URL hình ảnh, chúng ta cần một chức năng để tải xuống các tệp từ web bằng Python, tôi đã mang chức năng sau từ hướng dẫn này

Download complete, downloaded images can be found in current directory!
4

Chức năng trên về cơ bản lấy url của tệp để tải xuống và tên đường dẫn của thư mục để lưu tệp đó vào

Có liên quan. Cách chuyển đổi bảng HTML thành tệp CSV bằng Python

Cuối cùng, đây là chức năng chính

Download complete, downloaded images can be found in current directory!
5

Lấy tất cả các URL hình ảnh từ trang đó và tải xuống từng cái một. Hãy kiểm tra điều này

import requests
import os
from tqdm import tqdm
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin, urlparse
0

Điều này sẽ tải xuống tất cả các hình ảnh từ URL đó và lưu trữ chúng trong thư mục "hình ảnh yandex" sẽ được tạo tự động

Tuy nhiên, xin lưu ý rằng có một số trang web tải dữ liệu của họ bằng Javascript, trong trường hợp đó, bạn nên sử dụng thư viện request_html thay thế, tôi đã tạo một tập lệnh khác thực hiện một số chỉnh sửa cho tập lệnh gốc và xử lý kết xuất Javascript, hãy kiểm tra tại đây

Được rồi, chúng tôi đã hoàn tất. Dưới đây là một số ý tưởng bạn có thể triển khai để mở rộng mã của mình

Bạn muốn tìm hiểu thêm về Web Scraping?

Cuối cùng, nếu bạn muốn tìm hiểu sâu hơn về web scraping với các thư viện Python khác nhau, không chỉ BeautifulSoup, các khóa học dưới đây chắc chắn sẽ có giá trị cho bạn

Chủ Đề