用Python打造个性化百度图片搜索工具

8,464次阅读
没有评论

共计 2967 个字符,预计需要花费 8 分钟才能阅读完成。

运行代码之后能获得百度搜索的图片,关键词需要自定义。获得搜索结果后,提取图片地址,使用悬浮窗预览图片,在预览窗口鼠标右键能够复制图片

用 Python 打造个性化百度图片搜索工具

使用 Python 的图形用户界面 (GUI) 库,如 Tkinter,来创建一个全局悬浮窗,并结合完整的百度搜索图片 URL 来实现图片预览和复制功能。

首先,您需要安装 Tkinter 库(如果尚未安装):

pip install tk
pip install beautifulsoup4

代码包括了处理 HTTP 请求、设置合适的请求头、以及解析返回的 HTML 内容以提取图片 URL 的步骤:

import tkinter as tk
from tkinter import Scrollbar, Canvas
from PIL import Image, ImageTk
import requests
from io import BytesIO
import win32clipboard
import re
def search_images(keyword):
    url = f"https://image.baidu.com/search/index?tn=baiduimage&fm=result&ie=utf-8&word={keyword}"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0',
        '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'
    }
    response = requests.get(url, headers=headers)
    pattern = r'"thumbURL":"([^"]+)"'
    urls = re.findall(pattern, response.text)
    return urls
def fetch_images(urls, canvas):
    images = []
    for url in urls:  # Limiting to 10 images for demo
        response = requests.get(url)
        if response.status_code == 200:
            image = Image.open(BytesIO(response.content))
            image.thumbnail((250, 250), Image.LANCZOS)  # Resize maintaining aspect ratio using Image.LANCZOS
            photo = ImageTk.PhotoImage(image)
            images.append((photo, image))
    return images
def send_to_clipboard(image):
    output = BytesIO()
    image.save(output, format='BMP')
    data = output.getvalue()[14:]  # Remove the BMP file header
    output.close()
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
    win32clipboard.CloseClipboard()
def show_images(urls):
    root = tk.Tk()
    root.title("Image Browser")
    root.geometry("517x1000")  # Increase window size for better view
    canvas = Canvas(root, bg="white")
    canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
    # 创建一个垂直滚动条
    scrollbar = Scrollbar(root, orient="vertical", command=canvas.yview)
    scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
    # 将滚动条与画布的 yview 方法绑定
    canvas.configure(yscrollcommand=scrollbar.set)
    # 创建一个框架来放置图片标签
    frame = tk.Frame(canvas, bg="white")
    canvas.create_window((0, 0), window=frame, anchor='nw')
    images = fetch_images(urls, canvas)
    row_count = 0
    for idx, (img, pil_img) in enumerate(images):
        column = idx % 2  # Two columns
        label = tk.Label(frame, image=img, borderwidth=0)
        label.grid(row=row_count, column=column, sticky='nw', padx=2, pady=2)
        label.image = img  # Keep a reference!
        label.bind("", lambda event, image=pil_img: send_to_clipboard(image))  # Right-click copy to clipboard
        if column == 1:  # Increment row index every two images
            row_count += 1
    frame.update_idletasks()  # Update inner frame size
    canvas.config(scrollregion=canvas.bbox("all"))  # Update canvas scroll region
    # 绑定鼠标滚轮事件到滚动条上
    def on_mousewheel(event):
        if event.delta 0:
            canvas.yview_scroll(1, "units")
        elif event.delta > 0:
            canvas.yview_scroll(-1, "units")
    canvas.bind_all("", on_mousewheel)
    root.mainloop()
if __name__ == '__main__':
    keyword = "风景"
    image_urls = search_images(keyword)
    show_images(image_urls)

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-23发表,共计2967字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)