Tìm kiếm hình ảnh Google Python

Đây là chương trình dòng lệnh python để tìm kiếm từ khóa/cụm từ khóa trên Google Hình ảnh và tùy chọn tải hình ảnh về máy tính của bạn. Bạn cũng có thể gọi tập lệnh này từ một tệp python khác

Đây là một chương trình nhỏ và sẵn sàng để chạy. Không cần cài đặt phụ thuộc nếu bạn chỉ muốn tải xuống tối đa 100 hình ảnh cho mỗi từ khóa. Nếu bạn muốn có hơn 100 hình ảnh cho mỗi từ khóa, thì bạn cần cài đặt thư viện Selenium cùng với chromedriver. Hướng dẫn chi tiết trong phần khắc phục sự cố

khả năng tương thích

Chương trình này tương thích với cả hai phiên bản python - 2. x và 3. x (khuyên dùng). Đây là một chương trình tải xuống và chạy mà không có thay đổi nào đối với tệp. Bạn sẽ chỉ phải xác định tham số thông qua dòng lệnh

Cài đặt

Hướng dẫn cung cấp hướng dẫn chi tiết về cách cài đặt thư viện

  • Cài đặt

Cách sử dụng

Phần sau đây cung cấp thông tin chi tiết về cách sử dụng thư viện - từ CLI hoặc bằng cách nhập tiêu chuẩn

  • Cách sử dụng

Tranh luận

Phần này cung cấp tất cả các đối số/tham số/tùy chọn mà bạn có thể cung cấp cho thư viện này

  • Đối số đầu vào

ví dụ

Nhiều ví dụ đã được cung cấp để giúp người dùng mới nhanh chóng tăng cường sử dụng

  • ví dụ

Xử lý sự cố

Phần này cung cấp hướng dẫn khắc phục sự cố thường gặp

  • Khắc phục lỗi/sự cố

quy trình làm việc

Quy trình làm việc giới thiệu thuật toán được sử dụng trong mô-đun này để tải xuống hình ảnh

  • quy trình làm việc

Đóng góp

Bất kỳ ai cũng được hoan nghênh đóng góp cho kịch bản này. Nếu bạn muốn thực hiện thay đổi, hãy mở yêu cầu kéo. Đối với các vấn đề và thảo luận, hãy truy cập Trình theo dõi vấn đề

Mục đích của repo này là giữ cho nó đơn giản, độc lập, tương thích ngược và chứng minh sự phụ thuộc của bên thứ 3

từ chối trách nhiệm

Cảnh báo

Chương trình này cho phép bạn tải xuống hàng tấn hình ảnh từ Google. Vui lòng không tải xuống hoặc sử dụng bất kỳ hình ảnh nào vi phạm điều khoản bản quyền của nó. Google Hình ảnh là một công cụ tìm kiếm chỉ lập chỉ mục hình ảnh và cho phép bạn tìm thấy chúng. Nó KHÔNG tạo ra hình ảnh của riêng mình và do đó, nó không sở hữu bản quyền đối với bất kỳ hình ảnh nào trong số đó. Những người tạo ban đầu của hình ảnh sở hữu bản quyền

Hình ảnh được xuất bản ở Hoa Kỳ được chủ sở hữu của chúng tự động giữ bản quyền, ngay cả khi chúng không có cảnh báo bản quyền một cách rõ ràng. Bạn không được sao chép các hình ảnh có bản quyền mà không có sự cho phép của chủ sở hữu, ngoại trừ các trường hợp sử dụng hợp lý, nếu không bạn có thể gặp phải cảnh báo của luật sư, thư ngừng hoạt động và các vụ kiện bản quyền. Hãy rất cẩn thận trước khi sử dụng nó

Như tôi đã đề cập trong bài viết trước của mình, tôi cần rất nhiều hình ảnh của các biểu tượng ma thuật để đào tạo một mạng đối thủ tạo ra tích chập sâu (DCGAN). May mắn thay, tôi đã đọc được bài viết của Bosler từ rất sớm

Để có được hình ảnh của mình, tôi đã sử dụng trình duyệt Chrome, Chromedriver, Selenium và tập lệnh Python để từ từ trích xuất hình ảnh từ tìm kiếm hình ảnh của Google. Quá trình cạo được thực hiện với tốc độ gần bằng con người, nhưng cho phép tự động hóa việc thu thập rất nhiều hình ảnh

Về quy trình này, tôi sẽ lặp lại Bosler, tôi không phải là chuyên gia pháp lý. Tôi không phải là luật sư và tôi không nên coi bất kỳ điều gì mà tôi tuyên bố là tư vấn pháp lý. Tôi chỉ là một số hack trên internet. Tuy nhiên, theo những gì tôi hiểu, việc cạo SERPs (trang kết quả của công cụ tìm kiếm) không phải là bất hợp pháp, ít nhất, không phải cho mục đích sử dụng cá nhân. Nhưng việc sử dụng tìm kiếm Hình ảnh của Google để quét hình ảnh tự động là trái với điều khoản dịch vụ (ToS) của họ. Sao chép dự án này với rủi ro của riêng bạn. Tôi biết khi tôi điều chỉnh tập lệnh của mình để tìm kiếm nhanh hơn, Google đã cấm IP của tôi. Tôi rất vui vì nó chỉ là tạm thời

Tập lệnh sửa đổi của Bosler

Tập lệnh tự động tìm kiếm hình ảnh và thu thập URL cơ bản của chúng. Sau khi tìm kiếm, nó sử dụng thư viện Python requests để tải tất cả các hình ảnh vào một thư mục có tên tương ứng với cụm từ tìm kiếm

Đây là những sửa đổi tôi đã thực hiện đối với kịch bản gốc của Bosler

  • Đã thêm một vòng lặp cụm từ tìm kiếm. Điều này cho phép tập lệnh tiếp tục chạy qua một cụm từ tìm kiếm
  • Tập lệnh bị kẹt khi chạy vào "Hiển thị kết quả khác", tôi đã khắc phục sự cố
  • Các kết quả được lưu trong các thư mục được liên kết với cụm từ tìm kiếm. Nếu tập lệnh bị gián đoạn và chạy lại, tập lệnh sẽ xem thư mục nào được tạo trước và xóa những thư mục đó khỏi cụm từ tìm kiếm
  • Tôi đã thêm tính năng hết thời gian chờ;
  • Tôi đã tham số hóa số lượng hình ảnh cần tìm cho mỗi cụm từ tìm kiếm, thời gian ngủ và thời gian chờ

Mã số. thư viện

Bạn sẽ cần cài đặt Chromedriver và Selenium–điều này đã được giải thích kỹ trong bài viết gốc

  • Quét hình ảnh bằng Python

Bạn cũng sẽ cần cài đặt Gối–một thư viện Python để quản lý hình ảnh

Bạn có thể cài đặt nó với

pip install pillow

Sau khi cài đặt tất cả các thư viện cần thiết, khối mã sau sẽ thực thi mà không gặp lỗi

import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver

Nếu bạn gặp bất kỳ rắc rối nào, hãy xem lại phần giải thích thiết lập bài viết gốc hoặc thoải mái đặt câu hỏi trong phần bình luận bên dưới

Mã số. Thông số

Tôi đã thêm một vài tham số vào tập lệnh để sử dụng dễ dàng hơn

number_of_images = 400
GET_IMAGE_TIMEOUT = 2
SLEEP_BETWEEN_INTERACTIONS = 0.1
SLEEP_BEFORE_MORE = 5
IMAGE_QUALITY = 85

output_path = "/path/to/your/image/directory"

import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
0 cho tập lệnh biết số lượng hình ảnh cần tìm kiếm cho mỗi cụm từ tìm kiếm. Nếu kịch bản hết hình ảnh trước khi đến
import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
0, nó sẽ chuyển sang kỳ tiếp theo

import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
2 xác định khoảng thời gian tập lệnh sẽ đợi phản hồi trước khi chuyển sang URL hình ảnh tiếp theo

import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
3 là đoạn mã sẽ trì hoãn bao lâu trước khi kiểm tra URL của hình ảnh tiếp theo. Về lý thuyết, điều này có thể được đặt ở mức thấp, vì tôi không nghĩ rằng nó thực hiện bất kỳ yêu cầu nào của Google. Nhưng tôi không chắc, hãy tự chịu rủi ro khi điều chỉnh

import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
4 là khoảng thời gian mà tập lệnh sẽ đợi trước khi nhấp vào nút “Hiển thị thêm kết quả”. Điều này không nên được đặt thấp hơn mức bạn có thể tìm kiếm thực tế. IP của bạn sẽ bị cấm. Tôi đã

Mã số. Cụm từ tìm kiếm

Đây là nơi phép màu xảy ra. Mảng

import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
5 phải bao gồm bất kỳ thuật ngữ nào mà bạn nghĩ sẽ nhận được các loại hình ảnh mà bạn đang nhắm mục tiêu

Dưới đây là bộ thuật ngữ chính xác mà tôi đã sử dụng để thu thập hình ảnh biểu tượng ma thuật

search_terms = [
    "black and white magic symbol icon",
    "black and white arcane symbol icon",
    "black and white mystical symbol",
    "black and white useful magic symbols icon",
    "black and white ancient magic sybol icon",
    "black and white key of solomn symbol icon",
    "black and white historic magic symbol icon",
    "black and white symbols of demons icon",
    "black and white magic symbols from book of enoch",
    "black and white historical magic symbols icons",
    "black and white witchcraft magic symbols icons",
    "black and white occult symbols icons",
    "black and white rare magic occult symbols icons",
    "black and white rare medieval occult symbols icons",
    "black and white alchemical symbols icons",
    "black and white demonology symbols icons",
    "black and white magic language symbols icon",
    "black and white magic words symbols glyphs",
    "black and white sorcerer symbols",
    "black and white magic symbols of power",
    "occult religious symbols from old books",
    "conjuring symbols",
    "magic wards",
    "esoteric magic symbols",
    "demon summing symbols",
    "demon banishing symbols",
    "esoteric magic sigils",
    "esoteric occult sigils",
    "ancient cult symbols",
    "gypsy occult symbols",
    "Feri Tradition symbols",
    "Quimbanda symbols",
    "Nagualism symbols",
    "Pow-wowing symbols",
    "Onmyodo symbols",
    "Ku magical symbols",
    "Seidhr And Galdr magical symbols",
    "Greco-Roman magic symbols",
    "Levant magic symbols",
    "Book of the Dead magic symbols",
    "kali magic symbols",
]

Trước khi tìm kiếm, tập lệnh kiểm tra thư mục đầu ra của hình ảnh để xác định xem hình ảnh đã được thu thập cho một thuật ngữ cụ thể chưa. Nếu có, tập lệnh sẽ loại trừ cụm từ tìm kiếm. Đây là một phần trong mã “hãy thật ngầu” của tôi. Chúng tôi không cần phải tải xuống một loạt hình ảnh hai lần

Mã bên dưới lấy tất cả các thư mục trong đường dẫn đầu ra của chúng tôi, sau đó xây dựng lại cụm từ tìm kiếm từ tên thư mục (i. e. , nó thay thế “_” bằng “ “s. )

dirs = glob(output_path + "*")
dirs = [dir.split("/")[-1].replace("_", " ") for dir in dirs]
search_terms = [term for term in search_terms if term not in dirs]

Mã số. Trình điều khiển Chrome

Trước khi bắt đầu tập lệnh, chúng tôi phải khởi động phiên Chromedriver. Lưu ý, bạn phải đặt tệp thực thi

import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
6 vào một thư mục được liệt kê trong biến
import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
7 của bạn để Selenium tìm thấy nó

Đối với người dùng MacOS, việc thiết lập Chromedriver để sử dụng Selenium hơi khó thực hiện thủ công. Nhưng, sử dụng homebrew giúp dễ dàng

brew install chromedriver

Nếu mọi thứ được thiết lập chính xác, việc thực thi đoạn mã sau sẽ mở trình duyệt Chrome và hiển thị trang tìm kiếm Google

wd = webdriver.Chrome()
wd.get("https://google.com")

Mã số. Thời gian chờ của Chrome

Lớp thời gian chờ bên dưới tôi đã mượn từ Thomas Ahle tại Stack Overflow. Đó là một cách bẩn thỉu để tạo thời gian chờ cho yêu cầu tải xuống hình ảnh của

import os
import time

import io
import hashlib
import signal
from glob import glob
import requests

from PIL import Image
from selenium import webdriver
8. Không có nó, tập lệnh có thể bị kẹt khi tải xuống hình ảnh không phản hồi

class timeout:
    def __init__(self, seconds=1, error_message="Timeout"):
        self.seconds = seconds
        self.error_message = error_message

    def handle_timeout(self, signum, frame):
        raise TimeoutError(self.error_message)

    def __enter__(self):
        signal.signal(signal.SIGALRM, self.handle_timeout)
        signal.alarm(self.seconds)

    def __exit__(self, type, value, traceback):
        signal.alarm(0)

Mã số. Tìm nạp hình ảnh

Như tôi hy vọng tôi đã làm rõ, đoạn mã dưới đây tôi không viết; . Tôi sẽ giải thích ngắn gọn, nhưng hãy tham khảo lại bài viết của Bosler để biết thêm thông tin

Về cơ bản, kịch bản

  1. Tạo một thư mục tương ứng với một thuật ngữ tìm kiếm trong mảng
  2. Nó chuyển cụm từ tìm kiếm tới
    import os
    import time
    
    import io
    import hashlib
    import signal
    from glob import glob
    import requests
    
    from PIL import Image
    from selenium import webdriver
    
    9, chức năng này thúc đẩy phiên Chrome. Tập lệnh điều hướng Google để tìm hình ảnh liên quan đến cụm từ tìm kiếm. Nó lưu trữ liên kết hình ảnh trong một danh sách. Sau khi đã tìm kiếm qua tất cả các hình ảnh hoặc đạt đến
    number_of_images = 400
    GET_IMAGE_TIMEOUT = 2
    SLEEP_BETWEEN_INTERACTIONS = 0.1
    SLEEP_BEFORE_MORE = 5
    IMAGE_QUALITY = 85
    
    output_path = "/path/to/your/image/directory"
    
    0, nó sẽ trả về một danh sách (
    number_of_images = 400
    GET_IMAGE_TIMEOUT = 2
    SLEEP_BETWEEN_INTERACTIONS = 0.1
    SLEEP_BEFORE_MORE = 5
    IMAGE_QUALITY = 85
    
    output_path = "/path/to/your/image/directory"
    
    1) chứa tất cả các URL của hình ảnh
  3. Danh sách các URL hình ảnh được chuyển đến
    number_of_images = 400
    GET_IMAGE_TIMEOUT = 2
    SLEEP_BETWEEN_INTERACTIONS = 0.1
    SLEEP_BEFORE_MORE = 5
    IMAGE_QUALITY = 85
    
    output_path = "/path/to/your/image/directory"
    
    2, sau đó tải xuống từng hình ảnh vào thư mục tương ứng
  4. Nó lặp lại các bước 1-3 cho mỗi cụm từ tìm kiếm

Tôi đã thêm nhận xét bổ sung làm hướng dẫn

def fetch_image_urls(
    query: str,
    max_links_to_fetch: int,
    wd: webdriver,
    sleep_between_interactions: int = 1,
):
    def scroll_to_end(wd):
        wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(sleep_between_interactions)

    # Build the Google Query.
    search_url = "https://www.google.com/search?safe=off&site=&tbm=isch&source=hp&q={q}&oq={q}&gs_l=img"

    # load the page
    wd.get(search_url.format(q=query))

    # Declared as a set, to prevent duplicates.
    image_urls = set()
    image_count = 0
    results_start = 0
    while image_count < max_links_to_fetch:
        scroll_to_end(wd)

        # Get all image thumbnail results
        thumbnail_results = wd.find_elements_by_css_selector("img.Q4LuWd")
        number_results = len(thumbnail_results)

        print(
            f"Found: {number_results} search results. Extracting links from {results_start}:{number_results}"
        )

        # Loop through image thumbnail identified
        for img in thumbnail_results[results_start:number_results]:
            # Try to click every thumbnail such that we can get the real image behind it.
            try:
                img.click()
                time.sleep(sleep_between_interactions)
            except Exception:
                continue

            # Extract image urls
            actual_images = wd.find_elements_by_css_selector("img.n3VNCb")
            for actual_image in actual_images:
                if actual_image.get_attribute(
                    "src"
                ) and "http" in actual_image.get_attribute("src"):
                    image_urls.add(actual_image.get_attribute("src"))

            image_count = len(image_urls)

            # If the number images found exceeds our `num_of_images`, end the seaerch.
            if len(image_urls) >= max_links_to_fetch:
                print(f"Found: {len(image_urls)} image links, done!")
                break
        else:
            # If we haven't found all the images we want, let's look for more.
            print("Found:", len(image_urls), "image links, looking for more ...")
            time.sleep(SLEEP_BEFORE_MORE)

            # Check for button signifying no more images.
            not_what_you_want_button = ""
            try:
                not_what_you_want_button = wd.find_element_by_css_selector(".r0zKGf")
            except:
                pass

            # If there are no more images return.
            if not_what_you_want_button:
                print("No more images available.")
                return image_urls

            # If there is a "Load More" button, click it.
            load_more_button = wd.find_element_by_css_selector(".mye4qd")
            if load_more_button and not not_what_you_want_button:
                wd.execute_script("document.querySelector('.mye4qd').click();")

        # Move the result startpoint further down.
        results_start = len(thumbnail_results)

    return image_urls


def persist_image(folder_path: str, url: str):
    try:
        print("Getting image")
        # Download the image.  If timeout is exceeded, throw an error.
        with timeout(GET_IMAGE_TIMEOUT):
            image_content = requests.get(url).content

    except Exception as e:
        print(f"ERROR - Could not download {url} - {e}")

    try:
        # Convert the image into a bit stream, then save it.
        image_file = io.BytesIO(image_content)
        image = Image.open(image_file).convert("RGB")
        # Create a unique filepath from the contents of the image.
        file_path = os.path.join(
            folder_path, hashlib.sha1(image_content).hexdigest()[:10] + ".jpg"
        )
        with open(file_path, "wb") as f:
            image.save(f, "JPEG", quality=IMAGE_QUALITY)
        print(f"SUCCESS - saved {url} - as {file_path}")
    except Exception as e:
        print(f"ERROR - Could not save {url} - {e}")

def search_and_download(search_term: str, target_path="./images", number_images=5):
    # Create a folder name.
    target_folder = os.path.join(target_path, "_".join(search_term.lower().split(" ")))

    # Create image folder if needed.
    if not os.path.exists(target_folder):
        os.makedirs(target_folder)

    # Open Chrome
    with webdriver.Chrome() as wd:
        # Search for images URLs.
        res = fetch_image_urls(
            search_term,
            number_images,
            wd=wd,
            sleep_between_interactions=SLEEP_BETWEEN_INTERACTIONS,
        )

        # Download the images.
        if res is not None:
            for elem in res:
                persist_image(target_folder, elem)
        else:
            print(f"Failed to return links for term: {search_term}")

# Loop through all the search terms.
for term in search_terms:
    search_and_download(term, output_path, number_of_images)

Kết quả

Cạo hình ảnh dẫn đến rất nhiều hình ảnh rác (nhiễu) cùng với hình ảnh đào tạo lý tưởng của tôi

Ví dụ: trong số tất cả các hình ảnh được hiển thị, tôi chỉ muốn hình ảnh được tô sáng

Tìm kiếm hình ảnh Google Python

Ngoài ra còn có vấn đề về rất nhiều biểu tượng ma thuật được lưu trữ trong một hình ảnh duy nhất. Những hình ảnh "bộ sưu tập" này sẽ cần được xử lý thêm để trích xuất tất cả các biểu tượng

Tìm kiếm hình ảnh Google Python

Tuy nhiên, ngay cả với một vài cạnh thô, kịch bản chắc chắn sẽ đánh bại việc tải xuống thủ công 10k hình ảnh cuối cùng tôi có

Google Image Search có API không?

Google Reverse Image API cho phép nhận kết quả tìm kiếm hình ảnh https. //hình ảnh. Google. com . API được truy cập thông qua điểm cuối sau. /Tìm kiếm? .

Tìm kiếm của Google có sử dụng Python không?

googlesearch là một thư viện Python để tìm kiếm trên Google một cách dễ dàng. tìm kiếm google sử dụng các yêu cầu và BeautifulSoup để loại bỏ Google.