Cách cạo hình ảnh từ hình ảnh Yahoo bằng Python

Bình luận: 0

Hình ảnh cạo từ tìm kiếm hình ảnh Yahoo rất quan trọng khi tạo các bộ dữ liệu hình ảnh. Hướng dẫn này giải thích cách cạo hình ảnh từ tìm kiếm hình ảnh Yahoo bằng Python cũng như thư viện yêu cầu kết hợp với LXML cho các kỹ thuật phân tích cú pháp HTML. Nó cũng chạm vào việc sử dụng proxy để tránh bị bắt bởi các hệ thống phát hiện bot Yahoo.

Các công cụ và thư viện bắt buộc

Để cạo hình ảnh từ hình ảnh Yahoo, bạn sẽ cần các thư viện Python sau:

  • Requests: Để thực hiện các yêu cầu HTTP.
  • lxml: Cho phân tích cú pháp HTML.
  • Proxies: Để tránh các lệnh cấm IP trong quá trình cạo rộng rãi.

Cài đặt thư viện của bên thứ ba

Đảm bảo bạn đã cài đặt tất cả các thư viện cần thiết. Cài đặt chúng bằng PIP:

pip install requests
pip install lxml

Hoặc sử dụng một lệnh duy nhất:

pip install requests lxml

Hướng dẫn từng bước để cạo với Python

Đầu tiên, chúng tôi cần nhập các thư viện cần thiết cho cào của chúng tôi.

import requests
from lxml import html

Thực hiện tìm kiếm hình ảnh yahoo

Tiếp theo, chúng tôi sẽ thực hiện tìm kiếm trên hình ảnh Yahoo.

Ở đây chúng tôi sẽ xác định một truy vấn tìm kiếm là chó con và gửi yêu cầu nhận được tìm kiếm hình ảnh Yahoo với các tiêu đề cần thiết. Các tiêu đề yêu cầu rất quan trọng để bắt chước yêu cầu trình duyệt, giúp bỏ qua một số cơ chế phát hiện bot cơ bản.

# Xác định các tiêu đề để bắt chước yêu cầu trình duyệt
headers = {
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
    "accept-language": "en-IN,en;q=0.9",
    "cache-control": "max-age=0",
    "dnt": "1",
    "priority": "u=0, i",
    "sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"Linux"',
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "none",
    "sec-fetch-user": "?1",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
}

# Xác định truy vấn tìm kiếm
search_query = "puppies"

# Nhận yêu cầu nhận được trang tìm kiếm hình ảnh Yahoo
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

URL hình ảnh phân tích cú pháp với LXML

Sau khi nhận được phản hồi từ Yahoo, chúng ta cần phân tích HTML để trích xuất URL hình ảnh. Chúng tôi sử dụng LXML cho mục đích này.

# Phân tích phản hồi HTML
parser = fromstring(response.text)

# Trích xuất URL hình ảnh bằng cách sử dụng XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

Chức năng từString được sử dụng để phân tích văn bản phản hồi HTML. XPath được sử dụng để trích xuất URL của hình ảnh. Ảnh chụp màn hình dưới đây cho thấy cách thu được XPath.

yaho.png

Tải xuống hình ảnh

Với danh sách các URL hình ảnh, bây giờ chúng ta cần tải xuống từng hình ảnh.

Ở đây, chúng tôi sẽ lặp qua danh sách ImageS_URLS để trích xuất cả số đếm (chỉ mục) và URL (địa chỉ). Mỗi hình ảnh sau đó sẽ được tải xuống bằng cách gửi yêu cầu nhận đến URL tương ứng.

# Tải xuống từng hình ảnh và lưu nó vào một tệp
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Tiết kiệm hình ảnh

Cuối cùng, chúng tôi lưu các hình ảnh đã tải xuống vào hệ thống tập tin cục bộ. Chúng tôi xác định một hàm download_file xử lý quá trình lưu tệp.

Hàm này lấy số lượng (để tạo tên tệp duy nhất) và phản hồi (chứa dữ liệu hình ảnh). Nó xác định phần mở rộng tệp từ tiêu đề loại nội dung và lưu tệp trong thư mục ./images/.

def download_file(count, response):
    # Nhận tiện ích mở rộng tệp từ tiêu đề loại nội dung
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Tạo thư mục nếu nó không tồn tại
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Viết nội dung phản hồi vào tệp
    with open(filename, "wb") as f:
        f.write(response.content)

Bằng cách gọi chức năng này trong vòng lặp, chúng tôi lưu từng hình ảnh đã tải xuống:

for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)
    download_file(count, response)

Cơ chế phát hiện bot của Yahoo

Trong khi quét dữ liệu từ Yahoo, nhưng điều quan trọng là phải nhận thức được các cơ chế phát hiện bot của Yahoo. Yahoo chủ yếu sử dụng các kỹ thuật này để xác định và chặn bot tự động:

  • Giới hạn tốc độ IP: Yahoo theo dõi tỷ lệ yêu cầu đến từ một địa chỉ IP duy nhất. Yêu cầu quá mức từ một IP có thể dẫn đến các lệnh cấm tạm thời hoặc vĩnh viễn.
  • CAPTCHAS: Yahoo có thể triển khai captchas cho người dùng để xác minh họ là con người.

Sử dụng proxy để tránh phát hiện

Để tránh bị chặn bởi cơ chế phát hiện bot Yahoo, đặc biệt là khi thực hiện nhiều yêu cầu từ cùng một IP, chúng tôi sử dụng proxy để che dấu địa chỉ IP của chúng tôi.

Bằng cách định tuyến các yêu cầu của chúng tôi thông qua các proxy khác nhau, chúng tôi có thể phân phối hoạt động cạo của chúng tôi trên nhiều địa chỉ IP, do đó giảm xác suất được phát hiện.

proxies = {
    'http': 'http://USER:PASS@HOST:PORT',
    'https': 'http://USER:PASS@HOST:PORT'
}
response = requests.get(url, headers=headers, proxies=proxies, verify=False)

Hoàn thành mã

Dưới đây là tập lệnh hoàn chỉnh để quét hình ảnh từ kết quả tìm kiếm hình ảnh Yahoo bằng proxy:

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
   Lưu nội dung của một phản hồi cho một tệp trong thư mục ./images/.

    Args:
        count (int): Một định danh duy nhất cho tệp.
        response (requests.Response): Phản hồi HTTP chứa nội dung tệp.

    """
    # Nhận tiện ích mở rộng tệp từ tiêu đề loại nội dung
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Tạo thư mục nếu nó không tồn tại
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Viết nội dung phản hồi vào tệp
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
   Chức năng chính để tìm kiếm hình ảnh và tải xuống chúng.

    Hàm này thực hiện các bước sau:
    1. Thiết lập các tiêu đề yêu cầu.
    2. Tìm kiếm hình ảnh của chó con trên Yahoo.
    3. Phân tích Phản hồi HTML để trích xuất URL hình ảnh.
    4. Tải xuống từng hình ảnh và lưu nó vào thư mục ./images/.

    """
    # Xác định các tiêu đề để bắt chước yêu cầu trình duyệt
    headers = {
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "accept-language": "en-IN,en;q=0.9",
        "cache-control": "max-age=0",
        "dnt": "1",
        "priority": "u=0, i",
        "sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": '"Linux"',
        "sec-fetch-dest": "document",
        "sec-fetch-mode": "navigate",
        "sec-fetch-site": "none",
        "sec-fetch-user": "?1",
        "upgrade-insecure-requests": "1",
        "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    }

    # Xác định proxy để vượt qua giới hạn tỷ lệ
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Xác định truy vấn tìm kiếm
    search_query = "puppies"

    # Nhận yêu cầu nhận được trang tìm kiếm hình ảnh Yahoo
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Phân tích phản hồi HTML
    parser = fromstring(response.text)

    # Trích xuất URL hình ảnh bằng cách sử dụng XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Tải xuống từng hình ảnh và lưu nó vào một tệp
    for count, url in enumerate(images_urls):
        response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
        download_file(count, response)


if __name__ == "__main__":
    main()

Quét hình ảnh từ tìm kiếm hình ảnh Yahoo bằng Python là một kỹ thuật mạnh mẽ để tự động hóa các tác vụ phân tích và thu thập dữ liệu. Bằng cách sử dụng thư viện yêu cầu cho các yêu cầu HTTP và thư viện LXML để phân tích cú pháp HTML, bạn có thể trích xuất URL hình ảnh một cách hiệu quả và tải xuống hình ảnh. Kết hợp các proxy giúp bạn tránh phát hiện và ngăn chặn các lệnh cấm IP trong các hoạt động cạo rộng rãi.

Bình luận:

0 Bình luận