1、导包

import requests
from lxml import etree
import os

2、定义一个用于网络请求的 URL 和 headers
设置 'User-Agent' 是为了模拟浏览器行为,避免因为服务器有防爬策略而被拒绝访问。

url = 'http://pic.netbian.com/4kdongman/'
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'}

3、定义一个获取壁纸的函数 get_img

get_img 函数接收一个参数 img_url ,这个参数应该是一个图片的 URL。然后,函数使用 requests.get 方法获取 URL 对应的网页内容,其中 headers 参数用于设置 HTTP 请求头,模拟浏览器行为。获取到的网页内容通过 decode('gbk') 解码为字符串,然后使用 etree.HTML 将其解析为一个 HTML 对象。

接下来,使用 xpath 方法从 HTML 对象中提取出所有满足条件的图片链接,条件是图片属于 ID 为 "main" 的 div 下的 class 为 "slist" 的 div 下的 ul 下的 li 下的 a 下的 img,并且提取的是 src 属性的值。提取到的图片链接存储在 img_path 列表中。

遍历 img_path 列表中的每个图片链接,将其拼接为完整的 URL,然后调用 download 函数下载图片。

def get_img(img_url):
    response = requests.get(url=img_url, headers=headers)
    html = response.content.decode('gbk')
    tree = etree.HTML(html)
    img_path=tree.xpath('//div[@id="main"]/div[@class="slist"]/ul/li/a/img/@src')
    cout=1
    for img in img_path:
        img ='http://pic.netbian.com' + img
        download(img,cout)
        cout+=1
def download(img,cout):
    response = requests.get(url=img, headers=headers)
    pic=response.content
    try:
        with open('{}.jpg'.format(cout), 'wb') as f:
            f.write(pic)
            print('{}.jpg-----下载成功'.format(cout))
    except:
        print('下载失败!')

4 、定义了一个名为 main 的函数,该函数首先通过 requests.get 方法获取一个网页的内容,然后使用 etree.HTML 将网页内容解析为一个 HTML 对象。然后,使用 xpath 方法从 HTML 对象中提取出壁纸页数。

def main():
    # 启始 url
    url = 'http://pic.netbian.com/4kdongman/'
    req = requests.get(url, headers=headers)
    html = req.content.decode('gbk')
    # print(html)
    tree = etree.HTML(html)
    # 提取壁纸页数
    num = tree.xpath('//div[@class="page"]/a[last() - 1]/text()')[0]
    for i in range(int(num)):
        # 创建目录用于下载
        path = 'C:\\Users\\86198\\Pictures\\Camera Roll\\第{}页\\'.format(i + 1)
        if not os.path.exists(path):
            os.makedirs(path)
        # 改变当前工作目录
        os.chdir(path)
        print('----------第{}页---------正在下载-----'.format(i + 1))
        img_url = url + 'index_{}.html'.format(i + 1)
        if i == 0:
            img_url = url
        # print(img_url)
        # 获取图片链接
        get_img(img_url)
if __name__ == '__main__':
    main()

5、完整代码

import requests
from lxml import etree
import os
url = 'http://pic.netbian.com/4kdongman/'
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'}
def get_img(img_url):
    response = requests.get(url=img_url, headers=headers)
    html = response.content.decode('gbk')
    tree = etree.HTML(html)
    img_path=tree.xpath('//div[@id="main"]/div[@class="slist"]/ul/li/a/img/@src')
    cout=1
    for img in img_path:
        img ='http://pic.netbian.com' + img
        download(img,cout)
        cout+=1
def download(img,cout):
    response = requests.get(url=img, headers=headers)
    pic=response.content
    try:
        with open('{}.jpg'.format(cout), 'wb') as f:
            f.write(pic)
            print('{}.jpg-----下载成功'.format(cout))
    except:
        print('下载失败!')
def main():
    # 启始 url
    url = 'http://pic.netbian.com/4kdongman/'
    req = requests.get(url, headers=headers)
    html = req.content.decode('gbk')
    # print(html)
    tree = etree.HTML(html)
    # 提取壁纸页数
    num = tree.xpath('//div[@class="page"]/a[last() - 1]/text()')[0]
    for i in range(int(num)):
        # 创建目录用于下载
        path = 'C:\\Users\\86198\\Pictures\\Camera Roll\\第{}页\\'.format(i + 1)
        if not os.path.exists(path):
            os.makedirs(path)
        # 改变当前工作目录
        os.chdir(path)
        print('----------第{}页---------正在下载-----'.format(i + 1))
        img_url = url + 'index_{}.html'.format(i + 1)
        if i == 0:
            img_url = url
        # print(img_url)
        # 获取图片链接
        get_img(img_url)
if __name__ == '__main__':
    main()