经常需要接触到各种各样的图像数据,为模型开发准备素材,在实际的项目中,一部分数据来源于真实的项目场景,但是这部分数据大都比较少,且获取的难度比较大,往往都是项目到了实施阶段的时候才有机会拿到数据,对于前期模型的开发构建来说很不友好,所以基本上前期介入的时候想要快速开发迭代模型,基本上都是需要从互联网上采集公开的数据素材才行的。
常见的几个搜索引擎都可以拿来给自己获取数据使用,比如:Google、Bing、Baidu、Sougou等等,根据自己的实际需要选择合适的即可。
这里简单以Google搜索引擎为例,看下实例实现:
import requests
from bs4 import BeautifulSoup
import re
def google_images_search(query):
# 构建Google Images搜索URL
query = query.replace(' ', '+')
url = f"https://www.google.com/search?q={query}&tbm=isch"
# 设置请求头以模拟浏览器行为
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
# 发送GET请求
response = requests.get(url, headers=headers)
# 检查请求是否成功
if response.status_code == 200:
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 提取图像URL
image_urls = []
for img in soup.find_all('img'):
img_url = img.get('src')
if img_url and img_url.startswith('http'):
image_urls.append(img_url)
return image_urls
else:
print(f"请求失败,状态码: {response.status_code}")
return []
# 输入关键词
keyword = input("请输入搜索关键词: ")
# 获取图像URL
image_urls = google_images_search(keyword)
# 打印图像URL
for i, url in enumerate(image_urls, 1):
print(f"图像 {i}: {url}")
如果目标网站比较复杂的话,可以使用 selenium
进行更复杂的Web Scraping,如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
def google_images_search_selenium(query):
# 设置Chrome选项
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 无头模式
options.add_argument('--disable-gpu')
# 初始化WebDriver
driver = webdriver.Chrome(options=options)
# 构建Google Images搜索URL
url = f"https://www.google.com/search?q={query}&tbm=isch"
# 打开网页
driver.get(url)
# 滚动页面以加载更多图像
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# 提取图像URL
image_urls = []
images = driver.find_elements(By.CSS_SELECTOR, 'img.rg_i')
for img in images:
img_url = img.get_attribute('src')
if img_url and img_url.startswith('http'):
image_urls.append(img_url)
# 关闭WebDriver
driver.quit()
return image_urls
# 输入关键词
keyword = input("请输入搜索关键词: ")
# 获取图像URL
image_urls = google_images_search_selenium(keyword)
# 打印图像URL
for i, url in enumerate(image_urls, 1):
print(f"图像 {i}: {url}")
上面代码的核心目的就是实现对于执行关键词进行检索,得到搜索结果对应图像的urls数据,接下来我们就需要遍历前面得到的urls集合来下载对应的图像数据。
python提供了很多好用的内置库和第三方库,能够帮助我们实现快捷便利的图像数据下载操作,当然了不是只能下载图像数据,这里因为我的目的是为了获取指定关键词下的图像数据,所以开发演示也都是以图像为例进行说明的。
方法1: 使用 urllib
模块
urllib
是Python标准库中用于处理URL的模块。
import urllib.request
data_url = "https://example.com/image.jpg"
save_path = "downloaded_image.jpg"
# 下载图像并保存到本地
urllib.request.urlretrieve(data_url, save_path)
print(f"图像已下载并保存为 {save_path}")
方法2: 使用 requests
库
requests
是一个非常流行的第三方库,用于发送HTTP请求。
import requests
data_url = "https://example.com/image.jpg"
save_path = "downloaded_image.jpg"
# 发送GET请求下载图像
response = requests.get(data_url)
# 检查请求是否成功
if response.status_code == 200:
with open(save_path, 'wb') as file:
file.write(response.content)
print(f"图像已下载并保存为 {save_path}")
else:
print(f"下载失败,状态码: {response.status_code}")
方法3: 使用 wget
库
wget
是一个第三方库,专门用于下载文件。
import wget
data_url = "https://example.com/image.jpg"
save_path = "downloaded_image.jpg"
# 下载图像并保存到本地
wget.download(data_url, out=save_path)
print(f"\n图像已下载并保存为 {save_path}")
方法4: 使用 Pillow
库
Pillow
是一个强大的图像处理库,也可以用于下载和保存图像。
from PIL import Image
from io import BytesIO
import requests
data_url = "https://example.com/image.jpg"
save_path = "downloaded_image.jpg"
# 发送GET请求下载图像
response = requests.get(data_url)
# 检查请求是否成功
if response.status_code == 200:
# 使用Pillow打开图像
image = Image.open(BytesIO(response.content))
# 保存图像到本地
image.save(save_path)
print(f"图像已下载并保存为 {save_path}")
else:
print(f"下载失败,状态码: {response.status_code}")
方法5: 使用 os
和 urllib
模块
这种方法结合了 os
模块来处理文件路径和 urllib
模块来下载图像。
import os
import urllib.request
data_url = "https://example.com/image.jpg"
save_path = os.path.join(os.getcwd(), "downloaded_image.jpg")
# 下载图像并保存到本地
urllib.request.urlretrieve(data_url, save_path)
print(f"图像已下载并保存为 {save_path}")
方法6: 使用 asyncio
和 aiohttp
库
如果你需要异步下载图像,可以使用 asyncio
和 aiohttp
库。
import aiohttp
import asyncio
async def download_image(url, save_path):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status == 200:
with open(save_path, 'wb') as file:
while True:
chunk = await response.content.read(1024)
if not chunk:
break
file.write(chunk)
print(f"图像已下载并保存为 {save_path}")
else:
print(f"下载失败,状态码: {response.status}")
data_url = "https://example.com/image.jpg"
save_path = "downloaded_image.jpg"
# 运行异步任务
asyncio.run(download_image(data_url, save_path))
上面几种方法都可以实现对目标链接图像数据的下载存储,当然了也不仅局限上面的几种方法,还有其他的方法就不再一一列举了,大家可以根据自己的实际需要,自由选择组合就可以很快的实现自己的数据采集器了。