一、项目介绍

本项目实现:

  • 自动爬取多页壁纸图片
  • 随机 UA 伪装,避免被网站拦截
  • 自动创建文件夹保存图片
  • 自动编号,不重复、不覆盖
  • 代码极简、可直接复制运行

二、环境准备(必装,一步到位)​

运行代码前,只需安装 3 个基础库(1 个系统自带),无需复杂配置,复制命令直接安装,避开所有安装坑:​

  • requests:核心库,负责发送网络请求,获取网页内容和图片数据​
  • lxml:解析 HTML 网页,用 XPath 精准提取图片链接,爬虫解析必备​
  • fake_useragent:随机生成浏览器 UA 标识,防反爬关键,避免被网站拦截​
  • os:系统自带库,无需安装,负责创建保存文件夹、判断文件路径​

安装命令(复制到终端,回车即可,建议用清华源提速,避免安装超时):​

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install fake_useragent -i https://pypi.tuna.tsinghua.edu.cn/simple

三、逐行代码超详细解析

很多新手复制代码能运行,但不知道原理,这里逐行拆解每一段代码,讲清底层逻辑,看完就能举一反三,轻松应对其他图片爬虫项目!​

1. 导入模块

python

import fake_useragent
import requests
from lxml import etree
import os

解析:每个库的核心作用,新手不用死记硬背,知道用途即可快速上手:​

  • fake_useragent:生成随机浏览器标识,模拟真人访问,避免被网站识别为爬虫、拦截 IP​
  • requests:爬虫核心库,负责向目标网站发送网络请求,获取网页源码和图片二进制数据​
  • lxml.etree:解析 HTML 网页内容,用 XPath 语法快速定位、提取我们需要的图片链接​
  • os:系统自带库,无需额外安装,负责创建图片保存文件夹、判断文件路径,避免保存时因路径不存在报错​

2. 图片自动编号(避免重名覆盖)​

python

n = 0
def count():
    global n
    n += 1
    return n

解析:定义全局计数器n,搭配count()函数,每下载一张图片,编号自动 + 1,保存为 1.jpg、2.jpg、3.jpg...,彻底解决图片重名、覆盖的问题,让保存的壁纸更规范,无需手动整理。​

3. 自动创建保存目录

python

if not os.path.exists("./Picture"):
    os.mkdir("./Picture")

解析:判断当前 Python 项目目录下,是否存在 “Picture” 文件夹;如果不存在,自动创建该文件夹,避免后续保存图片时,因路径不存在报错​

4. UA 伪装

python

head = {
    "User-Agent": fake_useragent.UserAgent().random
}

解析:爬虫必备的防反爬手段!如果不添加 UA 伪装,网站会直接识别出请求来自 Python 程序,进而拦截请求,导致爬不出任何内容;用fake_useragent库,每次运行代码都会生成随机的浏览器标识,完美模拟真人浏览行为,大大降低被拦截的概率。​

5. 循环爬取多页

python

for i in range(1, 3):
    url = f'https://10wallpaper.com/List_wallpapers/page/{i}'

解析:range(1, 3) 表示爬取第 1 页和第 2 页壁纸;如果想多爬几页,直接修改 range 范围即可(比如爬 10 页改成range(1, 11)),新手可根据自己的需求灵活调整,操作极简。​

6. 请求网页 + 解析 HTML

python

resp = requests.get(url, headers=head)
result = resp.text
tree = etree.HTML(result)

解析:这三步是爬虫获取数据的核心,一步都不能少:​

  • requests.get(url, headers=head):向目标网页发送 GET 请求,带上 UA 伪装,获取网页完整源码​
  • resp.text:将获取到的网页响应,转为字符串格式的 HTML 源码,方便后续解析​
  • etree.HTML(result):将字符串格式的源码,转为可使用 XPath 解析的对象,为提取图片链接做准备​

7. XPath 定位图片

python

p_list = tree.xpath("//div[@id='pics-list']/p")

解析:这是精准提取图片的关键一步!通过 XPath 语法,定位到 “id 为 pics-list 的 div 标签” 下的所有 p 标签,这些 p 标签里面,就包含了我们需要的壁纸图片链接,新手无需修改,直接复用即可,确保定位精准不报错。​

8. 提取图片链接并拼接完整地址

python

img_url = p.xpath("./a/img/@src")[0]
img_url2 = 'https://10wallpaper.com' + img_url

解析:新手最容易踩的坑就在这里,一定要注意!​

  • p.xpath("./a/img/@src")[0]:从每个 p 标签中,提取里面 a 标签下 img 标签的 src 属性(也就是图片链接),但这里提取到的是 “相对路径”(比如/wallpaper/xxx.jpg),无法直接用于下载​
  • img_url2 = 'https://10wallpaper.com' + img_url:将相对路径拼接上 10wallpaper 网站的主域名,得到完整的图片 URL,只有完整 URL 才能正常下载图片,缺一不可!​

9. 下载并保存图片

python

print("正在下载:", img_url2)
img_name = count()
img_resp = requests.get(img_url2, headers=head)
with open(f"./Picture/{img_name}.jpg", "wb") as fp:
    fp.write(img_resp.content)

解析:这是壁纸下载的最终步骤,每一步都有明确作用,新手必懂:​

  • print("正在下载:", img_url2):在终端实时显示当前下载的图片链接,方便查看下载进度,也能快速排查链接是否无效​
  • img_name = count():调用计数函数,获取当前图片的编号,作为图片保存的文件名​
  • img_resp = requests.get(img_url2, headers=head):向完整的图片 URL 发送请求,获取图片的二进制数据(图片、视频等资源,均以二进制形式存在)​
  • with open(...) as fp:用 “自动关闭文件” 的方式打开文件,避免手动关闭文件导致的资源泄露,更安全、更省心​
  • wb:二进制写入模式,必须用这个模式保存图片,若用w文本模式,会导致图片损坏、无法打开(新手必记!)​
  • fp.write(img_resp.content):将获取到的图片二进制数据,写入到本地 Picture 文件夹中,完成壁纸下载​

四、运行效果

运行代码后,终端会实时显示下载进度,清晰明了,如下所示:​

打开你的 Python 项目目录,找到自动创建的「Picture」文件夹,里面就是所有下载好的高清壁纸。

五、完整可运行代码(复制即生效,新手零报错)​

无需修改任何内容,复制到 Python 编辑器(PyCharm即可),直接运行

python

# 导入需要的库(新手无需修改)
import fake_useragent
import requests
from lxml import etree
import os

# 全局计数器,给图片自动编号(防止重名覆盖)
n = 0
def count():
    global n
    n += 1
    return n

# 自动创建图片保存文件夹(不存在则创建,避免报错)
if not os.path.exists("./Picture"):
    os.mkdir("./Picture")

# 随机UA伪装,模拟真实浏览器,避免被网站拦截(爬虫核心防反爬)
head = {
    "User-Agent": fake_useragent.UserAgent().random
}

# 爬取第1-2页(想多爬几页,直接修改range范围即可)
for i in range(1, 3):
    # 拼接每页的URL地址
    url = f'https://10wallpaper.com/List_wallpapers/page/{i}'
    # 发送请求,获取网页源码
    resp = requests.get(url, headers=head)
    result = resp.text
    # 解析网页,准备提取图片链接
    tree = etree.HTML(result)

    # XPath定位所有图片所在的标签(精准定位,避免爬取失败)
    p_list = tree.xpath("//div[@id='pics-list']/p")

    # 遍历每个图片标签,提取链接并下载
    for p in p_list:
        # 提取图片相对路径
        img_url = p.xpath("./a/img/@src")[0]
        # 拼接完整的图片URL(关键一步,否则无法下载)
        img_url2 = 'https://10wallpaper.com' + img_url

        print("正在下载:", img_url2)
        # 获取图片编号
        img_name = count()

        # 下载图片数据
        img_resp = requests.get(img_url2, headers=head)

        # 二进制模式保存图片到本地文件夹
        with open(f"./Picture/{img_name}.jpg", "wb") as fp:
            fp.write(img_resp.content)

print("🎉 所有图片下载完成!请到 Picture 文件夹查看~")

更多推荐