本文目录导读:

Python + requests/BeautifulSoup 方案
import requests
from bs4 import BeautifulSoup
import os
import random
import time
def download_wallpaper(url, save_path='wallpapers'):
"""
从壁纸网站下载图片
"""
# 创建保存目录
if not os.path.exists(save_path):
os.makedirs(save_path)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://wallhaven.cc'
}
try:
# 发送请求
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
# 确保保存的文件路径
filename = f"{int(time.time())}_{random.randint(1000,9999)}.jpg"
filepath = os.path.join(save_path, filename)
# 保存图片
with open(filepath, 'wb') as f:
f.write(response.content)
print(f"✓ 下载成功: {filename}")
return filepath
except Exception as e:
print(f"✗ 下载失败: {e}")
return None
def scrape_wallhaven(keyword='nature', pages=3):
"""
从Wallhaven搜索并下载壁纸
"""
base_url = f"https://wallhaven.cc/search?q={keyword}&categories=111&purity=100&sorting=random&order=desc"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
for page in range(1, pages+1):
url = f"{base_url}&page={page}"
print(f"正在获取第 {page} 页...")
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 找所有壁纸链接
img_links = soup.select('a.preview')
for link in img_links:
if 'href' in link.attrs:
detail_url = link['href']
# 获取实际图片URL
img_response = requests.get(detail_url, headers=headers)
img_soup = BeautifulSoup(img_response.text, 'html.parser')
img_tag = img_soup.select_one('img#wallpaper')
if img_tag and 'src' in img_tag.attrs:
download_wallpaper(img_tag['src'])
time.sleep(1) # 避免请求过快
# 使用示例
# scrape_wallhaven(keyword='mountain', pages=2)
Bash 脚本方案(使用 curl/wget)
#!/bin/bash
# 壁纸下载脚本
SAVE_DIR="./wallpapers"
mkdir -p "$SAVE_DIR"
download_from_unsplash() {
# Unsplash 随机壁纸
echo "正在从 Unsplash 下载..."
for i in {1..5}; do
curl -L "https://source.unsplash.com/1920x1080/?nature,landscape" \
-o "$SAVE_DIR/wallpaper_$i.jpg" \
-H "Accept: image/jpeg" \
-s
echo "✓ 下载壁纸 $i"
sleep 2
done
}
download_from_picsum() {
# Lorem Picsum 随机图片
echo "正在从 Lorem Picsum 下载..."
for i in {1..3}; do
curl -L "https://picsum.photos/1920/1080?random=$i" \
-o "$SAVE_DIR/picsum_$i.jpg" \
-s
echo "✓ 下载图片 $i"
sleep 1
done
}
download_from_wallpapercave() {
# WallpaperCave 特定类别
echo "正在从 WallpaperCave 下载..."
PAGE=$(curl -s "https://wallpapercave.com/nature-wallpapers" | \
grep -oP 'href="[^"]*\.jpg"' -m 10 | cut -d'"' -f2)
i=1
for img_url in $PAGE; do
# 补全URL
full_url="https://wallpapercave.com$img_url"
curl -L "$full_url" -o "$SAVE_DIR/wallpapercave_$i.jpg" -s
echo "✓ 下载壁纸 $i"
((i++))
sleep 1
done
}
# 主函数
echo "=== 开始下载壁纸 ==="
case "$1" in
"unsplash")
download_from_unsplash
;;
"picsum")
download_from_picsum
;;
"cave")
download_from_wallpapercave
;;
*)
echo "用法: $0 {unsplash|picsum|cave}"
exit 1
;;
esac
echo "=== 壁纸下载完成,保存在 $SAVE_DIR ==="
Node.js 方案
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const cheerio = require('cheerio');
async function downloadWallpapers(keyword = 'landscape', count = 5) {
const headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
};
const saveDir = './wallpapers';
if (!fs.existsSync(saveDir)) {
fs.mkdirSync(saveDir, { recursive: true });
}
try {
// 从 Wallhaven 获取
const response = await axios.get(
`https://wallhaven.cc/search?q=${keyword}&sorting=random&order=desc`,
{ headers }
);
const $ = cheerio.load(response.data);
const links = [];
$('a.preview').each((i, elem) => {
if (i < count) {
links.push($(elem).attr('href'));
}
});
// 下载每个链接的高清图片
for (const link of links) {
const detailResponse = await axios.get(link, { headers });
const detailPage = cheerio.load(detailResponse.data);
const imgUrl = detailPage('img#wallpaper').attr('src');
if (imgUrl) {
const imgResponse = await axios.get(imgUrl, {
headers,
responseType: 'stream'
});
const filename = `${keyword}_${Date.now()}_${Math.random().toString(36).slice(2)}.jpg`;
const filepath = path.join(saveDir, filename);
const writer = fs.createWriteStream(filepath);
imgResponse.data.pipe(writer);
await new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
console.log(`✓ 下载完成: ${filename}`);
await sleep(1000);
}
}
} catch (error) {
console.error('下载失败:', error);
}
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// 使用示例
downloadWallpapers('nature', 10);
简易 Python 版本(适合快速使用)
import requests
import os
import urllib.parse
def quick_download(count=5):
"""快速下载随机壁纸"""
save_dir = "quick_wallpapers"
os.makedirs(save_dir, exist_ok=True)
# 使用 Lorem Picsum(无需解析HTML)
for i in range(count):
url = f"https://picsum.photos/1920/1080?random={i}"
response = requests.get(url)
filename = f"wallpaper_{i+1}.jpg"
with open(os.path.join(save_dir, filename), 'wb') as f:
f.write(response.content)
print(f"✓ 下载: {filename}")
# 运行
quick_download(10)
使用说明
-
安装依赖:
- Python:
pip install requests beautifulsoup4 - Node.js:
npm install axios cheerio
- Python:
-
常见壁纸网站:
- WallHaven: https://wallhaven.cc
- Unsplash: https://unsplash.com
- Pexels: https://www.pexels.com
- Bing壁纸: https://cn.bing.com/images/trending
-
注意事项:
- 遵守网站robots.txt规则
- 控制请求频率,避免被封IP
- 尊重版权,仅用于个人使用
需要我帮你定制特定网站或特定需求的爬虫脚本吗?