共计 2967 个字符,预计需要花费 8 分钟才能阅读完成。
运行代码之后能获得百度搜索的图片,关键词需要自定义。获得搜索结果后,提取图片地址,使用悬浮窗预览图片,在预览窗口鼠标右键能够复制图片
使用 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)
正文完